diff options
123 files changed, 1887 insertions, 1093 deletions
diff --git a/api/current.txt b/api/current.txt index 3ec7f447e8b9..9c90ee67cdf7 100644 --- a/api/current.txt +++ b/api/current.txt @@ -47843,6 +47843,7 @@ package android.util { field public static final int DENSITY_400 = 400; // 0x190 field public static final int DENSITY_420 = 420; // 0x1a4 field public static final int DENSITY_440 = 440; // 0x1b8 + field public static final int DENSITY_450 = 450; // 0x1c2 field public static final int DENSITY_560 = 560; // 0x230 field public static final int DENSITY_600 = 600; // 0x258 field public static final int DENSITY_DEFAULT = 160; // 0xa0 diff --git a/cmds/incident_helper/src/main.cpp b/cmds/incident_helper/src/main.cpp index 809a77163fb4..ff5fd86cf11e 100644 --- a/cmds/incident_helper/src/main.cpp +++ b/cmds/incident_helper/src/main.cpp @@ -72,6 +72,8 @@ static TextParserBase* selectParser(int section) { return new PsParser(); case 2006: return new BatteryTypeParser(); + case 3026: // system_trace is already a serialized protobuf + return new NoopParser(); default: // Return no op parser when no specific ones are implemented. return new NoopParser(); diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp index 85c5a20174c3..1572114c639f 100644 --- a/cmds/incidentd/src/Section.cpp +++ b/cmds/incidentd/src/Section.cpp @@ -67,6 +67,8 @@ bool section_requires_specific_mention(int sectionId) { switch (sectionId) { case 3025: // restricted_images return true; + case 3026: // system_trace + return true; default: return false; } diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 495a09f2e99a..e9208437ff07 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -303,6 +303,8 @@ message Atom { ContentCaptureSessionEvents content_capture_session_events = 208; ContentCaptureFlushed content_capture_flushed = 209; LocationManagerApiUsageReported location_manager_api_usage_reported = 210; + ReviewPermissionsFragmentResultReported review_permissions_fragment_result_reported + = 211 [(log_from_module) = "permissioncontroller"]; } // Pulled events will start at field 10000. @@ -6544,3 +6546,24 @@ message LocationManagerApiUsageReported { // Categorized to 3 types that are interesting from location's perspective. optional android.stats.location.ActivityImportance activiy_importance = 12; } + +/** + * Information about a permission grant or denial made by user inside ReviewPermissionsFragment + */ +message ReviewPermissionsFragmentResultReported { + // unique value identifying a permission group change. A permission group change might result + // in multiple of these atoms + optional int64 change_id = 1; + + // UID of package the permission belongs to + optional int32 uid = 2 [(is_uid) = true]; + + // Name of package the permission belongs to + optional string package_name = 3; + + // The permission to be granted + optional string permission_name = 4; + + // The result of the permission grant + optional bool permission_granted = 5; +} diff --git a/config/dirty-image-objects b/config/dirty-image-objects index 9e2230b288c8..ec2568dc4ad8 100644 --- a/config/dirty-image-objects +++ b/config/dirty-image-objects @@ -28,147 +28,359 @@ # Then, grep for lines containing "Private dirty object" from the output. # This particular file was generated by dumping systemserver and systemui. # -java.lang.System -java.net.Inet4Address -java.lang.Thread -java.lang.Throwable -java.util.Collections -javax.net.ssl.SSLContext -java.nio.charset.Charset -java.security.Provider -javax.net.ssl.HttpsURLConnection -javax.net.ssl.SSLSocketFactory -java.util.TimeZone -java.util.Locale -java.util.function.ToIntFunction -sun.misc.FormattedFloatingDecimal -java.util.stream.IntStream -android.icu.util.TimeZone -org.apache.harmony.luni.internal.util.TimezoneGetter -dalvik.system.SocketTagger -dalvik.system.CloseGuard -java.lang.ref.FinalizerReference -com.android.org.conscrypt.ct.CTLogStoreImpl -com.android.org.conscrypt.SSLParametersImpl -com.android.org.conscrypt.OpenSSLContextImpl -com.android.org.conscrypt.SSLParametersImpl$AliasChooser -com.android.org.conscrypt.SSLParametersImpl$PSKCallbacks -com.android.org.conscrypt.NativeCrypto$SSLHandshakeCallbacks -com.android.okhttp.OkHttpClient -com.android.okhttp.okio.SegmentPool -com.android.okhttp.okio.AsyncTimeout -com.android.okhttp.HttpUrl -android.os.StrictMode -com.android.internal.os.BinderInternal -android.os.storage.StorageManager -android.os.Trace +android.accounts.Account +android.accounts.OnAccountsUpdateListener +android.animation.LayoutTransition android.app.ActivityManager -android.media.MediaRouter -android.os.Environment -android.view.ThreadedRenderer -android.media.AudioManager -android.app.AlarmManager -android.telephony.TelephonyManager -android.bluetooth.BluetoothAdapter -com.android.internal.os.SomeArgs -android.os.LocaleList -android.view.WindowManagerGlobal -android.media.AudioSystem -android.ddm.DdmHandleAppName -android.provider.Settings -android.view.ViewRootImpl -android.net.ConnectivityManager +android.app.ActivityManager$OnUidImportanceListener +android.app.ActivityTaskManager android.app.ActivityThread -android.os.BaseBundle -android.util.ArraySet -android.view.View -android.os.ServiceManager -android.view.ViewTreeObserver -android.hardware.input.InputManager -android.os.UEventObserver -android.app.NotificationManager -android.hardware.display.DisplayManagerGlobal -android.os.Binder +android.app.admin.DevicePolicyManager +android.app.AlarmManager +android.app.Application android.app.AppOpsManager -android.content.ContentResolver android.app.backup.BackupManager -android.util.ArrayMap -android.os.Looper -android.graphics.Bitmap -android.view.textservice.TextServicesManager -com.android.internal.inputmethod.InputMethodUtils +android.app.ContextImpl +android.app.INotificationManager +android.app.Notification$BigPictureStyle +android.app.Notification$BigTextStyle +android.app.Notification$InboxStyle +android.app.NotificationChannel +android.app.NotificationChannelGroup +android.app.NotificationManager +android.app.PendingIntent +android.app.PendingIntent$OnFinished android.app.QueuedWork -android.graphics.TemporaryBuffer -android.widget.ImageView +android.app.ResourcesManager +android.app.WallpaperManager +android.app.WindowConfiguration +android.bluetooth.BluetoothAdapter +android.bluetooth.BluetoothDevice +android.bluetooth.BluetoothProfile +android.bluetooth.IBluetoothA2dp +android.bluetooth.IBluetoothHeadsetPhone +android.bluetooth.IBluetoothHidDevice +android.bluetooth.IBluetoothHidHost +android.bluetooth.IBluetoothMap +android.bluetooth.IBluetoothPan +android.bluetooth.IBluetoothPbap +android.bluetooth.IBluetoothSap +android.content.ClipboardManager$OnPrimaryClipChangedListener +android.content.ComponentName +android.content.ContentProvider$PipeDataWriter +android.content.ContentResolver +android.content.Context +android.content.Intent +android.content.pm.PackageManager$OnPermissionsChangedListener +android.content.pm.VersionedPackage +android.content.res.Configuration +android.content.SharedPreferences$OnSharedPreferenceChangeListener +android.database.CursorWindow +android.database.sqlite.SQLiteCompatibilityWalFlags +android.database.sqlite.SQLiteDatabase$CursorFactory android.database.sqlite.SQLiteGlobal -android.view.autofill.Helper -android.text.method.SingleLineTransformationMethod -com.android.internal.os.RuntimeInit -android.view.inputmethod.InputMethodManager +android.database.sqlite.SQLiteTransactionListener +android.ddm.DdmHandleAppName +android.graphics.Bitmap +android.graphics.Canvas +android.graphics.drawable.AdaptiveIconDrawable +android.graphics.drawable.ColorDrawable +android.graphics.drawable.GradientDrawable +android.graphics.drawable.Icon +android.graphics.drawable.InsetDrawable +android.graphics.drawable.RippleDrawable +android.graphics.drawable.VectorDrawable$VGroup +android.graphics.ImageDecoder +android.graphics.Rect +android.graphics.TemporaryBuffer +android.hardware.biometrics.BiometricSourceType +android.hardware.display.ColorDisplayManager$ColorDisplayManagerInternal +android.hardware.display.DisplayManagerGlobal +android.hardware.display.NightDisplayListener$Callback +android.hardware.input.InputManager +android.hardware.input.InputManager$InputDeviceListener +android.hardware.SensorPrivacyManager android.hardware.SystemSensorManager -android.database.CursorWindow -android.text.TextUtils +android.icu.impl.OlsonTimeZone +android.icu.text.BreakIterator +android.icu.text.Collator +android.icu.text.DateFormat$BooleanAttribute +android.icu.text.DateTimePatternGenerator$DTPGflags +android.icu.text.PluralRules$Operand +android.icu.util.TimeZone +android.location.GpsStatus$Listener +android.location.LocationListener +android.media.AudioManager +android.media.MediaRouter android.media.PlayerBase -android.app.ResourcesManager -android.os.Message -android.view.accessibility.AccessibilityManager -android.app.Notification -android.provider.ContactsContract$ContactNameColumns -android.provider.CalendarContract$EventsColumns -android.provider.CalendarContract$CalendarColumns -android.provider.CalendarContract$SyncColumns -android.provider.ContactsContract$ContactsColumns -android.content.pm.PackageManager$OnPermissionsChangedListener -android.net.IpConfiguration$ProxySettings -android.provider.ContactsContract$ContactOptionsColumns -android.net.wifi.SupplicantState -android.provider.ContactsContract$ContactStatusColumns -android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener -android.provider.CalendarContract$CalendarSyncColumns -android.bluetooth.BluetoothProfile$ServiceListener -android.provider.ContactsContract$ContactCounts +android.media.session.MediaSessionManager +android.net.apf.ApfCapabilities +android.net.ConnectivityManager +android.net.ConnectivityManager$OnNetworkActiveListener +android.net.ConnectivityThread$Singleton android.net.IpConfiguration$IpAssignment -android.text.TextWatcher -android.graphics.Bitmap$CompressFormat -android.location.LocationListener -sun.security.jca.Providers -java.lang.CharSequence -android.icu.util.ULocale -dalvik.system.BaseDexClassLoader -android.icu.text.BreakIterator -libcore.net.NetworkSecurityPolicy -android.icu.text.UnicodeSet -com.android.org.conscrypt.TrustedCertificateStore$PreloadHolder -android.app.SearchManager -android.os.Build -android.app.ContextImpl -android.app.WallpaperManager -android.security.net.config.ApplicationConfig -android.animation.LayoutTransition -android.widget.TextView -com.android.internal.logging.MetricsLogger -android.renderscript.RenderScriptCacheDir -android.os.Process +android.net.IpConfiguration$ProxySettings +android.net.IpPrefix +android.net.LinkAddress +android.net.LinkProperties +android.net.Network +android.net.NetworkCapabilities +android.net.NetworkInfo +android.net.NetworkInfo$State +android.net.NetworkRequest +android.net.NetworkRequest$Type +android.net.RouteInfo +android.net.StringNetworkSpecifier +android.net.TrafficStats +android.net.UidRange +android.net.Uri$HierarchicalUri +android.net.Uri$StringUri +android.net.wifi.WifiManager +android.net.wifi.WifiManager$SoftApCallback +android.os.AsyncResult +android.os.AsyncTask +android.os.BinderProxy +android.os.Bundle +android.os.DeadObjectException +android.os.Environment +android.os.FileObserver android.os.Handler -android.content.Context -android.graphics.drawable.AdaptiveIconDrawable +android.os.IDeviceIdleController +android.os.LocaleList +android.os.Looper +android.os.Message +android.os.ParcelUuid +android.os.Process +android.os.RecoverySystem +android.os.ServiceManager +android.os.storage.StorageManager +android.os.StrictMode +android.os.Trace +android.os.WorkSource +android.os.WorkSource$WorkChain +android.permission.PermissionManager android.provider.FontsContract -android.text.style.SuggestionSpan -android.graphics.drawable.VectorDrawable$VGroup -android.view.ViewStub -android.text.style.MetricAffectingSpan -android.content.SharedPreferences$OnSharedPreferenceChangeListener -android.app.PendingIntent +android.provider.Settings$SettingNotFoundException +android.renderscript.RenderScriptCacheDir +android.security.IKeyChainService +android.security.keystore.AndroidKeyStoreProvider +android.security.net.config.ApplicationConfig +android.security.net.config.SystemCertificateSource$NoPreloadHolder +android.telecom.PhoneAccountHandle +android.telephony.AnomalyReporter +android.telephony.CellSignalStrengthCdma +android.telephony.CellSignalStrengthGsm +android.telephony.CellSignalStrengthLte +android.telephony.CellSignalStrengthNr +android.telephony.CellSignalStrengthTdscdma +android.telephony.CellSignalStrengthWcdma +android.telephony.DataSpecificRegistrationInfo +android.telephony.emergency.EmergencyNumber +android.telephony.ims.ImsMmTelManager$CapabilityCallback$CapabilityBinder +android.telephony.ims.ImsMmTelManager$RegistrationCallback$RegistrationBinder +android.telephony.ims.ImsReasonInfo +android.telephony.ims.ProvisioningManager$Callback$CallbackBinder +android.telephony.ModemActivityInfo +android.telephony.ModemInfo +android.telephony.NetworkRegistrationInfo +android.telephony.NetworkService +android.telephony.TelephonyManager +android.telephony.VoiceSpecificRegistrationInfo +android.text.format.DateFormat +android.text.method.SingleLineTransformationMethod +android.text.Selection$MemoryTextWatcher android.text.SpanWatcher -android.widget.FrameLayout -android.net.NetworkRequest$Type -android.net.NetworkInfo$State -android.graphics.drawable.GradientDrawable android.text.style.AlignmentSpan -android.widget.LinearLayout android.text.style.CharacterStyle -android.view.View$OnApplyWindowInsetsListener -android.view.MenuItem +android.text.style.LeadingMarginSpan +android.text.style.LineBackgroundSpan +android.text.style.LineHeightSpan +android.text.style.MetricAffectingSpan android.text.style.ReplacementSpan -android.graphics.drawable.Icon +android.text.style.SuggestionSpan +android.text.style.TabStopSpan +android.text.TextUtils +android.text.TextWatcher +android.transition.ChangeClipBounds +android.transition.ChangeImageTransform +android.transition.ChangeTransform +android.util.ArrayMap +android.util.ArraySet +android.util.DisplayMetrics +android.util.EventLog +android.util.Log +android.util.Patterns +android.view.AbsSavedState$1 +android.view.accessibility.AccessibilityManager +android.view.accessibility.AccessibilityManager$AccessibilityServicesStateChangeListener +android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener +android.view.accessibility.AccessibilityNodeIdManager +android.view.autofill.AutofillManager +android.view.autofill.Helper +android.view.Choreographer +android.view.inputmethod.InputMethodManager +android.view.IWindowManager +android.view.PointerIcon +android.view.RemoteAnimationAdapter +android.view.ThreadedRenderer +android.view.View +android.view.View$OnHoverListener +android.view.ViewRootImpl +android.view.ViewStub +android.view.ViewStub$OnInflateListener +android.view.ViewTreeObserver +android.view.WindowManager$LayoutParams +android.view.WindowManagerGlobal +android.widget.ActionMenuPresenter$OverflowMenuButton +android.widget.ActionMenuView android.widget.Button +android.widget.CheckBox +android.widget.FrameLayout +android.widget.ImageButton +android.widget.ImageView +android.widget.LinearLayout +android.widget.RelativeLayout +android.widget.SeekBar +android.widget.Space +android.widget.TextView +android.widget.Toolbar +byte[] +com.android.ims.ImsManager +com.android.internal.logging.MetricsLogger +com.android.internal.os.BackgroundThread +com.android.internal.os.BinderInternal +com.android.internal.os.BinderInternal$BinderProxyLimitListener +com.android.internal.os.RuntimeInit +com.android.internal.os.SomeArgs +com.android.internal.policy.DecorView +com.android.internal.statusbar.IStatusBarService +com.android.internal.telephony.AppSmsManager +com.android.internal.telephony.CallerInfoAsyncQuery$OnQueryCompleteListener +com.android.internal.telephony.CarrierActionAgent +com.android.internal.telephony.cat.CatService +com.android.internal.telephony.cat.IconLoader +com.android.internal.telephony.cat.RilMessageDecoder +com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager +com.android.internal.telephony.cdma.EriManager +com.android.internal.telephony.CellularNetworkValidator +com.android.internal.telephony.CommandException +com.android.internal.telephony.dataconnection.DataConnection$DcActivatingState +com.android.internal.telephony.dataconnection.DataConnection$DcActiveState +com.android.internal.telephony.dataconnection.DataConnection$DcInactiveState +com.android.internal.telephony.dataconnection.DataEnabledSettings +com.android.internal.telephony.dataconnection.DcTracker +com.android.internal.telephony.euicc.EuiccCardController +com.android.internal.telephony.euicc.EuiccController +com.android.internal.telephony.GsmAlphabet +com.android.internal.telephony.GsmCdmaCallTracker +com.android.internal.telephony.GsmCdmaPhone +com.android.internal.telephony.IccPhoneBookInterfaceManager +com.android.internal.telephony.IccSmsInterfaceManager +com.android.internal.telephony.ims.ImsResolver +com.android.internal.telephony.imsphone.ImsExternalCallTracker +com.android.internal.telephony.imsphone.ImsPhone +com.android.internal.telephony.imsphone.ImsPhoneCallTracker +com.android.internal.telephony.ims.RcsMessageStoreController +com.android.internal.telephony.IntentBroadcaster +com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy +com.android.internal.telephony.metrics.TelephonyMetrics +com.android.internal.telephony.MultiSimSettingController +com.android.internal.telephony.nano.CarrierIdProto$CarrierAttribute +com.android.internal.telephony.nano.CarrierIdProto$CarrierId +com.android.internal.telephony.nano.TelephonyProto$RilDataCall +com.android.internal.telephony.nano.TelephonyProto$SmsSession$Event +com.android.internal.telephony.nano.TelephonyProto$TelephonyCallSession$Event$RilCall +com.android.internal.telephony.NitzStateMachine +com.android.internal.telephony.PhoneConfigurationManager +com.android.internal.telephony.PhoneFactory +com.android.internal.telephony.PhoneSwitcher +com.android.internal.telephony.ProxyController +com.android.internal.telephony.RadioConfig +com.android.internal.telephony.RIL +com.android.internal.telephony.RILRequest +com.android.internal.telephony.RilWakelockInfo +com.android.internal.telephony.ServiceStateTracker +com.android.internal.telephony.SimActivationTracker +com.android.internal.telephony.SmsApplication +com.android.internal.telephony.SmsBroadcastUndelivered +com.android.internal.telephony.SmsStorageMonitor +com.android.internal.telephony.SmsUsageMonitor +com.android.internal.telephony.SubscriptionController +com.android.internal.telephony.SubscriptionInfoUpdater +com.android.internal.telephony.TelephonyComponentFactory +com.android.internal.telephony.TelephonyDevController +com.android.internal.telephony.TelephonyTester +com.android.internal.telephony.uicc.AdnRecordCache +com.android.internal.telephony.uicc.UiccCardApplication +com.android.internal.telephony.uicc.UiccController +com.android.internal.telephony.uicc.UiccProfile +com.android.internal.telephony.uicc.UiccStateChangedLauncher +com.android.internal.telephony.uicc.UsimFileHandler +com.android.internal.telephony.uicc.VoiceMailConstants +com.android.internal.util.LatencyTracker +com.android.internal.util.StateMachine$SmHandler +com.android.okhttp.OkHttpClient +com.android.okhttp.okio.AsyncTimeout +com.android.okhttp.okio.SegmentPool +com.android.phone.ecc.nano.ProtobufEccData$CountryInfo +com.android.phone.ecc.nano.ProtobufEccData$EccInfo +com.android.server.sip.SipWakeupTimer +com.android.server.SystemConfig +dalvik.system.BaseDexClassLoader +dalvik.system.BlockGuard +dalvik.system.CloseGuard +dalvik.system.RuntimeHooks +dalvik.system.SocketTagger +java.io.BufferedReader +java.lang.AssertionError +java.lang.Boolean +java.lang.Byte +java.lang.Character +java.lang.CharSequence +java.lang.Class +java.lang.IllegalAccessException +java.lang.IllegalStateException +java.lang.NoSuchMethodException +java.lang.NullPointerException +java.lang.Object +java.lang.Object[] +java.lang.ref.FinalizerReference +java.lang.Runnable +java.lang.SecurityException +java.lang.Short +java.lang.String[] +java.lang.System +java.lang.Thread +java.lang.Throwable +java.lang.UnsatisfiedLinkError +java.net.Inet6Address +java.net.Socket +java.net.SocketException +java.nio.Bits +java.nio.charset.Charset +java.security.interfaces.RSAPrivateKey +java.security.Provider +java.util.Collections +java.util.concurrent.Executor +java.util.GregorianCalendar +java.util.Locale +java.util.Locale$NoImagePreloadHolder +java.util.Scanner +java.util.Set +java.util.TimeZone +javax.net.SocketFactory +javax.net.ssl.HttpsURLConnection +javax.net.ssl.HttpsURLConnection$NoPreloadHolder +javax.net.ssl.SSLContext +javax.net.ssl.SSLSessionContext +javax.net.ssl.SSLSocketFactory +libcore.io.Libcore +libcore.io.Memory +libcore.net.NetworkSecurityPolicy +libcore.timezone.TimeZoneFinder +org.apache.http.params.HttpParams +sun.misc.Cleaner +sun.nio.ch.FileChannelImpl +sun.nio.ch.FileChannelImpl$Unmapper +sun.nio.fs.UnixChannelFactory +sun.security.jca.Providers diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index d082f33cdefe..4b9aebd17794 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -6396,6 +6396,7 @@ public class DevicePolicyManager { /** * @hide */ + @UnsupportedAppUsage public @Nullable ComponentName getProfileOwnerAsUser(final int userId) { if (mService != null) { try { diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 666508af0207..672994e79134 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -994,4 +994,9 @@ public abstract class PackageManagerInternal { */ public abstract void setRuntimePermissionsFingerPrint(@NonNull String fingerPrint, @UserIdInt int userId); + + /** + * Migrates legacy obb data to its new location. + */ + public abstract void migrateLegacyObbData(); } diff --git a/core/java/android/net/DnsResolver.java b/core/java/android/net/DnsResolver.java index 7a85dcbfc830..0b1a84534e38 100644 --- a/core/java/android/net/DnsResolver.java +++ b/core/java/android/net/DnsResolver.java @@ -34,6 +34,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.os.CancellationSignal; import android.os.Looper; +import android.os.MessageQueue; import android.system.ErrnoException; import android.util.Log; @@ -466,10 +467,20 @@ public final class DnsResolver { private void registerFDListener(@NonNull Executor executor, @NonNull FileDescriptor queryfd, @NonNull Callback<? super byte[]> answerCallback, @Nullable CancellationSignal cancellationSignal, @NonNull Object lock) { - Looper.getMainLooper().getQueue().addOnFileDescriptorEventListener( + final MessageQueue mainThreadMessageQueue = Looper.getMainLooper().getQueue(); + mainThreadMessageQueue.addOnFileDescriptorEventListener( queryfd, FD_EVENTS, (fd, events) -> { + // b/134310704 + // Unregister fd event listener before resNetworkResult is called to prevent + // race condition caused by fd reused. + // For example when querying v4 and v6, it's possible that the first query ends + // and the fd is closed before the second request starts, which might return + // the same fd for the second request. By that time, the looper must have + // unregistered the fd, otherwise another event listener can't be registered. + mainThreadMessageQueue.removeOnFileDescriptorEventListener(fd); + executor.execute(() -> { DnsResponse resp = null; ErrnoException exception = null; @@ -490,7 +501,11 @@ public final class DnsResolver { } answerCallback.onAnswer(resp.answerbuf, resp.rcode); }); - // Unregister this fd listener + + // The file descriptor has already been unregistered, so it does not really + // matter what is returned here. In spirit 0 (meaning "unregister this FD") + // is still the closest to what the looper needs to do. When returning 0, + // Looper knows to ignore the fd if it has already been unregistered. return 0; }); } diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index 24a147783669..ce1942cc6d91 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -33,11 +33,13 @@ import android.widget.Toast; import dalvik.system.VMRuntime; +import java.io.BufferedReader; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -62,6 +64,7 @@ public class GraphicsEnvironment { private static final String SYSTEM_DRIVER_VERSION_NAME = ""; private static final long SYSTEM_DRIVER_VERSION_CODE = 0; private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; + private static final String PROPERTY_GFX_DRIVER_PRERELEASE = "ro.gfx.driver.1"; private static final String PROPERTY_GFX_DRIVER_BUILD_TIME = "ro.gfx.driver_build_time"; private static final String METADATA_DRIVER_BUILD_TIME = "com.android.gamedriver.build_time"; private static final String ANGLE_RULES_FILE = "a4a_rules.json"; @@ -71,16 +74,19 @@ public class GraphicsEnvironment { "android.app.action.ANGLE_FOR_ANDROID_TOAST_MESSAGE"; private static final String INTENT_KEY_A4A_TOAST_MESSAGE = "A4A Toast Message"; private static final String GAME_DRIVER_WHITELIST_ALL = "*"; + private static final String GAME_DRIVER_SPHAL_LIBRARIES_FILENAME = "sphal_libraries.txt"; private static final int VULKAN_1_0 = 0x00400000; private static final int VULKAN_1_1 = 0x00401000; // GAME_DRIVER_ALL_APPS // 0: Default (Invalid values fallback to default as well) // 1: All apps use Game Driver - // 2: All apps use system graphics driver + // 2: All apps use Prerelease Driver + // 3: All apps use system graphics driver private static final int GAME_DRIVER_GLOBAL_OPT_IN_DEFAULT = 0; - private static final int GAME_DRIVER_GLOBAL_OPT_IN_ALL = 1; - private static final int GAME_DRIVER_GLOBAL_OPT_IN_NONE = 2; + private static final int GAME_DRIVER_GLOBAL_OPT_IN_GAME_DRIVER = 1; + private static final int GAME_DRIVER_GLOBAL_OPT_IN_PRERELEASE_DRIVER = 2; + private static final int GAME_DRIVER_GLOBAL_OPT_IN_OFF = 3; private ClassLoader mClassLoader; private String mLayerPath; @@ -114,65 +120,6 @@ public class GraphicsEnvironment { public static native void hintActivityLaunch(); /** - * Allow to query whether an application will use Game Driver. - */ - public static boolean shouldUseGameDriver(Context context, Bundle coreSettings, - ApplicationInfo applicationInfo) { - final String driverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER); - if (driverPackageName == null || driverPackageName.isEmpty()) { - return false; - } - - // To minimize risk of driver updates crippling the device beyond user repair, never use an - // updated driver for privileged or non-updated system apps. Presumably pre-installed apps - // were tested thoroughly with the pre-installed driver. - if (applicationInfo.isPrivilegedApp() || (applicationInfo.isSystemApp() - && !applicationInfo.isUpdatedSystemApp())) { - if (DEBUG) Log.v(TAG, "ignoring driver package for privileged/non-updated system app"); - return false; - } - final ContentResolver contentResolver = context.getContentResolver(); - final String packageName = applicationInfo.packageName; - final int globalOptIn; - if (coreSettings != null) { - globalOptIn = coreSettings.getInt(Settings.Global.GAME_DRIVER_ALL_APPS, 0); - } else { - globalOptIn = Settings.Global.getInt(contentResolver, - Settings.Global.GAME_DRIVER_ALL_APPS, 0); - } - if (globalOptIn == GAME_DRIVER_GLOBAL_OPT_IN_ALL) { - return true; - } - if (globalOptIn == GAME_DRIVER_GLOBAL_OPT_IN_NONE) { - return false; - } - - // GAME_DRIVER_OPT_OUT_APPS has higher priority than GAME_DRIVER_OPT_IN_APPS - if (getGlobalSettingsString(contentResolver, coreSettings, - Settings.Global.GAME_DRIVER_OPT_OUT_APPS).contains(packageName)) { - return false; - } - final boolean isOptIn = getGlobalSettingsString(contentResolver, coreSettings, - Settings.Global.GAME_DRIVER_OPT_IN_APPS).contains(packageName); - final List<String> whitelist = getGlobalSettingsString(contentResolver, coreSettings, - Settings.Global.GAME_DRIVER_WHITELIST); - if (!isOptIn && whitelist.indexOf(GAME_DRIVER_WHITELIST_ALL) != 0 - && !whitelist.contains(packageName)) { - return false; - } - - // If the application is not opted-in, then check whether it's on the blacklist, - // terminate early if it's on the blacklist and fallback to system driver. - if (!isOptIn - && getGlobalSettingsString(contentResolver, coreSettings, - Settings.Global.GAME_DRIVER_BLACKLIST) - .contains(packageName)) { - return false; - } - return true; - } - - /** * Query to determine if ANGLE should be used */ public static boolean shouldUseAngle(Context context, Bundle coreSettings, @@ -742,12 +689,102 @@ public class GraphicsEnvironment { } /** + * Return the driver package name to use. Return null for system driver. + */ + private static String chooseDriverInternal(Context context, Bundle coreSettings) { + final String gameDriver = SystemProperties.get(PROPERTY_GFX_DRIVER); + final boolean hasGameDriver = gameDriver != null && !gameDriver.isEmpty(); + + final String prereleaseDriver = SystemProperties.get(PROPERTY_GFX_DRIVER_PRERELEASE); + final boolean hasPrereleaseDriver = prereleaseDriver != null && !prereleaseDriver.isEmpty(); + + if (!hasGameDriver && !hasPrereleaseDriver) { + if (DEBUG) Log.v(TAG, "Neither Game Driver nor prerelease driver is supported."); + return null; + } + + // To minimize risk of driver updates crippling the device beyond user repair, never use an + // updated driver for privileged or non-updated system apps. Presumably pre-installed apps + // were tested thoroughly with the pre-installed driver. + final ApplicationInfo ai = context.getApplicationInfo(); + if (ai.isPrivilegedApp() || (ai.isSystemApp() && !ai.isUpdatedSystemApp())) { + if (DEBUG) Log.v(TAG, "Ignoring driver package for privileged/non-updated system app."); + return null; + } + + // Priority for Game Driver settings global on confliction (Higher priority comes first): + // 1. GAME_DRIVER_ALL_APPS + // 2. GAME_DRIVER_OPT_OUT_APPS + // 3. GAME_DRIVER_PRERELEASE_OPT_IN_APPS + // 4. GAME_DRIVER_OPT_IN_APPS + // 5. GAME_DRIVER_BLACKLIST + // 6. GAME_DRIVER_WHITELIST + switch (coreSettings.getInt(Settings.Global.GAME_DRIVER_ALL_APPS, 0)) { + case GAME_DRIVER_GLOBAL_OPT_IN_OFF: + if (DEBUG) Log.v(TAG, "Game Driver is turned off on this device."); + return null; + case GAME_DRIVER_GLOBAL_OPT_IN_GAME_DRIVER: + if (DEBUG) Log.v(TAG, "All apps opt in to use Game Driver."); + return hasGameDriver ? gameDriver : null; + case GAME_DRIVER_GLOBAL_OPT_IN_PRERELEASE_DRIVER: + if (DEBUG) Log.v(TAG, "All apps opt in to use prerelease driver."); + return hasPrereleaseDriver ? prereleaseDriver : null; + case GAME_DRIVER_GLOBAL_OPT_IN_DEFAULT: + default: + break; + } + + final String appPackageName = ai.packageName; + if (getGlobalSettingsString(null, coreSettings, Settings.Global.GAME_DRIVER_OPT_OUT_APPS) + .contains(appPackageName)) { + if (DEBUG) Log.v(TAG, "App opts out for Game Driver."); + return null; + } + + if (getGlobalSettingsString( + null, coreSettings, Settings.Global.GAME_DRIVER_PRERELEASE_OPT_IN_APPS) + .contains(appPackageName)) { + if (DEBUG) Log.v(TAG, "App opts in for prerelease Game Driver."); + return hasPrereleaseDriver ? prereleaseDriver : null; + } + + // Early return here since the rest logic is only for Game Driver. + if (!hasGameDriver) { + if (DEBUG) Log.v(TAG, "Game Driver is not supported on the device."); + return null; + } + + final boolean isOptIn = + getGlobalSettingsString(null, coreSettings, Settings.Global.GAME_DRIVER_OPT_IN_APPS) + .contains(appPackageName); + final List<String> whitelist = + getGlobalSettingsString(null, coreSettings, Settings.Global.GAME_DRIVER_WHITELIST); + if (!isOptIn && whitelist.indexOf(GAME_DRIVER_WHITELIST_ALL) != 0 + && !whitelist.contains(appPackageName)) { + if (DEBUG) Log.v(TAG, "App is not on the whitelist for Game Driver."); + return null; + } + + // If the application is not opted-in, then check whether it's on the blacklist, + // terminate early if it's on the blacklist and fallback to system driver. + if (!isOptIn + && getGlobalSettingsString( + null, coreSettings, Settings.Global.GAME_DRIVER_BLACKLIST) + .contains(appPackageName)) { + if (DEBUG) Log.v(TAG, "App is on the blacklist for Game Driver."); + return null; + } + + return gameDriver; + } + + /** * Choose whether the current process should use the builtin or an updated driver. */ private static boolean chooseDriver( Context context, Bundle coreSettings, PackageManager pm, String packageName) { - final String driverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER); - if (driverPackageName == null || driverPackageName.isEmpty()) { + final String driverPackageName = chooseDriverInternal(context, coreSettings); + if (driverPackageName == null) { return false; } @@ -770,10 +807,6 @@ public class GraphicsEnvironment { return false; } - if (!shouldUseGameDriver(context, coreSettings, context.getApplicationInfo())) { - return false; - } - final String abi = chooseAbi(driverAppInfo); if (abi == null) { if (DEBUG) { @@ -792,10 +825,7 @@ public class GraphicsEnvironment { .append("!/lib/") .append(abi); final String paths = sb.toString(); - - final String sphalLibraries = - coreSettings.getString(Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES); - + final String sphalLibraries = getSphalLibraries(context, driverPackageName); if (DEBUG) { Log.v(TAG, "gfx driver package search path: " + paths @@ -832,6 +862,29 @@ public class GraphicsEnvironment { return null; } + private static String getSphalLibraries(Context context, String driverPackageName) { + try { + final Context driverContext = + context.createPackageContext(driverPackageName, Context.CONTEXT_RESTRICTED); + final BufferedReader reader = new BufferedReader(new InputStreamReader( + driverContext.getAssets().open(GAME_DRIVER_SPHAL_LIBRARIES_FILENAME))); + final ArrayList<String> assetStrings = new ArrayList<>(); + for (String assetString; (assetString = reader.readLine()) != null;) { + assetStrings.add(assetString); + } + return String.join(":", assetStrings); + } catch (PackageManager.NameNotFoundException e) { + if (DEBUG) { + Log.w(TAG, "Driver package '" + driverPackageName + "' not installed"); + } + } catch (IOException e) { + if (DEBUG) { + Log.w(TAG, "Failed to load '" + GAME_DRIVER_SPHAL_LIBRARIES_FILENAME + "'"); + } + } + return ""; + } + private static native int getCanLoadSystemLibraries(); private static native void setLayerPaths(ClassLoader classLoader, String layerPaths); private static native void setDebugLayers(String layers); diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index e50ab6cfc017..74c89d6898e5 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -511,7 +511,6 @@ public class Process { * @param appDataDir null-ok the data directory of the app. * @param invokeWith null-ok the command to invoke with. * @param packageName null-ok the name of the package this process belongs to. - * @param useSystemGraphicsDriver whether the process uses system graphics driver. * * @param zygoteArgs Additional arguments to supply to the zygote process. * @return An object that describes the result of the attempt to start the process. @@ -531,13 +530,11 @@ public class Process { @Nullable String appDataDir, @Nullable String invokeWith, @Nullable String packageName, - boolean useSystemGraphicsDriver, @Nullable String[] zygoteArgs) { return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, packageName, - /*useUsapPool=*/ true, - useSystemGraphicsDriver, zygoteArgs); + /*useUsapPool=*/ true, zygoteArgs); } /** @hide */ @@ -553,13 +550,11 @@ public class Process { @Nullable String appDataDir, @Nullable String invokeWith, @Nullable String packageName, - boolean useSystemGraphicsDriver, @Nullable String[] zygoteArgs) { return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, packageName, - /*useUsapPool=*/ false, - useSystemGraphicsDriver, zygoteArgs); + /*useUsapPool=*/ false, zygoteArgs); } /** diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java index d42478e5031d..9bcdceef61f1 100644 --- a/core/java/android/os/ZygoteProcess.java +++ b/core/java/android/os/ZygoteProcess.java @@ -307,7 +307,6 @@ public class ZygoteProcess { * @param invokeWith null-ok the command to invoke with. * @param packageName null-ok the name of the package this process belongs to. * @param zygoteArgs Additional arguments to supply to the zygote process. - * @param useSystemGraphicsDriver whether the process uses system graphics driver. * * @return An object that describes the result of the attempt to start the process. * @throws RuntimeException on fatal start failure @@ -324,7 +323,6 @@ public class ZygoteProcess { @Nullable String invokeWith, @Nullable String packageName, boolean useUsapPool, - boolean useSystemGraphicsDriver, @Nullable String[] zygoteArgs) { // TODO (chriswailes): Is there a better place to check this value? if (fetchUsapPoolEnabledPropWithMinInterval()) { @@ -335,7 +333,7 @@ public class ZygoteProcess { return startViaZygote(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/ false, - packageName, useUsapPool, useSystemGraphicsDriver, zygoteArgs); + packageName, useUsapPool, zygoteArgs); } catch (ZygoteStartFailedEx ex) { Log.e(LOG_TAG, "Starting VM process through Zygote failed"); @@ -554,7 +552,6 @@ public class ZygoteProcess { boolean startChildZygote, @Nullable String packageName, boolean useUsapPool, - boolean useSystemGraphicsDriver, @Nullable String[] extraArgs) throws ZygoteStartFailedEx { ArrayList<String> argsForZygote = new ArrayList<>(); @@ -636,7 +633,7 @@ public class ZygoteProcess { // The USAP pool can not be used if the application will not use the systems graphics // driver. If that driver is requested use the Zygote application start path. return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), - useUsapPool && useSystemGraphicsDriver, + useUsapPool, argsForZygote); } } @@ -1147,8 +1144,7 @@ public class ZygoteProcess { gids, runtimeFlags, 0 /* mountExternal */, 0 /* targetSdkVersion */, seInfo, abi, instructionSet, null /* appDataDir */, null /* invokeWith */, true /* startChildZygote */, null /* packageName */, - false /* useUsapPool */, false /*useSystemGraphicsDriver*/, - extraArgs); + false /* useUsapPool */, extraArgs); } catch (ZygoteStartFailedEx ex) { throw new RuntimeException("Starting child-zygote through Zygote failed", ex); } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 5432e33bacf8..383d8dbce791 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -12665,6 +12665,14 @@ public final class Settings { public static final String GAME_DRIVER_OPT_IN_APPS = "game_driver_opt_in_apps"; /** + * List of Apps selected to use prerelease Game Driver. + * i.e. <pkg1>,<pkg2>,...,<pkgN> + * @hide + */ + public static final String GAME_DRIVER_PRERELEASE_OPT_IN_APPS = + "game_driver_prerelease_opt_in_apps"; + + /** * List of Apps selected not to use Game Driver. * i.e. <pkg1>,<pkg2>,...,<pkgN> * @hide @@ -13569,39 +13577,6 @@ public final class Settings { "location_global_kill_switch"; /** - * If set to 1, the device identifier check will be relaxed to the previous READ_PHONE_STATE - * permission check for 3P apps. - * - * STOPSHIP: Remove this once we ship with the new device identifier check enabled. - * - * @hide - */ - public static final String PRIVILEGED_DEVICE_IDENTIFIER_3P_CHECK_RELAXED = - "privileged_device_identifier_3p_check_relaxed"; - - /** - * If set to 1, the device identifier check will be relaxed to the previous READ_PHONE_STATE - * permission check for preloaded non-privileged apps. - * - * STOPSHIP: Remove this once we ship with the new device identifier check enabled. - * - * @hide - */ - public static final String PRIVILEGED_DEVICE_IDENTIFIER_NON_PRIV_CHECK_RELAXED = - "privileged_device_identifier_non_priv_check_relaxed"; - - /** - * If set to 1, the device identifier check will be relaxed to the previous READ_PHONE_STATE - * permission check for preloaded privileged apps. - * - * STOPSHIP: Remove this once we ship with the new device identifier check enabled. - * - * @hide - */ - public static final String PRIVILEGED_DEVICE_IDENTIFIER_PRIV_CHECK_RELAXED = - "privileged_device_identifier_priv_check_relaxed"; - - /** * If set to 1, SettingsProvider's restoreAnyVersion="true" attribute will be ignored * and restoring to lower version of platform API will be skipped. * diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index e02fd9fc5413..b44c9d59ebe5 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -1199,20 +1199,25 @@ public abstract class NotificationListenerService extends Service { } } - /** Convert new-style Icons to legacy representations for pre-M clients. */ - private void createLegacyIconExtras(Notification n) { - Icon smallIcon = n.getSmallIcon(); - Icon largeIcon = n.getLargeIcon(); - if (smallIcon != null && smallIcon.getType() == Icon.TYPE_RESOURCE) { - n.extras.putInt(Notification.EXTRA_SMALL_ICON, smallIcon.getResId()); - n.icon = smallIcon.getResId(); - } - if (largeIcon != null) { - Drawable d = largeIcon.loadDrawable(getContext()); - if (d != null && d instanceof BitmapDrawable) { - final Bitmap largeIconBits = ((BitmapDrawable) d).getBitmap(); - n.extras.putParcelable(Notification.EXTRA_LARGE_ICON, largeIconBits); - n.largeIcon = largeIconBits; + /** + * Convert new-style Icons to legacy representations for pre-M clients. + * @hide + */ + public final void createLegacyIconExtras(Notification n) { + if (getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.M) { + Icon smallIcon = n.getSmallIcon(); + Icon largeIcon = n.getLargeIcon(); + if (smallIcon != null && smallIcon.getType() == Icon.TYPE_RESOURCE) { + n.extras.putInt(Notification.EXTRA_SMALL_ICON, smallIcon.getResId()); + n.icon = smallIcon.getResId(); + } + if (largeIcon != null) { + Drawable d = largeIcon.loadDrawable(getContext()); + if (d != null && d instanceof BitmapDrawable) { + final Bitmap largeIconBits = ((BitmapDrawable) d).getBitmap(); + n.extras.putParcelable(Notification.EXTRA_LARGE_ICON, largeIconBits); + n.largeIcon = largeIconBits; + } } } } diff --git a/core/java/android/util/DisplayMetrics.java b/core/java/android/util/DisplayMetrics.java index 1bcfc05224ca..7c7223c04b59 100755 --- a/core/java/android/util/DisplayMetrics.java +++ b/core/java/android/util/DisplayMetrics.java @@ -157,6 +157,14 @@ public class DisplayMetrics { public static final int DENSITY_440 = 440; /** + * Intermediate density for screens that sit somewhere between + * {@link #DENSITY_XHIGH} (320 dpi) and {@link #DENSITY_XXHIGH} (480 dpi). + * This is not a density that applications should target, instead relying + * on the system to scale their {@link #DENSITY_XXHIGH} assets for them. + */ + public static final int DENSITY_450 = 450; + + /** * Standard quantized DPI for extra-extra-high-density screens. */ public static final int DENSITY_XXHIGH = 480; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 7a3609a61614..3adddc790c67 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2002,18 +2002,9 @@ public final class ViewRootImpl implements ViewParent, mDisplay.getRealSize(size); desiredWindowWidth = size.x; desiredWindowHeight = size.y; - } else if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT - || lp.height == ViewGroup.LayoutParams.WRAP_CONTENT) { - // For wrap content, we have to remeasure later on anyways. Use size consistent with - // below so we get best use of the measure cache. - desiredWindowWidth = dipToPx(config.screenWidthDp); - desiredWindowHeight = dipToPx(config.screenHeightDp); } else { - // After addToDisplay, the frame contains the frameHint from window manager, which - // for most windows is going to be the same size as the result of relayoutWindow. - // Using this here allows us to avoid remeasuring after relayoutWindow - desiredWindowWidth = frame.width(); - desiredWindowHeight = frame.height(); + desiredWindowWidth = mWinFrame.width(); + desiredWindowHeight = mWinFrame.height(); } // We used to use the following condition to choose 32 bits drawing caches: diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 4cb552d29c32..85e9e4950cba 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -2553,34 +2553,42 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te final boolean isItemEnabled; final ViewGroup.LayoutParams lp = view.getLayoutParams(); if (lp instanceof AbsListView.LayoutParams) { - isItemEnabled = ((AbsListView.LayoutParams) lp).isEnabled; + isItemEnabled = ((AbsListView.LayoutParams) lp).isEnabled && isEnabled(); } else { isItemEnabled = false; } - if (!isEnabled() || !isItemEnabled) { - info.setEnabled(false); - return; - } + info.setEnabled(isItemEnabled); if (position == getSelectedItemPosition()) { info.setSelected(true); - info.addAction(AccessibilityAction.ACTION_CLEAR_SELECTION); - } else { - info.addAction(AccessibilityAction.ACTION_SELECT); + addAccessibilityActionIfEnabled(info, isItemEnabled, + AccessibilityAction.ACTION_CLEAR_SELECTION); + } else { + addAccessibilityActionIfEnabled(info, isItemEnabled, + AccessibilityAction.ACTION_SELECT); } if (isItemClickable(view)) { - info.addAction(AccessibilityAction.ACTION_CLICK); + addAccessibilityActionIfEnabled(info, isItemEnabled, AccessibilityAction.ACTION_CLICK); info.setClickable(true); } if (isLongClickable()) { - info.addAction(AccessibilityAction.ACTION_LONG_CLICK); + addAccessibilityActionIfEnabled(info, isItemEnabled, + AccessibilityAction.ACTION_LONG_CLICK); info.setLongClickable(true); } } + + private void addAccessibilityActionIfEnabled(AccessibilityNodeInfo info, boolean enabled, + AccessibilityAction action) { + if (enabled) { + info.addAction(action); + } + } + private boolean isItemClickable(View view) { return !view.hasExplicitFocusable(); } diff --git a/core/java/com/android/internal/colorextraction/ColorExtractor.java b/core/java/com/android/internal/colorextraction/ColorExtractor.java index d9fd3b5bd6d8..b27c11b524e5 100644 --- a/core/java/com/android/internal/colorextraction/ColorExtractor.java +++ b/core/java/com/android/internal/colorextraction/ColorExtractor.java @@ -53,11 +53,13 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener protected WallpaperColors mLockColors; public ColorExtractor(Context context) { - this(context, new Tonal(context), true /* immediately */); + this(context, new Tonal(context), true /* immediately */, + context.getSystemService(WallpaperManager.class)); } @VisibleForTesting - public ColorExtractor(Context context, ExtractionType extractionType, boolean immediately) { + public ColorExtractor(Context context, ExtractionType extractionType, boolean immediately, + WallpaperManager wallpaperManager) { mContext = context; mExtractionType = extractionType; @@ -72,7 +74,6 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener mOnColorsChangedListeners = new ArrayList<>(); - WallpaperManager wallpaperManager = mContext.getSystemService(WallpaperManager.class); if (wallpaperManager == null) { Log.w(TAG, "Can't listen to color changes!"); } else { @@ -110,7 +111,7 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener } } - private void extractWallpaperColors() { + protected void extractWallpaperColors() { GradientColors[] systemColors = mGradientColors.get(WallpaperManager.FLAG_SYSTEM); GradientColors[] lockColors = mGradientColors.get(WallpaperManager.FLAG_LOCK); extractInto(mSystemColors, diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index c2e37d5adca8..3a7caa4c2fc0 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -3609,8 +3609,8 @@ public class BatteryStatsImpl extends BatteryStats { public void createFakeHistoryEvents(long numEvents) { for(long i = 0; i < numEvents; i++) { - noteWifiOnLocked(); - noteWifiOffLocked(); + noteLongPartialWakelockStart("name1", "historyName1", 1000); + noteLongPartialWakelockFinish("name1", "historyName1", 1000); } } @@ -3693,9 +3693,10 @@ public class BatteryStatsImpl extends BatteryStats { mHistoryBufferLastPos = -1; final long elapsedRealtime = mClocks.elapsedRealtime(); final long uptime = mClocks.uptimeMillis(); + HistoryItem newItem = new HistoryItem(); + newItem.setTo(cur); startRecordingHistory(elapsedRealtime, uptime, false); - - addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE, cur); + addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE, newItem); return; } diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index ee81868da25b..2ba9cf1961e9 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -512,9 +512,6 @@ public final class Zygote { Credentials peerCredentials = null; ZygoteArguments args = null; - // Load resources - ZygoteInit.nativePreloadGraphicsDriver(); - while (true) { try { sessionSocket = usapPoolSocket.accept(); diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 2941a813fecb..723f16128281 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -262,8 +262,10 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind private final int mResizeShadowSize; private final Paint mVerticalResizeShadowPaint = new Paint(); private final Paint mHorizontalResizeShadowPaint = new Paint(); + private final Paint mLegacyNavigationBarBackgroundPaint = new Paint(); private Insets mBackgroundInsets = Insets.NONE; private Insets mLastBackgroundInsets = Insets.NONE; + private boolean mDrawLegacyNavigationBarBackground; DecorView(Context context, int featureId, PhoneWindow window, WindowManager.LayoutParams params) { @@ -292,6 +294,8 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind mResizeShadowSize = context.getResources().getDimensionPixelSize( R.dimen.resize_shadow_size); initResizingPaints(); + + mLegacyNavigationBarBackgroundPaint.setColor(Color.BLACK); } void setBackgroundFallback(@Nullable Drawable fallbackDrawable) { @@ -1143,6 +1147,8 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind navBarToRightEdge || navBarToLeftEdge, navBarToLeftEdge, 0 /* sideInset */, animate && !disallowAnimate, mForceWindowDrawsBarBackgrounds); + mDrawLegacyNavigationBarBackground = mNavigationColorViewState.visible + && (mWindow.getAttributes().flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) == 0; boolean statusBarNeedsRightInset = navBarToRightEdge && mNavigationColorViewState.present; @@ -2310,6 +2316,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind @Override public void onPostDraw(RecordingCanvas canvas) { drawResizingShadowIfNeeded(canvas); + drawLegacyNavigationBarBackground(canvas); } private void initResizingPaints() { @@ -2342,6 +2349,18 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind canvas.restore(); } + private void drawLegacyNavigationBarBackground(RecordingCanvas canvas) { + if (!mDrawLegacyNavigationBarBackground) { + return; + } + View v = mNavigationColorViewState.view; + if (v == null) { + return; + } + canvas.drawRect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom(), + mLegacyNavigationBarBackgroundPaint); + } + /** Release the renderer thread which is usually done when the user stops resizing. */ private void releaseThreadedRenderer() { if (mResizingBackgroundDrawable != null && mLastBackgroundDrawableCb != null) { diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 07f8ee077c21..dc45f7834748 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -886,13 +886,13 @@ public class LockPatternUtils { return; } + // TODO(b/120484642): This is a location where we still use a String for vold + String passwordString = password != null ? new String(password) : null; new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... dummy) { IStorageManager storageManager = IStorageManager.Stub.asInterface(service); try { - // TODO(b/120484642): This is a location where we still use a String for vold - String passwordString = password != null ? new String(password) : null; storageManager.changeEncryptionPassword(type, passwordString); } catch (RemoteException e) { Log.e(TAG, "Error changing encryption password", e); diff --git a/core/jni/android_os_Trace.cpp b/core/jni/android_os_Trace.cpp index 81428dc02fb4..bd82bd91c55d 100644 --- a/core/jni/android_os_Trace.cpp +++ b/core/jni/android_os_Trace.cpp @@ -24,26 +24,29 @@ namespace android { -inline static void sanitizeString(char* str, size_t size) { - for (size_t i = 0; i < size; i++) { - char c = str[i]; - if (c == '\0' || c == '\n' || c == '|') { - str[i] = ' '; +inline static void sanitizeString(char* str) { + while (*str) { + char c = *str; + if (c == '\n' || c == '|') { + *str = ' '; } + str++; } } -inline static void getString(JNIEnv* env, jstring jstring, char* outBuffer, jsize maxSize) { - jsize size = std::min(env->GetStringLength(jstring), maxSize); - env->GetStringUTFRegion(jstring, 0, size, outBuffer); - sanitizeString(outBuffer, size); - outBuffer[size] = '\0'; -} - template<typename F> inline static void withString(JNIEnv* env, jstring jstr, F callback) { - std::array<char, 1024> buffer; - getString(env, jstr, buffer.data(), buffer.size()); + // We need to handle the worst case of 1 character -> 4 bytes + // So make a buffer of size 4097 and let it hold a string with a maximum length + // of 1024. The extra last byte for the null terminator. + std::array<char, 4097> buffer; + // We have no idea of knowing how much data GetStringUTFRegion wrote, so null it out in + // advance so we can have a reliable null terminator + memset(buffer.data(), 0, buffer.size()); + jsize size = std::min(env->GetStringLength(jstr), 1024); + env->GetStringUTFRegion(jstr, 0, size, buffer.data()); + sanitizeString(buffer.data()); + callback(buffer.data()); } diff --git a/core/jni/com_android_internal_os_ZygoteInit.cpp b/core/jni/com_android_internal_os_ZygoteInit.cpp index 5cca0fdc735b..c2a5ee43dbd5 100644 --- a/core/jni/com_android_internal_os_ZygoteInit.cpp +++ b/core/jni/com_android_internal_os_ZygoteInit.cpp @@ -19,7 +19,6 @@ #include <EGL/egl.h> #include <Properties.h> #include <ui/GraphicBufferMapper.h> -#include <vulkan/vulkan.h> #include "core_jni_helpers.h" @@ -67,9 +66,6 @@ void android_internal_os_ZygoteInit_nativePreloadGraphicsDriver(JNIEnv* env, jcl ScopedSCSExit x; if (Properties::peekRenderPipelineType() == RenderPipelineType::SkiaGL) { eglGetDisplay(EGL_DEFAULT_DISPLAY); - } else { - uint32_t count = 0; - vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr); } } diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto index 9a9c9d14154b..7d0629ee6fba 100644 --- a/core/proto/android/os/incident.proto +++ b/core/proto/android/os/incident.proto @@ -321,6 +321,14 @@ message IncidentProto { (section).args = "incidentcompanion --restricted_image" ]; + // System trace as a serialized protobuf. + optional bytes system_trace = 3026 [ + (section).type = SECTION_FILE, + (section).args = "/data/misc/perfetto-traces/incident-trace", + (privacy).dest = DEST_AUTOMATIC, + (section).userdebug_and_eng_only = true + ]; + // Reserved for OEMs. extensions 50000 to 100000; } diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index 8f16b418f7db..00706941a18f 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -457,6 +457,9 @@ message GlobalSettingsProto { optional SettingProto game_driver_sphal_libraries = 16; // ANGLE - External package containing ANGLE libraries optional SettingProto angle_debug_package = 17; + // Game Driver - List of Apps selected to use prerelease Game Driver + // i.e. <pkg1>,<pkg2>,...,<pkgN> + optional SettingProto game_driver_prerelease_opt_in_apps = 18; } optional Gpu gpu = 59; diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 3149c2d42623..432c101c286d 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -308,7 +308,7 @@ <string name="permgrouprequest_storage" msgid="7885942926944299560">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالوصول إلى الصور والوسائط والملفات على جهازك؟"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"الميكروفون"</string> <string name="permgroupdesc_microphone" msgid="4988812113943554584">"تسجيل الصوت"</string> - <string name="permgrouprequest_microphone" msgid="9167492350681916038">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بتسجيل الصوت؟"</string> + <string name="permgrouprequest_microphone" msgid="9167492350681916038">"هل تريد السماح لـ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بتسجيل الصوت؟"</string> <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"النشاط البدني"</string> <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> @@ -320,7 +320,7 @@ <string name="permgrouprequest_calllog" msgid="8487355309583773267">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالوصول إلى سجلّ مكالماتك الهاتفية؟"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"الهاتف"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"إجراء مكالمات هاتفية وإدارتها"</string> - <string name="permgrouprequest_phone" msgid="9166979577750581037">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بإجراء المكالمات الهاتفية وإدارتها؟"</string> + <string name="permgrouprequest_phone" msgid="9166979577750581037">"هل تريد السماح لـ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بإجراء المكالمات الهاتفية وإدارتها؟"</string> <string name="permgrouplab_sensors" msgid="4838614103153567532">"أجهزة استشعار الجسم"</string> <string name="permgroupdesc_sensors" msgid="7147968539346634043">"الوصول إلى بيانات المستشعر حول علاماتك الحيوية"</string> <string name="permgrouprequest_sensors" msgid="6349806962814556786">"هل تريد السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالدخول إلى بيانات المستشعر حول علاماتك الحيوية؟"</string> @@ -2122,7 +2122,7 @@ <string name="harmful_app_warning_title" msgid="8982527462829423432">"تم العثور على تطبيق ضار"</string> <string name="slices_permission_request" msgid="8484943441501672932">"يريد تطبيق <xliff:g id="APP_0">%1$s</xliff:g> عرض شرائح تطبيق <xliff:g id="APP_2">%2$s</xliff:g>."</string> <string name="screenshot_edit" msgid="7867478911006447565">"تعديل"</string> - <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"سيهتز الهاتف عند تلقي المكالمات والإشعارات"</string> + <string name="volume_dialog_ringer_guidance_vibrate" msgid="8902050240801159042">"سيهتز الهاتف عند تلقّي المكالمات والإشعارات"</string> <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"سيتم كتم صوت الهاتف عند تلقي المكالمات والإشعارات"</string> <string name="notification_channel_system_changes" msgid="5072715579030948646">"تغييرات النظام"</string> <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"عدم الإزعاج"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index df5c303fbab6..6f50a81f17d2 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -131,8 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ৱাই- ফাই কলিং"</string> - <!-- no translation found for wfcSpnFormat_spn_wifi_calling_vo_hyphen (1730997175789582756) --> - <skip /> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> ৱাই-ফাই কলিং"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN কল"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN কল"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> ৱাই-ফাই"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 0c957e049474..135e4e5e4a07 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -42,11 +42,11 @@ <string name="serviceErased" msgid="1288584695297200972">"پاک کردن با موفقیت انجام شد."</string> <string name="passwordIncorrect" msgid="7612208839450128715">"گذرواژه اشتباه است."</string> <string name="mmiComplete" msgid="8232527495411698359">"MMI کامل شد."</string> - <string name="badPin" msgid="9015277645546710014">"پین قدیمی که نوشتهاید صحیح نیست."</string> + <string name="badPin" msgid="9015277645546710014">"این پین قدیمی که نوشتید صحیح نیست."</string> <string name="badPuk" msgid="5487257647081132201">"PUK که نوشتهاید صحیح نیست."</string> <string name="mismatchPin" msgid="609379054496863419">"پینهایی که وارد کردهاید با یکدیگر مطابقت ندارند."</string> - <string name="invalidPin" msgid="3850018445187475377">"یک پین بنویسید که 4 تا 8 رقم باشد."</string> - <string name="invalidPuk" msgid="8761456210898036513">"یک PUK با 8 رقم یا بیشتر تایپ کنید."</string> + <string name="invalidPin" msgid="3850018445187475377">"یک پین بنویسید که ۴ تا ۸ رقم باشد."</string> + <string name="invalidPuk" msgid="8761456210898036513">"یک PUK با ۸ رقم یا بیشتر تایپ کنید."</string> <string name="needPuk" msgid="919668385956251611">"سیم کارت شما با PUK قفل شده است. کد PUK را برای بازگشایی آن بنویسید."</string> <string name="needPuk2" msgid="4526033371987193070">"PUK2 را برای بازگشایی قفل سیم کارت بنویسید."</string> <string name="enablePin" msgid="209412020907207950">"ناموفق بود، قفل سیم/RUIM را فعال کنید."</string> @@ -73,8 +73,8 @@ <string name="DndMmi" msgid="1265478932418334331">"مزاحم نشوید"</string> <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"پیشفرض شناسه تماسگیرنده روی محدود است. تماس بعدی: محدود"</string> <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"پیشفرض شناسه تماسگیرنده روی محدود است. تماس بعدی: بدون محدودیت"</string> - <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"پیشفرض شناسه تماسگیرنده روی غیر محدود است. تماس بعدی: محدود"</string> - <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"پیشفرض شناسه تماسگیرنده روی غیر محدود است. تماس بعدی: بدون محدودیت"</string> + <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"پیشفرض شناسه تماسگیرنده روی غیرمحدود است. تماس بعدی: محدود"</string> + <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"پیشفرض شناسه تماسگیرنده روی غیرمحدود است. تماس بعدی: بدون محدودیت"</string> <string name="serviceNotProvisioned" msgid="8614830180508686666">"سرویس دارای مجوز نیست."</string> <string name="CLIRPermanent" msgid="3377371145926835671">"شما میتوانید تنظیم شناسه تماسگیرنده را تغییر دهید."</string> <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"بدون سرویس داده تلفن همراه"</string> @@ -103,7 +103,7 @@ <string name="serviceClassData" msgid="872456782077937893">"داده"</string> <string name="serviceClassFAX" msgid="5566624998840486475">"نمابر"</string> <string name="serviceClassSMS" msgid="2015460373701527489">"پیامک"</string> - <string name="serviceClassDataAsync" msgid="4523454783498551468">"غیر همگام"</string> + <string name="serviceClassDataAsync" msgid="4523454783498551468">"ناهمگام"</string> <string name="serviceClassDataSync" msgid="7530000519646054776">"همگامسازی"</string> <string name="serviceClassPacket" msgid="6991006557993423453">"بسته"</string> <string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string> @@ -154,7 +154,7 @@ <string name="fcError" msgid="3327560126588500777">"مشکل در اتصال یا کد ویژگی نامعتبر."</string> <string name="httpErrorOk" msgid="1191919378083472204">"تأیید"</string> <string name="httpError" msgid="7956392511146698522">"خطایی در شبکه وجود داشت."</string> - <string name="httpErrorLookup" msgid="4711687456111963163">"URL پیدا نشد."</string> + <string name="httpErrorLookup" msgid="4711687456111963163">"نشانی اینترنتی پیدا نشد."</string> <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"طرح کلی احراز هویت سایت پشتیبانی نمیشود."</string> <string name="httpErrorAuth" msgid="1435065629438044534">"راستیآزمایی ناموفق بود."</string> <string name="httpErrorProxyAuth" msgid="1788207010559081331">"احراز هویت از طریق سرور پروکسی انجام نشد."</string> @@ -164,10 +164,10 @@ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"این صفحه دارای تعداد بسیار زیادی تغییر مسیر سرور است."</string> <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"پروتکل پشتیبانی نمیشود."</string> <string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"اتصال امن ایجاد نشد."</string> - <string name="httpErrorBadUrl" msgid="3636929722728881972">"بدلیل نامعتبر بودن URL، باز کردن صفحه ممکن نیست."</string> + <string name="httpErrorBadUrl" msgid="3636929722728881972">"بهدلیل نامعتبر بودن نشانی اینترنتی، صفحه باز نمیشود."</string> <string name="httpErrorFile" msgid="2170788515052558676">"دسترسی به فایل انجام نشد."</string> <string name="httpErrorFileNotFound" msgid="6203856612042655084">"فایل درخواستی پیدا نشد."</string> - <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"درخواستهای زیادی در حال پردازش است. بعداً دوباره امتحان کنید."</string> + <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"درخواستهای زیادی درحال پردازش است. بعداً دوباره امتحان کنید."</string> <string name="notification_title" msgid="8967710025036163822">"خطای ورود به سیستم برای <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string> <string name="contentServiceSync" msgid="8353523060269335667">"همگامسازی"</string> <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"همگامسازی نشد"</string> @@ -210,7 +210,7 @@ <string name="reboot_to_update_reboot" msgid="6428441000951565185">"در حال راهاندازی مجدد…"</string> <string name="reboot_to_reset_title" msgid="4142355915340627490">"بازنشانی دادههای کارخانه"</string> <string name="reboot_to_reset_message" msgid="2432077491101416345">"در حال راهاندازی مجدد…"</string> - <string name="shutdown_progress" msgid="2281079257329981203">"در حال خاموش شدن…"</string> + <string name="shutdown_progress" msgid="2281079257329981203">"درحال خاموش شدن…"</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"رایانهٔ لوحی شما خاموش میشود."</string> <string name="shutdown_confirm" product="tv" msgid="476672373995075359">"تلویزیون شما خاموش خواهد شد."</string> <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"ساعت شما خاموش میشود."</string> @@ -399,7 +399,7 @@ <string name="permlab_readCallLog" msgid="3478133184624102739">"خواندن گزارش تماس"</string> <string name="permdesc_readCallLog" msgid="3204122446463552146">"این برنامه میتواند سابقه تماس شما را بخواند."</string> <string name="permlab_writeCallLog" msgid="8552045664743499354">"نوشتن گزارش تماس"</string> - <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"به برنامه اجازه میدهد گزارشات تماس رایانهٔ لوحی شما، از جمله دادههایی درمورد تماسهای ورودی و خروجی را تغییر دهد. برنامههای مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما استفاده کنند."</string> + <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"به برنامه اجازه میدهد گزارشهای تماس رایانهٔ لوحی شما، از جمله دادههایی درباره تماسهای ورودی و خروجی را تغییر دهد. برنامههای مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما استفاده کنند."</string> <string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"به برنامه اجازه میدهد گزارشات تماس تلویزیون شما، از جمله دادههایی درمورد تماسهای ورودی و خروجی را تغییر دهد. برنامههای مخرب شاید از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما استفاده کنند."</string> <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"به برنامه اجازه میدهد گزارشات تماس تلفنی شما، از جمله دادههایی درمورد تماسهای ورودی و خروجی را تغییر دهد. برنامههای مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما استفاده کنند."</string> <string name="permlab_bodySensors" msgid="4683341291818520277">"دسترسی به حسگرهای بدن (مانند پایشگرهای ضربان قلب)"</string> @@ -501,7 +501,7 @@ <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"به برنامه اجازه میدهد تا پیکربندی بلوتوث را در تلویزیون مشاهده کند و اتصالات را با دستگاههای مرتبطشده ایجاد کند و بپذیرد."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"به برنامه اجازه میدهد تا پیکربندی بلوتوث در تلفن را مشاهده کند، و اتصالات دستگاههای مرتبط را برقرار کرده و بپذیرد."</string> <string name="permlab_nfc" msgid="4423351274757876953">"کنترل ارتباط راه نزدیک"</string> - <string name="permdesc_nfc" msgid="7120611819401789907">"به برنامه اجازه میدهد تا با تگهای ارتباط میدان نزدیک (NFC)، کارتها و فایل خوان ارتباط برقرار کند."</string> + <string name="permdesc_nfc" msgid="7120611819401789907">"به برنامه اجازه میدهد تا با تگهای «ارتباط میدان نزدیک» (NFC)، کارتها و فایلخوان ارتباط برقرار کند."</string> <string name="permlab_disableKeyguard" msgid="3598496301486439258">"غیرفعال کردن قفل صفحه شما"</string> <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"به برنامه امکان میدهد قفل کلید و هر گونه امنیت گذرواژه مرتبط را غیرفعال کند. بهعنوان مثال تلفن هنگام دریافت یک تماس تلفنی ورودی قفل کلید را غیرفعال میکند و بعد از پایان تماس، قفل کلید را دوباره فعال میکند."</string> <string name="permlab_requestPasswordComplexity" msgid="202650535669249674">"درخواست پیچیدگی قفل صفحه"</string> @@ -656,7 +656,7 @@ <string name="policylab_watchLogin" msgid="5091404125971980158">"پایش تلاشهای باز کردن قفل صفحه"</string> <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"تعداد گذرواژههای نادرست تایپ شده را هنگام بازکردن قفل صفحه کنترل میکند، و اگر دفعات زیادی گذرواژه نادرست وارد شود رایانهٔ لوحی را قفل میکند و همه دادههای رایانهٔ لوحی را پاک میکند."</string> <string name="policydesc_watchLogin" product="TV" msgid="2707817988309890256">"بر تعداد گذرواژههای نادرست تایپشده در زمان باز کردن قفل صفحه نظارت کنید و اگر تعدا زیادی گذرواژههای اشتباه تایپ شده است، تلویزیون را قفل کنید یا همه دادههای تلویزیون را پاک کنید."</string> - <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"تعداد گذرواژههای نادرست تایپ شده را هنگام بازکردن قفل صفحه کنترل میکند. اگر دفعات زیادی گذرواژه نادرست وارد شود، تلفن را قفل میکند یا همه دادههای تلفن را پاک میکند."</string> + <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"تعداد گذرواژههای نادرست تایپشده را هنگام بازکردن قفل صفحه کنترل میکند و اگر چندین بار گذرواژههای نادرست وارد شود، تلفن را قفل میکند یا همه دادههای تلفن را پاک میکند."</string> <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"بر تعداد گذرواژههای نادرستی که هنگام باز کردن قفل صفحه تایپ شده، نظارت میکند، و اگر تعداد گذرواژههای تایپ شده نادرست بیش از حد بود، رایانه لوحی را قفل میکند یا کلیه دادههای کاربر را پاک میکند."</string> <string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"بر تعداد گذرواژههای نادرستی که هنگام باز کردن قفل صفحه تایپ شده، نظارت میکند، و اگر تعداد گذرواژههای تایپ شده نادرست بیش از حد بود، تلویزیون را قفل میکند یا کلیه دادههای کاربر را پاک میکند."</string> <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"بر تعداد گذرواژههای نادرستی که هنگام باز کردن قفل صفحه تایپ شده، نظارت میکند، و اگر تعداد گذرواژههای تایپ شده نادرست بیش از حد بود، تلفن را قفل میکند یا کلیه دادههای کاربر را پاک میکند."</string> @@ -678,7 +678,7 @@ <string name="policydesc_expirePassword" msgid="5367525762204416046">"تغییر تعداد دفعاتی که گذرواژه، پین یا الگوی قفل صفحه باید تغییر کند."</string> <string name="policylab_encryptedStorage" msgid="8901326199909132915">"تنظیم رمزگذاری حافظه"</string> <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"اطلاعات ذخیره شده برنامه باید رمزگذاری شود."</string> - <string name="policylab_disableCamera" msgid="6395301023152297826">"غیر فعال کردن دوربین ها"</string> + <string name="policylab_disableCamera" msgid="6395301023152297826">"غیرفعال کردن دوربینها"</string> <string name="policydesc_disableCamera" msgid="2306349042834754597">"جلوگیری از استفاده از همه دوربینهای دستگاه."</string> <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"غیرفعال کردن ویژگیهای قفل صفحه"</string> <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"مانع استفاده از برخی ویژگیهای قفل صفحه میشود."</string> @@ -838,7 +838,7 @@ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"سیم کارت با PUK قفل شده است."</string> <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"لطفاً به راهنمای کاربر مراجعه کرده یا با مرکز پشتیبانی از مشتریان تماس بگیرید."</string> <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"سیم کارت قفل شد."</string> - <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"بازگشایی قفل سیم کارت..."</string> + <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"بازگشایی قفل سیم کارت…"</string> <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"الگوی بازگشایی قفل خود را <xliff:g id="NUMBER_0">%1$d</xliff:g> بار اشتباه کشیدهاید. \n\nپس از <xliff:g id="NUMBER_1">%2$d</xliff:g> ثانیه دوباره امتحان کنید."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"گذرواژهٔ خود را <xliff:g id="NUMBER_0">%1$d</xliff:g> بار اشتباه تایپ کردهاید. \n\nپس از <xliff:g id="NUMBER_1">%2$d</xliff:g> ثانیه دوباره امتحان کنید."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"پین را<xliff:g id="NUMBER_0">%1$d</xliff:g> بار اشتباه تایپ کردهاید. \n\nپس از <xliff:g id="NUMBER_1">%2$d</xliff:g> ثانیه دوباره امتحان کنید."</string> @@ -850,7 +850,7 @@ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"شما به اشتباه <xliff:g id="NUMBER_0">%1$d</xliff:g> بار اقدام به باز کردن قفل تلفن کردهاید. پس از<xliff:g id="NUMBER_1">%2$d</xliff:g> تلاش ناموفق دیگر، تلفن به پیشفرض کارخانه بازنشانی میشود و تمام دادههای کاربر از دست خواهد رفت."</string> <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"شما به اشتباه اقدام به باز کردن قفل <xliff:g id="NUMBER">%d</xliff:g> رایانهٔ لوحی کردهاید. رایانهٔ لوحی در حال حاضر به پیشفرض کارخانه بازنشانی میشود."</string> <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"<xliff:g id="NUMBER">%d</xliff:g> دفعه به صورت نادرست سعی کردهاید قفل تلویزیون را باز کنید. اکنون تلویزیون به تنظیمات پیشفرض کارخانه بازنشانی خواهد شد."</string> - <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"شما به اشتباه <xliff:g id="NUMBER">%d</xliff:g> بار اقدام به باز کردن قفل تلفن کردهاید. این تلفن در حال حاضر به پیشفرض کارخانه بازنشانی میشود."</string> + <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"بهاشتباه <xliff:g id="NUMBER">%d</xliff:g> بار اقدام به باز کردن قفل تلفن کردهاید. این تلفن دیگر به پیشفرض کارخانه بازنشانی میشود."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"پس از <xliff:g id="NUMBER">%d</xliff:g> ثانیه دوباره امتحان کنید."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"الگو را فراموش کردهاید؟"</string> <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"بازگشایی قفل حساب"</string> @@ -861,7 +861,7 @@ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ورود به سیستم"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"نام کاربر یا گذرواژه نامعتبر است."</string> <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"نام کاربری یا گذرواژهٔ خود را فراموش کردید؟\nاز "<b>"google.com/accounts/recovery"</b>" بازدید کنید."</string> - <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"در حال بررسی..."</string> + <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"درحال بررسی…"</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"بازگشایی قفل"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"صدا روشن"</string> <string name="lockscreen_sound_off_label" msgid="996822825154319026">"صدا خاموش"</string> @@ -1077,7 +1077,7 @@ <string name="failed_to_copy_to_clipboard" msgid="1833662432489814471">"در بریدهدان کپی نشد"</string> <string name="paste" msgid="5629880836805036433">"جایگذاری"</string> <string name="paste_as_plain_text" msgid="5427792741908010675">"جایگذاری به عنوان متن ساده"</string> - <string name="replace" msgid="5781686059063148930">"جایگزین شود..."</string> + <string name="replace" msgid="5781686059063148930">"جایگزین شود…"</string> <string name="delete" msgid="6098684844021697789">"حذف"</string> <string name="copyUrl" msgid="2538211579596067402">"کپی URL"</string> <string name="selectTextMode" msgid="1018691815143165326">"انتخاب متن"</string> @@ -1121,7 +1121,7 @@ <string name="yes" msgid="5362982303337969312">"تأیید"</string> <string name="no" msgid="5141531044935541497">"لغو"</string> <string name="dialog_alert_title" msgid="2049658708609043103">"توجه"</string> - <string name="loading" msgid="7933681260296021180">"در حال بارکردن…"</string> + <string name="loading" msgid="7933681260296021180">"درحال بارکردن…"</string> <string name="capital_on" msgid="1544682755514494298">"روشن"</string> <string name="capital_off" msgid="6815870386972805832">"خاموش"</string> <string name="whichApplication" msgid="4533185947064773386">"تکمیل عملکرد با استفاده از"</string> @@ -1198,8 +1198,8 @@ <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> درحال ارتقا است...."</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"در حال بهینهسازی برنامهٔ <xliff:g id="NUMBER_0">%1$d</xliff:g> از <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> <string name="android_preparing_apk" msgid="8162599310274079154">"آمادهسازی <xliff:g id="APPNAME">%1$s</xliff:g>."</string> - <string name="android_upgrading_starting_apps" msgid="451464516346926713">"در حال آغاز برنامهها."</string> - <string name="android_upgrading_complete" msgid="1405954754112999229">"در حال اتمام راهاندازی."</string> + <string name="android_upgrading_starting_apps" msgid="451464516346926713">"درحال آغاز کردن برنامهها."</string> + <string name="android_upgrading_complete" msgid="1405954754112999229">"درحال اتمام راهاندازی."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> در حال اجرا"</string> <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"برای برگشت به بازی، ضربه بزنید"</string> <string name="heavy_weight_switcher_title" msgid="387882830435195342">"انتخاب بازی"</string> @@ -1306,8 +1306,8 @@ <string name="wifi_p2p_frequency_conflict_message" product="tv" msgid="3087858235069421128">"در حالی که تلویزیون به <xliff:g id="DEVICE_NAME">%1$s</xliff:g> متصل است، ارتباط آن به صورت موقت از Wi-Fi قطع خواهد شد."</string> <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"این گوشی بهطور موقت از Wi-Fi قطع خواهد شد، در حالی که به <xliff:g id="DEVICE_NAME">%1$s</xliff:g> وصل است"</string> <string name="select_character" msgid="3365550120617701745">"درج نویسه"</string> - <string name="sms_control_title" msgid="7296612781128917719">"ارسال پیامک ها"</string> - <string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> در حال ارسال تعداد زیادی پیامک است. آیا اجازه میدهید این برنامه همچنان پیامک ارسال کند؟"</string> + <string name="sms_control_title" msgid="7296612781128917719">"درحال ارسال پیامکها"</string> + <string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> درحال ارسال تعداد زیادی پیامک است. آیا اجازه میدهید این برنامه همچنان پیامک ارسال کند؟"</string> <string name="sms_control_yes" msgid="3663725993855816807">"مجاز است"</string> <string name="sms_control_no" msgid="625438561395534982">"اجازه ندارد"</string> <string name="sms_short_code_confirm_message" msgid="1645436466285310855">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> مایل است پیامی به <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b> ارسال کند."</string> @@ -1459,7 +1459,7 @@ <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"ارائهدهنده وضعیت"</string> <string name="notification_ranker_binding_label" msgid="774540592299064747">"سرویس رتبهبندی اعلان"</string> <string name="vpn_title" msgid="19615213552042827">"VPN فعال شد"</string> - <string name="vpn_title_long" msgid="6400714798049252294">"VPN توسط <xliff:g id="APP">%s</xliff:g> فعال شده است"</string> + <string name="vpn_title_long" msgid="6400714798049252294">"VPN را <xliff:g id="APP">%s</xliff:g> فعال کرده است"</string> <string name="vpn_text" msgid="1610714069627824309">"برای مدیریت شبکه ضربه بزنید."</string> <string name="vpn_text_long" msgid="4907843483284977618">"به <xliff:g id="SESSION">%s</xliff:g> متصل شد. برای مدیریت شبکه ضربه بزنید."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"در حال اتصال VPN همیشه فعال…"</string> @@ -1495,11 +1495,11 @@ <string name="find_previous" msgid="2196723669388360506">"یافتن قبلی"</string> <string name="gpsNotifTicker" msgid="5622683912616496172">"درخواست مکان از <xliff:g id="NAME">%s</xliff:g>"</string> <string name="gpsNotifTitle" msgid="5446858717157416839">"درخواست مکان"</string> - <string name="gpsNotifMessage" msgid="1374718023224000702">"درخواست شده توسط <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string> + <string name="gpsNotifMessage" msgid="1374718023224000702">"درخواستکننده <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)"</string> <string name="gpsVerifYes" msgid="2346566072867213563">"بله"</string> <string name="gpsVerifNo" msgid="1146564937346454865">"نه"</string> <string name="sync_too_many_deletes" msgid="5296321850662746890">"از حد مجاز حذف فراتر رفت"</string> - <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> مورد حذف شده برای <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>، حساب <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> وجود دارد. میخواهید چه کاری انجام دهید؟"</string> + <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> مورد حذفشده برای <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>، حساب <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> وجود دارد. میخواهید چه کار بکنید؟"</string> <string name="sync_really_delete" msgid="2572600103122596243">"حذف موارد"</string> <string name="sync_undo_deletes" msgid="2941317360600338602">"واگرد موارد حذف شده"</string> <string name="sync_do_nothing" msgid="3743764740430821845">"اکنون کاری انجام نشود"</string> @@ -1564,11 +1564,11 @@ <string name="data_usage_rapid_app_body" msgid="5396680996784142544">"<xliff:g id="APP">%s</xliff:g> بیش از معمول داده مصرف کرده است"</string> <string name="ssl_certificate" msgid="6510040486049237639">"گواهی امنیتی"</string> <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"این گواهی معتبر است."</string> - <string name="issued_to" msgid="454239480274921032">"صادر شده برای:"</string> + <string name="issued_to" msgid="454239480274921032">"صادرشده برای:"</string> <string name="common_name" msgid="2233209299434172646">"نام معمولی:"</string> <string name="org_name" msgid="6973561190762085236">"سازمان:"</string> <string name="org_unit" msgid="7265981890422070383">"واحد سازمانی:"</string> - <string name="issued_by" msgid="2647584988057481566">"صادر شده توسط:"</string> + <string name="issued_by" msgid="2647584988057481566">"صادرکننده:"</string> <string name="validity_period" msgid="8818886137545983110">"اعتبار:"</string> <string name="issued_on" msgid="5895017404361397232">"صادر شده در:"</string> <string name="expires_on" msgid="3676242949915959821">"تاریخ انقضا:"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index da5f866a4713..c8482f9de2d4 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -308,7 +308,7 @@ <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Autoriser <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> à accéder à vos journaux d\'appels?"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"faire et gérer des appels téléphoniques"</string> - <string name="permgrouprequest_phone" msgid="9166979577750581037">"Autoriser <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> à faire et à gérer les appels téléphoniques?"</string> + <string name="permgrouprequest_phone" msgid="9166979577750581037">"Autoriser <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> à faire et à gérer des appels téléphoniques?"</string> <string name="permgrouplab_sensors" msgid="4838614103153567532">"Capteurs corporels"</string> <string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs sur vos signes vitaux"</string> <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder aux données des capteurs pour vos signes vitaux?"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 4e9b0d272c25..d05a184f3e7e 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -116,7 +116,7 @@ <string name="roamingText6" msgid="2059440825782871513">"रोमिंग - उपलब्ध सिस्टम"</string> <string name="roamingText7" msgid="7112078724097233605">"रोमिंग - गठबंधन सहयोगी"</string> <string name="roamingText8" msgid="5989569778604089291">"रोमिंग - प्रीमियम सहयोगी"</string> - <string name="roamingText9" msgid="7969296811355152491">"रोमिंग - पूर्ण सेवा काम की क्षमता"</string> + <string name="roamingText9" msgid="7969296811355152491">"रोमिंग - पूरी सेवा काम की क्षमता"</string> <string name="roamingText10" msgid="3992906999815316417">"रोमिंग - आंशिक सेवा काम की क्षमता"</string> <string name="roamingText11" msgid="4154476854426920970">"रोमिंग बैनर चालू"</string> <string name="roamingText12" msgid="1189071119992726320">"रोमिंग बैनर बंद"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 69c53db396bb..ef6397af77f9 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -902,7 +902,7 @@ <string name="granularity_label_link" msgid="5815508880782488267">"링크"</string> <string name="granularity_label_line" msgid="5764267235026120888">"행"</string> <string name="factorytest_failed" msgid="5410270329114212041">"출고 테스트 불합격"</string> - <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST 작업은 /system/app 디렉토리에 설치된 패키지에 대해서만 지원됩니다."</string> + <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST 작업은 /system/app 디렉터리에 설치된 패키지에 대해서만 지원됩니다."</string> <string name="factorytest_no_action" msgid="872991874799998561">"FACTORY_TEST 작업을 제공하는 패키지가 없습니다."</string> <string name="factorytest_reboot" msgid="6320168203050791643">"다시 부팅"</string> <string name="js_dialog_title" msgid="1987483977834603872">"\'<xliff:g id="TITLE">%s</xliff:g>\' 페이지 내용:"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index b760e2824f2d..d8dde58a5a3d 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -296,7 +296,7 @@ <string name="permgrouprequest_storage" msgid="7885942926944299560">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား သင့်ဖုန်းရှိ ဓာတ်ပုံများ၊ မီဒီယာနှင့် ဖိုင်များ ဝင်သုံးခွင့်ပေးလိုပါသလား။"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"မိုက်ခရိုဖုန်း"</string> <string name="permgroupdesc_microphone" msgid="4988812113943554584">"အသံဖမ်းခြင်း"</string> - <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား အသံဖမ်းယူခွင့် ပေးလိုပါသလား။"</string> + <string name="permgrouprequest_microphone" msgid="9167492350681916038">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ကို အသံဖမ်းယူခွင့် ပေးလိုပါသလား။"</string> <string name="permgrouplab_activityRecognition" msgid="1565108047054378642">"ကိုယ်လက်လှုပ်ရှားမှု"</string> <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> @@ -308,7 +308,7 @@ <string name="permgrouprequest_calllog" msgid="8487355309583773267">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား သင်၏ခေါ်ဆိုထားသော မှတ်တမ်းများကို သုံးခွင့်ပေးလိုပါသလား။"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"ဖုန်း"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ရန်နှင့် စီမံရန်"</string> - <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ခွင့်နှင့် စီမံခွင့်ပေးလိုပါသလား။"</string> + <string name="permgrouprequest_phone" msgid="9166979577750581037">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ကို ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ခွင့်နှင့် စီမံခွင့်ပေးလိုပါသလား။"</string> <string name="permgrouplab_sensors" msgid="4838614103153567532">"စက်၏ အာရုံခံစနစ်များ"</string> <string name="permgroupdesc_sensors" msgid="7147968539346634043">"သင်၏ အဓိကကျသော လက္ခဏာများအကြောင်း အာရုံခံကိရိယာဒေတာကို ရယူသုံးစွဲရန်"</string> <string name="permgrouprequest_sensors" msgid="6349806962814556786">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> အား သင်၏ အရေးကြီးသောလက္ခဏာ အာရုံခံကိရိယာ ဒေတာများကို သုံးခွင့်ပေးလိုပါသလား။"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 6e2ba99ac567..c48668a91461 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -308,7 +308,7 @@ <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie rekodi zako za nambari za simu?"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"Simu"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"piga na udhibiti simu"</string> - <string name="permgrouprequest_phone" msgid="9166979577750581037">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ipige na kudhibiti simu?"</string> + <string name="permgrouprequest_phone" msgid="9166979577750581037">"Ungependa kuruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> kupiga na kudhibiti simu?"</string> <string name="permgrouplab_sensors" msgid="4838614103153567532">"Vihisi vya mwili"</string> <string name="permgroupdesc_sensors" msgid="7147968539346634043">"fikia data ya kitambuzi kuhusu alama zako muhimu"</string> <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Ungependa kuiruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie data ya vitambuzi kuhusu viashiria muhimu vya mwili wako?"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 30001b198c53..5e150c594b2b 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -131,8 +131,7 @@ <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> வைஃபை அழைப்பு"</string> - <!-- no translation found for wfcSpnFormat_spn_wifi_calling_vo_hyphen (1730997175789582756) --> - <skip /> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="1730997175789582756">"<xliff:g id="SPN">%s</xliff:g> வைஃபை அழைப்பு"</string> <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN அழைப்பு"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN அழைப்பு"</string> <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> வைஃபை"</string> diff --git a/core/tests/coretests/src/android/content/ContextTest.java b/core/tests/coretests/src/android/content/ContextTest.java index 2f442c34f2c1..b1a54dcced46 100644 --- a/core/tests/coretests/src/android/content/ContextTest.java +++ b/core/tests/coretests/src/android/content/ContextTest.java @@ -19,6 +19,7 @@ package android.content; import static org.junit.Assert.assertEquals; import android.app.ActivityThread; +import android.os.UserHandle; import android.view.WindowManager; import androidx.test.InstrumentationRegistry; @@ -58,4 +59,32 @@ public class ContextTest { assertEquals(defaultDisplayContext.getDisplay().getDisplayId(), defaultDisplayContext.getDisplayId()); } + + @Test(expected = NullPointerException.class) + public void testStartActivityAsUserNullIntentNullUser() { + final Context testContext = + InstrumentationRegistry.getInstrumentation().getTargetContext(); + testContext.startActivityAsUser(null, null); + } + + @Test(expected = NullPointerException.class) + public void testStartActivityAsUserNullIntentNonNullUser() { + final Context testContext = + InstrumentationRegistry.getInstrumentation().getTargetContext(); + testContext.startActivityAsUser(null, new UserHandle(UserHandle.USER_ALL)); + } + + @Test(expected = NullPointerException.class) + public void testStartActivityAsUserNonNullIntentNullUser() { + final Context testContext = + InstrumentationRegistry.getInstrumentation().getTargetContext(); + testContext.startActivityAsUser(new Intent(), null); + } + + @Test(expected = RuntimeException.class) + public void testStartActivityAsUserNonNullIntentNonNullUser() { + final Context testContext = + InstrumentationRegistry.getInstrumentation().getTargetContext(); + testContext.startActivityAsUser(new Intent(), new UserHandle(UserHandle.USER_ALL)); + } } diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 9d5846440a13..cd36ba746a39 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -397,9 +397,6 @@ public class SettingsBackupTest { Settings.Global.POWER_MANAGER_CONSTANTS, Settings.Global.PREFERRED_NETWORK_MODE, Settings.Global.PRIVATE_DNS_DEFAULT_MODE, - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_NON_PRIV_CHECK_RELAXED, - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_PRIV_CHECK_RELAXED, - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_3P_CHECK_RELAXED, Settings.Global.PROVISIONING_APN_ALARM_DELAY_IN_MS, Settings.Global.RADIO_BLUETOOTH, Settings.Global.RADIO_CELL, @@ -495,6 +492,7 @@ public class SettingsBackupTest { Settings.Global.GLOBAL_SETTINGS_ANGLE_WHITELIST, Settings.Global.GAME_DRIVER_ALL_APPS, Settings.Global.GAME_DRIVER_OPT_IN_APPS, + Settings.Global.GAME_DRIVER_PRERELEASE_OPT_IN_APPS, Settings.Global.GAME_DRIVER_OPT_OUT_APPS, Settings.Global.GAME_DRIVER_BLACKLISTS, Settings.Global.GAME_DRIVER_BLACKLIST, diff --git a/data/keyboards/Vendor_045e_Product_028e.kl b/data/keyboards/Vendor_045e_Product_028e.kl index 301601a1ffdd..e4f48f9fb326 100644 --- a/data/keyboards/Vendor_045e_Product_028e.kl +++ b/data/keyboards/Vendor_045e_Product_028e.kl @@ -22,9 +22,7 @@ key 307 BUTTON_X key 308 BUTTON_Y key 310 BUTTON_L1 key 311 BUTTON_R1 -key 314 BACK -key 315 BUTTON_START -key 316 HOME + key 317 BUTTON_THUMBL key 318 BUTTON_THUMBR @@ -44,3 +42,14 @@ axis 0x05 RTRIGGER # Hat. axis 0x10 HAT_X axis 0x11 HAT_Y + +# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt + +# Button labeled as "BACK" (left-pointing triangle) +key 314 BUTTON_SELECT + +# The branded "X" button in the center of the controller +key 316 BUTTON_MODE + +# Button labeled as "START" (right-pointing triangle) +key 315 BUTTON_START diff --git a/data/keyboards/Vendor_045e_Product_02d1.kl b/data/keyboards/Vendor_045e_Product_02d1.kl index 5d1637bb012d..086767075941 100644 --- a/data/keyboards/Vendor_045e_Product_02d1.kl +++ b/data/keyboards/Vendor_045e_Product_02d1.kl @@ -13,20 +13,22 @@ # limitations under the License. # -# XBox One USB Controller +# XBox One Controller - Model 1537 - USB # +# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html + key 304 BUTTON_A key 305 BUTTON_B key 307 BUTTON_X key 308 BUTTON_Y + key 310 BUTTON_L1 key 311 BUTTON_R1 -key 314 BACK -key 315 BUTTON_START -key 316 HOME -key 317 BUTTON_THUMBL -key 318 BUTTON_THUMBR + +# Triggers. +axis 0x02 LTRIGGER +axis 0x05 RTRIGGER # Left and right stick. # The reported value for flat is 128 out of a range from -32767 to 32768, which is absurd. @@ -37,10 +39,19 @@ axis 0x01 Y flat 4096 axis 0x03 Z flat 4096 axis 0x04 RZ flat 4096 -# Triggers. -axis 0x02 LTRIGGER -axis 0x05 RTRIGGER +key 317 BUTTON_THUMBL +key 318 BUTTON_THUMBR # Hat. axis 0x10 HAT_X axis 0x11 HAT_Y + + +# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt +# Two overlapping rectangles +key 314 BUTTON_SELECT +# Hamburger - 3 parallel lines +key 315 BUTTON_START + +# Xbox key +key 316 BUTTON_MODE diff --git a/data/keyboards/Vendor_045e_Product_02ea.kl b/data/keyboards/Vendor_045e_Product_02ea.kl new file mode 100644 index 000000000000..3b46db2ce930 --- /dev/null +++ b/data/keyboards/Vendor_045e_Product_02ea.kl @@ -0,0 +1,57 @@ +# 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. + +# +# XBox One Controller - Model 1708 - USB +# + +# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html + +key 304 BUTTON_A +key 305 BUTTON_B +key 307 BUTTON_X +key 308 BUTTON_Y + +key 310 BUTTON_L1 +key 311 BUTTON_R1 + +# Triggers. +axis 0x02 LTRIGGER +axis 0x05 RTRIGGER + +# Left and right stick. +# The reported value for flat is 128 out of a range from -32767 to 32768, which is absurd. +# This confuses applications that rely on the flat value because the joystick actually +# settles in a flat range of +/- 4096 or so. +axis 0x00 X flat 4096 +axis 0x01 Y flat 4096 +axis 0x03 Z flat 4096 +axis 0x04 RZ flat 4096 + +key 317 BUTTON_THUMBL +key 318 BUTTON_THUMBR + +# Hat. +axis 0x10 HAT_X +axis 0x11 HAT_Y + + +# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt +# Two overlapping rectangles +key 314 BUTTON_SELECT +# Hamburger - 3 parallel lines +key 315 BUTTON_START + +# Xbox key +key 316 BUTTON_MODE diff --git a/data/keyboards/Vendor_045e_Product_02fd.kl b/data/keyboards/Vendor_045e_Product_02fd.kl new file mode 100644 index 000000000000..512f7e134978 --- /dev/null +++ b/data/keyboards/Vendor_045e_Product_02fd.kl @@ -0,0 +1,57 @@ +# 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. + +# +# XBox One Controller - Model 1708 - Bluetooth +# + +# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html + +key 304 BUTTON_A +key 305 BUTTON_B +key 307 BUTTON_X +key 308 BUTTON_Y + +key 310 BUTTON_L1 +key 311 BUTTON_R1 + +# Triggers. +axis 0x0a LTRIGGER +axis 0x09 RTRIGGER + +# Left and right stick. +# The reported value for flat is 128 out of a range from -32767 to 32768, which is absurd. +# This confuses applications that rely on the flat value because the joystick actually +# settles in a flat range of +/- 4096 or so. +axis 0x00 X flat 4096 +axis 0x01 Y flat 4096 +axis 0x02 Z flat 4096 +axis 0x05 RZ flat 4096 + +key 317 BUTTON_THUMBL +key 318 BUTTON_THUMBR + +# Hat. +axis 0x10 HAT_X +axis 0x11 HAT_Y + + +# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt +# Two overlapping rectangles +key 158 BUTTON_SELECT +# Hamburger - 3 parallel lines +key 315 BUTTON_START + +# Xbox key +key 172 BUTTON_MODE diff --git a/data/keyboards/Vendor_057e_Product_2009.kl b/data/keyboards/Vendor_057e_Product_2009.kl new file mode 100644 index 000000000000..b36e946a547f --- /dev/null +++ b/data/keyboards/Vendor_057e_Product_2009.kl @@ -0,0 +1,68 @@ +# 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. + +# +# Nintendo Switch Pro Controller - HAC-013 - Bluetooth +# + + +# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html + +# Button labeled as "Y" but should really produce keycode "X" +key 0x132 BUTTON_X +# Button labeled as "B" but should really produce keycode "A" +key 0x130 BUTTON_A +# Button labeled as "A" but should really produce keycode "B" +key 0x131 BUTTON_B +# Button labeled as "X" but should really product keycode "Y" +key 0x133 BUTTON_Y + +# Button labeled as "L" +key 0x134 BUTTON_L1 +# Button labeled as "R" +key 0x135 BUTTON_R1 + +# No LT / RT axes on this controller. Instead, there are keys. +# Trigger labeled as "ZL" +key 0x136 BUTTON_L2 +# Trigger labeled as "ZR" +key 0x137 BUTTON_R2 + +# Left Analog Stick +axis 0x00 X +axis 0x01 Y +# Right Analog Stick +axis 0x03 Z +axis 0x04 RZ + +# Left stick click (generates linux BTN_SELECT) +key 0x13a BUTTON_THUMBL +# Right stick click (generates linux BTN_START) +key 0x13b BUTTON_THUMBR + +# Hat +axis 0x10 HAT_X +axis 0x11 HAT_Y + +# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt +# Minus +key 0x138 BUTTON_SELECT +# Plus +key 0x139 BUTTON_START + +# Circle +key 0x13d BUTTON_MODE + +# Home key +key 0x13c HOME diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index e0ed3e4940a8..b73347b233d7 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -264,6 +264,12 @@ void RenderNode::syncProperties() { } void RenderNode::pushStagingPropertiesChanges(TreeInfo& info) { + if (mPositionListenerDirty) { + mPositionListener = std::move(mStagingPositionListener); + mStagingPositionListener = nullptr; + mPositionListenerDirty = false; + } + // Push the animators first so that setupStartValueIfNecessary() is called // before properties() is trampled by stagingProperties(), as they are // required by some animators. diff --git a/libs/hwui/RenderNode.h b/libs/hwui/RenderNode.h index 23e7a0e60554..c6db7f1ba60d 100644 --- a/libs/hwui/RenderNode.h +++ b/libs/hwui/RenderNode.h @@ -188,11 +188,9 @@ public: virtual void onPositionLost(RenderNode& node, const TreeInfo* info) = 0; }; - // Note this is not thread safe, this needs to be called - // before the RenderNode is used for drawing. - // RenderNode takes ownership of the pointer ANDROID_API void setPositionListener(PositionListener* listener) { - mPositionListener = listener; + mStagingPositionListener = listener; + mPositionListenerDirty = true; } // This is only modified in MODE_FULL, so it can be safely accessed @@ -275,6 +273,8 @@ private: // mDisplayList, not mStagingDisplayList. uint32_t mParentCount; + bool mPositionListenerDirty = false; + sp<PositionListener> mStagingPositionListener; sp<PositionListener> mPositionListener; UsageHint mUsageHint = UsageHint::Unknown; diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index 8373761962ac..16b01252fb81 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -63,6 +63,7 @@ import com.android.systemui.SystemUIFactory; import com.android.systemui.classifier.FalsingLog; import com.android.systemui.classifier.FalsingManagerFactory; import com.android.systemui.fragments.FragmentHostManager; +import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.plugins.qs.QS; import com.android.systemui.qs.car.CarQSFragment; import com.android.systemui.shared.system.ActivityManagerWrapper; @@ -127,6 +128,7 @@ public class CarStatusBar extends StatusBar implements private SwitchToGuestTimer mSwitchToGuestTimer; private NotificationDataManager mNotificationDataManager; private NotificationClickHandlerFactory mNotificationClickHandlerFactory; + private ScreenLifecycle mScreenLifecycle; // The container for the notifications. private CarNotificationView mNotificationView; @@ -230,6 +232,9 @@ public class CarStatusBar extends StatusBar implements mPowerManagerHelper.connectToCarService(); mSwitchToGuestTimer = new SwitchToGuestTimer(mContext); + + mScreenLifecycle = Dependency.get(ScreenLifecycle.class); + mScreenLifecycle.addObserver(mScreenObserver); } /** @@ -315,7 +320,6 @@ public class CarStatusBar extends StatusBar implements public void showKeyguard() { super.showKeyguard(); updateNavBarForKeyguardContent(); - dismissKeyguardWhenUserSwitcherNotDisplayed(); } /** @@ -978,6 +982,13 @@ public class CarStatusBar extends StatusBar implements } } + final ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() { + @Override + public void onScreenTurnedOn() { + dismissKeyguardWhenUserSwitcherNotDisplayed(); + } + }; + // We automatically dismiss keyguard unless user switcher is being shown on the keyguard. private void dismissKeyguardWhenUserSwitcherNotDisplayed() { if (mFullscreenUserSwitcher == null) { @@ -1000,6 +1011,10 @@ public class CarStatusBar extends StatusBar implements * Dismisses the keyguard and shows bouncer if authentication is necessary. */ public void dismissKeyguard() { + // Don't dismiss keyguard when the screen is off. + if (mScreenLifecycle.getScreenState() == ScreenLifecycle.SCREEN_OFF) { + return; + } executeRunnableDismissingKeyguard(null/* runnable */, null /* cancelAction */, true /* dismissShade */, true /* afterKeyguardGone */, true /* deferred */); } diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java index 93f24f7881a6..4f85eea13dca 100755 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java @@ -130,18 +130,15 @@ public class InstallInstalling extends AlertActivity { } else { PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); - params.installFlags = PackageManager.INSTALL_FULL_APP; - params.referrerUri = getIntent().getParcelableExtra(Intent.EXTRA_REFERRER); - params.originatingUri = getIntent() - .getParcelableExtra(Intent.EXTRA_ORIGINATING_URI); - params.originatingUid = getIntent().getIntExtra(Intent.EXTRA_ORIGINATING_UID, - UID_UNKNOWN); - params.installerPackageName = - getIntent().getStringExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME); - params.installReason = PackageManager.INSTALL_REASON_USER; - - // Whitelist all restricted permissions. - params.setWhitelistedRestrictedPermissions(null /*permissions*/); + params.setInstallAsInstantApp(false); + params.setReferrerUri(getIntent().getParcelableExtra(Intent.EXTRA_REFERRER)); + params.setOriginatingUri(getIntent() + .getParcelableExtra(Intent.EXTRA_ORIGINATING_URI)); + params.setOriginatingUid(getIntent().getIntExtra(Intent.EXTRA_ORIGINATING_UID, + UID_UNKNOWN)); + params.setInstallerPackageName(getIntent().getStringExtra( + Intent.EXTRA_INSTALLER_PACKAGE_NAME)); + params.setInstallReason(PackageManager.INSTALL_REASON_USER); File file = new File(mPackageURI.getPath()); try { diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java index 98eb57300f0b..c7380c580e2f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java +++ b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java @@ -132,6 +132,7 @@ public class SignalDrawable extends DrawableWrapper { super.onLevelChange(unpackLevel(packedState)); updateAnimation(); setTintList(ColorStateList.valueOf(mForegroundPaint.getColor())); + invalidateSelf(); return true; } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 636808ebcb66..3cd82dfca6b6 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -716,6 +716,9 @@ class SettingsProtoDumpUtil { Settings.Global.GAME_DRIVER_OPT_IN_APPS, GlobalSettingsProto.Gpu.GAME_DRIVER_OPT_IN_APPS); dumpSetting(s, p, + Settings.Global.GAME_DRIVER_PRERELEASE_OPT_IN_APPS, + GlobalSettingsProto.Gpu.GAME_DRIVER_PRERELEASE_OPT_IN_APPS); + dumpSetting(s, p, Settings.Global.GAME_DRIVER_OPT_OUT_APPS, GlobalSettingsProto.Gpu.GAME_DRIVER_OPT_OUT_APPS); dumpSetting(s, p, diff --git a/packages/SystemUI/legacy/recents/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/legacy/recents/src/com/android/systemui/recents/RecentsActivity.java index 79c691cf45e1..a7ccc3a49073 100644 --- a/packages/SystemUI/legacy/recents/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/legacy/recents/src/com/android/systemui/recents/RecentsActivity.java @@ -323,7 +323,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD mColorExtractor = Dependency.get(SysuiColorExtractor.class); mColorExtractor.addOnColorsChangedListener(this); mUsingDarkText = mColorExtractor.getColors(ColorExtractor.TYPE_DARK, - WallpaperManager.FLAG_SYSTEM, true).supportsDarkText(); + WallpaperManager.FLAG_SYSTEM).supportsDarkText(); setTheme(mUsingDarkText ? R.style.RecentsTheme_Wallpaper_Light : R.style.RecentsTheme_Wallpaper); @@ -394,8 +394,6 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD @Override public void onColorsChanged(ColorExtractor colorExtractor, int which) { if ((which & WallpaperManager.FLAG_SYSTEM) != 0) { - // Recents doesn't care about the wallpaper being visible or not, it always - // wants to scrim with wallpaper colors ColorExtractor.GradientColors colors = mColorExtractor.getNeutralColors(); boolean darkText = colors.supportsDarkText(); if (darkText != mUsingDarkText) { diff --git a/packages/SystemUI/res-keyguard/values/styles.xml b/packages/SystemUI/res-keyguard/values/styles.xml index 9a042228435b..67c4458de2f2 100644 --- a/packages/SystemUI/res-keyguard/values/styles.xml +++ b/packages/SystemUI/res-keyguard/values/styles.xml @@ -111,7 +111,7 @@ <item name="android:colorBackground">@*android:color/background_material_dark</item> </style> - <style name="TextAppearance.Keyguard" parent="Theme.SystemUI"> + <style name="TextAppearance.Keyguard"> <item name="android:textSize">@dimen/widget_title_font_size</item> <item name="android:gravity">center</item> <item name="android:ellipsize">end</item> diff --git a/packages/SystemUI/res/layout/notif_half_shelf.xml b/packages/SystemUI/res/layout/notif_half_shelf.xml index a563bb579540..26c887231349 100644 --- a/packages/SystemUI/res/layout/notif_half_shelf.xml +++ b/packages/SystemUI/res/layout/notif_half_shelf.xml @@ -69,7 +69,7 @@ <Switch android:id="@+id/toggle" - android:layout_height="wrap_content" + android:layout_height="48dp" android:layout_width="wrap_content" android:layout_gravity="center_vertical" android:padding="8dp" /> diff --git a/packages/SystemUI/res/layout/notif_half_shelf_row.xml b/packages/SystemUI/res/layout/notif_half_shelf_row.xml index 1b804556d146..b95d5e9a43f6 100644 --- a/packages/SystemUI/res/layout/notif_half_shelf_row.xml +++ b/packages/SystemUI/res/layout/notif_half_shelf_row.xml @@ -71,7 +71,7 @@ <Switch android:id="@+id/toggle" - android:layout_height="wrap_content" + android:layout_height="48dp" android:layout_width="wrap_content" android:layout_gravity="center_vertical" android:padding="8dp" diff --git a/packages/SystemUI/res/layout/status_bar_notification_section_header.xml b/packages/SystemUI/res/layout/status_bar_notification_section_header.xml index d3eb9aeb1710..eabc5c5f254e 100644 --- a/packages/SystemUI/res/layout/status_bar_notification_section_header.xml +++ b/packages/SystemUI/res/layout/status_bar_notification_section_header.xml @@ -49,6 +49,7 @@ android:text="@string/notification_section_header_gentle" android:textSize="12sp" android:textColor="@color/notification_section_header_label_color" + android:fontFamily="@*android:string/config_headlineFontFamilyMedium" /> <ImageView android:id="@+id/btn_clear_all" diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index b3877931bd4f..2f1770a39f02 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -450,7 +450,7 @@ <style name="TextAppearance.NotificationInfo.Secondary"> <item name="android:textSize">14sp</item> - <item name="android:alpha">0.54</item> + <item name="android:alpha">0.62</item> </style> <style name="TextAppearance.NotificationInfo.Title"> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java index bd7b3d598927..9ba21a328ca4 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java @@ -22,6 +22,7 @@ import android.graphics.Rect; import android.os.Handler; import android.os.Handler.Callback; import android.os.Message; +import android.os.Trace; import android.view.Surface; import android.view.View; import android.view.ViewRootImpl; @@ -95,6 +96,7 @@ public class SyncRtSurfaceTransactionApplierCompat { .sendToTarget(); return; } + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "Sync transaction frameNumber=" + frame); TransactionCompat t = new TransactionCompat(); for (int i = params.length - 1; i >= 0; i--) { SyncRtSurfaceTransactionApplierCompat.SurfaceParams surfaceParams = @@ -105,6 +107,7 @@ public class SyncRtSurfaceTransactionApplierCompat { } t.setEarlyWakeup(); t.apply(); + Trace.traceEnd(Trace.TRACE_TAG_VIEW); Message.obtain(mApplyHandler, MSG_UPDATE_SEQUENCE_NUMBER, toApplySeqNo, 0) .sendToTarget(); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index 0bb9e744f2b6..7ec1bda26cf8 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -374,7 +374,7 @@ public class KeyguardClockSwitch extends RelativeLayout { private void updateColors() { ColorExtractor.GradientColors colors = mSysuiColorExtractor.getColors( - WallpaperManager.FLAG_LOCK, true); + WallpaperManager.FLAG_LOCK); mSupportsDarkText = colors.supportsDarkText(); mColorPalette = colors.getColorPalette(); if (mClockPlugin != null) { diff --git a/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java index f468ecaae4c1..558ac4b564d1 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java @@ -130,7 +130,7 @@ public class AnalogClockController implements ClockPlugin { setDarkAmount(1f); setTextColor(Color.WHITE); ColorExtractor.GradientColors colors = mColorExtractor.getColors( - WallpaperManager.FLAG_LOCK, true); + WallpaperManager.FLAG_LOCK); setColorPalette(colors.supportsDarkText(), colors.getColorPalette()); onTimeTick(); diff --git a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java index 61a6952cacac..bdf9dc4865b2 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java @@ -130,7 +130,7 @@ public class BubbleClockController implements ClockPlugin { setDarkAmount(1f); setTextColor(Color.WHITE); ColorExtractor.GradientColors colors = mColorExtractor.getColors( - WallpaperManager.FLAG_LOCK, true); + WallpaperManager.FLAG_LOCK); setColorPalette(colors.supportsDarkText(), colors.getColorPalette()); onTimeTick(); diff --git a/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java index ce1f09c9355c..98679ade1022 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/DefaultClockController.java @@ -124,7 +124,7 @@ public class DefaultClockController implements ClockPlugin { setDarkAmount(1f); setTextColor(Color.WHITE); ColorExtractor.GradientColors colors = mColorExtractor.getColors( - WallpaperManager.FLAG_LOCK, true); + WallpaperManager.FLAG_LOCK); setColorPalette(colors.supportsDarkText(), colors.getColorPalette()); onTimeTick(); diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index 7d36469bb905..73e57de3f915 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -64,6 +64,7 @@ import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewTreeObserver; import android.view.WindowManager; +import android.view.animation.AccelerateInterpolator; import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; import android.widget.FrameLayout; @@ -231,7 +232,10 @@ public class ScreenDecorations extends SystemUI implements Tunable, anim.start(); } else { view.animate().cancel(); - view.animate().setDuration(400).alpha(0f); + view.animate() + .setInterpolator(new AccelerateInterpolator(1.5f)) + .setDuration(250) + .alpha(0f); } } @@ -764,6 +768,10 @@ public class ScreenDecorations extends SystemUI implements Tunable, @Override public void onDarkIntensity(float darkIntensity) { + if (!mHandler.getLooper().isCurrentThread()) { + mHandler.post(() -> onDarkIntensity(darkIntensity)); + return; + } if (mOverlay != null) { CornerHandleView assistHintTopLeft = mOverlay.findViewById(R.id.assist_hint_left); CornerHandleView assistHintTopRight = mOverlay.findViewById(R.id.assist_hint_right); diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java index 87fb28b4c65e..909b68b52e3f 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java @@ -16,14 +16,13 @@ package com.android.systemui.assist; -import static com.android.systemui.shared.system.PackageManagerWrapper.ACTION_PREFERRED_ACTIVITY_CHANGED; - import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ResolveInfo; import android.os.Handler; import android.os.SystemClock; import android.provider.Settings; @@ -44,6 +43,7 @@ import com.android.systemui.statusbar.StatusBarState; import java.io.PrintWriter; import java.time.LocalDate; import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; /** @@ -68,6 +68,14 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { private static final boolean DEFAULT_SUPPRESS_ON_LAUNCHER = false; private static final boolean DEFAULT_SUPPRESS_ON_APPS = false; + private static final String[] DEFAULT_HOME_CHANGE_ACTIONS = new String[] { + PackageManagerWrapper.ACTION_PREFERRED_ACTIVITY_CHANGED, + Intent.ACTION_BOOT_COMPLETED, + Intent.ACTION_PACKAGE_ADDED, + Intent.ACTION_PACKAGE_CHANGED, + Intent.ACTION_PACKAGE_REMOVED + }; + private final StatusBarStateController.StateListener mStatusBarStateListener = new StatusBarStateController.StateListener() { @Override @@ -110,8 +118,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { mDefaultHome = getCurrentDefaultHome(); } }; - private final IntentFilter mDefaultHomeIntentFilter = - new IntentFilter(ACTION_PREFERRED_ACTIVITY_CHANGED); + private final IntentFilter mDefaultHomeIntentFilter; private final Runnable mResetConsecutiveTaskSwitches = this::resetConsecutiveTaskSwitches; private final Handler mHandler; @@ -146,6 +153,10 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { mStatusBarStateController = Dependency.get(StatusBarStateController.class); mActivityManagerWrapper = ActivityManagerWrapper.getInstance(); mOverviewProxyService = Dependency.get(OverviewProxyService.class); + mDefaultHomeIntentFilter = new IntentFilter(); + for (String action : DEFAULT_HOME_CHANGE_ACTIONS) { + mDefaultHomeIntentFilter.addAction(action); + } } @Override @@ -205,7 +216,24 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { @Nullable private static ComponentName getCurrentDefaultHome() { - return PackageManagerWrapper.getInstance().getHomeActivities(new ArrayList<>()); + List<ResolveInfo> homeActivities = new ArrayList<>(); + ComponentName defaultHome = + PackageManagerWrapper.getInstance().getHomeActivities(homeActivities); + if (defaultHome != null) { + return defaultHome; + } + + int topPriority = Integer.MIN_VALUE; + ComponentName topComponent = null; + for (ResolveInfo resolveInfo : homeActivities) { + if (resolveInfo.priority > topPriority) { + topComponent = resolveInfo.activityInfo.getComponentName(); + topPriority = resolveInfo.priority; + } else if (resolveInfo.priority == topPriority) { + topComponent = null; + } + } + return topComponent; } private void handleStatusBarStateChanged(int newState) { diff --git a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java index 1fd3089aaa41..e73dc4a57bd7 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java @@ -16,8 +16,6 @@ package com.android.systemui.assist; -import static com.android.systemui.shared.system.PackageManagerWrapper.ACTION_PREFERRED_ACTIVITY_CHANGED; - import android.app.ActivityManager; import android.app.KeyguardManager; import android.content.BroadcastReceiver; @@ -25,6 +23,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ResolveInfo; import androidx.annotation.Nullable; @@ -38,6 +37,7 @@ import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.StatusBar; import java.util.ArrayList; +import java.util.List; /** Class to monitor and report the state of the phone. */ final class PhoneStateMonitor { @@ -53,6 +53,14 @@ final class PhoneStateMonitor { private static final int PHONE_STATE_APP_IMMERSIVE = 9; private static final int PHONE_STATE_APP_FULLSCREEN = 10; + private static final String[] DEFAULT_HOME_CHANGE_ACTIONS = new String[] { + PackageManagerWrapper.ACTION_PREFERRED_ACTIVITY_CHANGED, + Intent.ACTION_BOOT_COMPLETED, + Intent.ACTION_PACKAGE_ADDED, + Intent.ACTION_PACKAGE_CHANGED, + Intent.ACTION_PACKAGE_REMOVED + }; + private final Context mContext; private final StatusBarStateController mStatusBarStateController; @@ -64,14 +72,17 @@ final class PhoneStateMonitor { mStatusBarStateController = Dependency.get(StatusBarStateController.class); ActivityManagerWrapper activityManagerWrapper = ActivityManagerWrapper.getInstance(); - mDefaultHome = PackageManagerWrapper.getInstance().getHomeActivities(new ArrayList<>()); + mDefaultHome = getCurrentDefaultHome(); + IntentFilter intentFilter = new IntentFilter(); + for (String action : DEFAULT_HOME_CHANGE_ACTIONS) { + intentFilter.addAction(action); + } mContext.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - mDefaultHome = - PackageManagerWrapper.getInstance().getHomeActivities(new ArrayList<>()); + mDefaultHome = getCurrentDefaultHome(); } - }, new IntentFilter(ACTION_PREFERRED_ACTIVITY_CHANGED)); + }, intentFilter); mLauncherShowing = isLauncherShowing(activityManagerWrapper.getRunningTask()); activityManagerWrapper.registerTaskStackListener(new TaskStackChangeListener() { @Override @@ -93,6 +104,28 @@ final class PhoneStateMonitor { return phoneState; } + @Nullable + private static ComponentName getCurrentDefaultHome() { + List<ResolveInfo> homeActivities = new ArrayList<>(); + ComponentName defaultHome = + PackageManagerWrapper.getInstance().getHomeActivities(homeActivities); + if (defaultHome != null) { + return defaultHome; + } + + int topPriority = Integer.MIN_VALUE; + ComponentName topComponent = null; + for (ResolveInfo resolveInfo : homeActivities) { + if (resolveInfo.priority > topPriority) { + topComponent = resolveInfo.activityInfo.getComponentName(); + topPriority = resolveInfo.priority; + } else if (resolveInfo.priority == topPriority) { + topComponent = null; + } + } + return topComponent; + } + private int getPhoneLockscreenState() { if (isDozing()) { return PHONE_STATE_AOD1; diff --git a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java index 835ffc976e9f..6f56a53c1c49 100644 --- a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java +++ b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java @@ -16,18 +16,11 @@ package com.android.systemui.colorextraction; -import android.annotation.ColorInt; import android.app.WallpaperColors; import android.app.WallpaperManager; import android.content.Context; -import android.os.Handler; -import android.os.RemoteException; +import android.graphics.Color; import android.os.UserHandle; -import android.util.Log; -import android.view.Display; -import android.view.IWallpaperVisibilityListener; -import android.view.IWindowManager; -import android.view.WindowManagerGlobal; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor; @@ -52,46 +45,28 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, ConfigurationController.ConfigurationListener { private static final String TAG = "SysuiColorExtractor"; private final Tonal mTonal; - private boolean mWallpaperVisible; - private boolean mHasBackdrop; - // Colors to return when the wallpaper isn't visible - private final GradientColors mWpHiddenColors; + private boolean mHasMediaArtwork; + private final GradientColors mNeutralColorsLock; + private final GradientColors mBackdropColors; @Inject public SysuiColorExtractor(Context context, ConfigurationController configurationController) { - this(context, new Tonal(context), configurationController, true); + this(context, new Tonal(context), configurationController, + context.getSystemService(WallpaperManager.class), false /* immediately */); } @VisibleForTesting public SysuiColorExtractor(Context context, ExtractionType type, - ConfigurationController configurationController, boolean registerVisibility) { - super(context, type, false /* immediately */); + ConfigurationController configurationController, + WallpaperManager wallpaperManager, boolean immediately) { + super(context, type, immediately, wallpaperManager); mTonal = type instanceof Tonal ? (Tonal) type : new Tonal(context); - mWpHiddenColors = new GradientColors(); + mNeutralColorsLock = new GradientColors(); configurationController.addCallback(this); - WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM); - updateDefaultGradients(systemColors); - - if (registerVisibility) { - try { - IWindowManager windowManagerService = WindowManagerGlobal.getWindowManagerService(); - Handler handler = Handler.getMain(); - boolean visible = windowManagerService.registerWallpaperVisibilityListener( - new IWallpaperVisibilityListener.Stub() { - @Override - public void onWallpaperVisibilityChanged(boolean newVisibility, - int displayId) throws RemoteException { - handler.post(() -> setWallpaperVisible(newVisibility)); - } - }, Display.DEFAULT_DISPLAY); - setWallpaperVisible(visible); - } catch (RemoteException e) { - Log.w(TAG, "Can't listen to wallpaper visibility changes", e); - } - } + mBackdropColors = new GradientColors(); + mBackdropColors.setMainColor(Color.BLACK); - WallpaperManager wallpaperManager = context.getSystemService(WallpaperManager.class); if (wallpaperManager != null) { // Listen to all users instead of only the current one. wallpaperManager.removeOnColorsChangedListener(this); @@ -100,8 +75,14 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, } } - private void updateDefaultGradients(WallpaperColors colors) { - mTonal.applyFallback(colors, mWpHiddenColors); + @Override + protected void extractWallpaperColors() { + super.extractWallpaperColors(); + // mTonal is final but this method will be invoked by the base class during its ctor. + if (mTonal == null) { + return; + } + mTonal.applyFallback(mLockColors == null ? mSystemColors : mLockColors, mNeutralColorsLock); } @Override @@ -110,27 +91,28 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, // Colors do not belong to current user, ignoring. return; } - - super.onColorsChanged(colors, which); - - if ((which & WallpaperManager.FLAG_SYSTEM) != 0) { - @ColorInt int oldColor = mWpHiddenColors.getMainColor(); - updateDefaultGradients(colors); - if (oldColor != mWpHiddenColors.getMainColor()) { - triggerColorsChanged(WallpaperManager.FLAG_SYSTEM); - } + if ((which & WallpaperManager.FLAG_LOCK) != 0) { + mTonal.applyFallback(colors, mNeutralColorsLock); } + super.onColorsChanged(colors, which); } @Override public void onUiModeChanged() { - WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM); - updateDefaultGradients(systemColors); - triggerColorsChanged(WallpaperManager.FLAG_SYSTEM); + extractWallpaperColors(); + triggerColorsChanged(WallpaperManager.FLAG_SYSTEM | WallpaperManager.FLAG_LOCK); + } + + @Override + public GradientColors getColors(int which, int type) { + if (mHasMediaArtwork && (which & WallpaperManager.FLAG_LOCK) != 0) { + return mBackdropColors; + } + return super.getColors(which, type); } /** - * Colors the should be using for scrims. + * Colors that should be using for scrims. * * They will be: * - A light gray if the wallpaper is light @@ -138,81 +120,12 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, * - Black otherwise */ public GradientColors getNeutralColors() { - return mWpHiddenColors; - } - - /** - * Get TYPE_NORMAL colors when wallpaper is visible, or fallback otherwise. - * - * @param which FLAG_LOCK or FLAG_SYSTEM - * @return colors - */ - @Override - public GradientColors getColors(int which) { - return getColors(which, TYPE_DARK); - } - - /** - * Wallpaper colors when the wallpaper is visible, fallback otherwise. - * - * @param which FLAG_LOCK or FLAG_SYSTEM - * @param type TYPE_NORMAL, TYPE_DARK or TYPE_EXTRA_DARK - * @return colors - */ - @Override - public GradientColors getColors(int which, int type) { - return getColors(which, type, false /* ignoreVisibility */); - } - - /** - * Get TYPE_NORMAL colors, possibly ignoring wallpaper visibility. - * - * @param which FLAG_LOCK or FLAG_SYSTEM - * @param ignoreWallpaperVisibility whether you want fallback colors or not if the wallpaper - * isn't visible - * @return - */ - public GradientColors getColors(int which, boolean ignoreWallpaperVisibility) { - return getColors(which, TYPE_NORMAL, ignoreWallpaperVisibility); - } - - /** - * - * @param which FLAG_LOCK or FLAG_SYSTEM - * @param type TYPE_NORMAL, TYPE_DARK or TYPE_EXTRA_DARK - * @param ignoreWallpaperVisibility true if true wallpaper colors should be returning - * if it's visible or not - * @return colors - */ - public GradientColors getColors(int which, int type, boolean ignoreWallpaperVisibility) { - // mWallpaperVisible only handles the "system wallpaper" and will be always set to false - // if we have different lock and system wallpapers. - if (which == WallpaperManager.FLAG_SYSTEM) { - if (mWallpaperVisible || ignoreWallpaperVisibility) { - return super.getColors(which, type); - } else { - return mWpHiddenColors; - } - } else { - if (mHasBackdrop) { - return mWpHiddenColors; - } else { - return super.getColors(which, type); - } - } - } - - @VisibleForTesting - void setWallpaperVisible(boolean visible) { - if (mWallpaperVisible != visible) { - mWallpaperVisible = visible; - triggerColorsChanged(WallpaperManager.FLAG_SYSTEM); - } + return mHasMediaArtwork ? mBackdropColors : mNeutralColorsLock; } - public void setHasBackdrop(boolean hasBackdrop) { - if (mHasBackdrop != hasBackdrop) { - mHasBackdrop = hasBackdrop; + public void setHasMediaArtwork(boolean hasBackdrop) { + if (mHasMediaArtwork != hasBackdrop) { + mHasMediaArtwork = hasBackdrop; triggerColorsChanged(WallpaperManager.FLAG_LOCK); } } @@ -230,7 +143,8 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, pw.println(" Gradients:"); pw.println(" system: " + Arrays.toString(system)); pw.println(" lock: " + Arrays.toString(lock)); - pw.println(" Default scrim: " + mWpHiddenColors); + pw.println(" Neutral colors: " + mNeutralColorsLock); + pw.println(" Has media backdrop: " + mHasMediaArtwork); } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 831d07446e7c..5f52486b2bc6 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -70,11 +70,12 @@ public class DozeSensors { private final Consumer<Boolean> mProxCallback; private final Callback mCallback; @VisibleForTesting - protected final TriggerSensor[] mSensors; + protected TriggerSensor[] mSensors; private final Handler mHandler = new Handler(); private final ProxSensor mProxSensor; private long mDebounceFrom; + private boolean mSettingRegistered; public DozeSensors(Context context, AlarmManager alarmManager, SensorManager sensorManager, DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock, @@ -172,13 +173,8 @@ public class DozeSensors { public void setListening(boolean listen) { for (TriggerSensor s : mSensors) { s.setListening(listen); - if (listen) { - s.registerSettingsObserver(mSettingsObserver); - } - } - if (!listen) { - mResolver.unregisterContentObserver(mSettingsObserver); } + registerSettingsObserverIfNeeded(listen); } /** Set the listening state of only the sensors that require the touchscreen. */ @@ -240,6 +236,17 @@ public class DozeSensors { return mProxSensor.mCurrentlyFar; } + private void registerSettingsObserverIfNeeded(boolean register) { + if (!register) { + mResolver.unregisterContentObserver(mSettingsObserver); + } else if (!mSettingRegistered) { + for (TriggerSensor s : mSensors) { + s.registerSettingsObserver(mSettingsObserver); + } + } + mSettingRegistered = register; + } + private class ProxSensor implements SensorEventListener { boolean mRequested; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index 75ef18545fdf..6c36ab95f923 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -488,6 +488,7 @@ public class NotificationMediaManager implements Dumpable { if (bmp != null) { artworkDrawable = new BitmapDrawable(mBackdropBack.getResources(), bmp); } + boolean hasMediaArtwork = artworkDrawable != null; boolean allowWhenShade = false; if (ENABLE_LOCKSCREEN_WALLPAPER && artworkDrawable == null) { Bitmap lockWallpaper = @@ -506,7 +507,7 @@ public class NotificationMediaManager implements Dumpable { boolean hideBecauseOccluded = shadeController != null && shadeController.isOccluded(); final boolean hasArtwork = artworkDrawable != null; - mColorExtractor.setHasBackdrop(hasArtwork); + mColorExtractor.setHasMediaArtwork(hasMediaArtwork); if (mScrimController != null) { mScrimController.setHasBackdrop(hasArtwork); } 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 2bd09c8901bb..c21443128d13 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 @@ -20,7 +20,7 @@ import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters; import static com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.ANCHOR_SCROLLING; import static com.android.systemui.statusbar.notification.stack.StackStateAnimator.ANIMATION_DURATION_SWIPE; -import static com.android.systemui.statusbar.phone.NotificationIconAreaController.LOW_PRIORITY; +import static com.android.systemui.statusbar.phone.NotificationIconAreaController.HIGH_PRIORITY; import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; import static java.lang.annotation.RetentionPolicy.SOURCE; @@ -187,7 +187,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private int mCurrentStackHeight = Integer.MAX_VALUE; private final Paint mBackgroundPaint = new Paint(); private final boolean mShouldDrawNotificationBackground; - private boolean mLowPriorityBeforeSpeedBump; + private boolean mHighPriorityBeforeSpeedBump; private final boolean mAllowLongPress; private boolean mDismissRtl; @@ -584,12 +584,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd TunerService tunerService = Dependency.get(TunerService.class); tunerService.addTunable((key, newValue) -> { - if (key.equals(LOW_PRIORITY)) { - mLowPriorityBeforeSpeedBump = "1".equals(newValue); + if (key.equals(HIGH_PRIORITY)) { + mHighPriorityBeforeSpeedBump = "1".equals(newValue); } else if (key.equals(Settings.Secure.NOTIFICATION_DISMISS_RTL)) { updateDismissRtlSetting("1".equals(newValue)); } - }, LOW_PRIORITY, Settings.Secure.NOTIFICATION_DISMISS_RTL); + }, HIGH_PRIORITY, Settings.Secure.NOTIFICATION_DISMISS_RTL); mEntryManager.addNotificationEntryListener(new NotificationEntryListener() { @Override @@ -654,15 +654,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd @Override @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public void onThemeChanged() { - int which; - if (mStatusBarState == StatusBarState.KEYGUARD - || mStatusBarState == StatusBarState.SHADE_LOCKED) { - which = WallpaperManager.FLAG_LOCK; - } else { - which = WallpaperManager.FLAG_SYSTEM; - } - final boolean useDarkText = mColorExtractor.getColors(which, - true /* ignoreVisibility */).supportsDarkText(); + final boolean useDarkText = mColorExtractor.getNeutralColors().supportsDarkText(); updateDecorViews(useDarkText); updateFooter(); @@ -5765,10 +5757,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd ExpandableNotificationRow row = (ExpandableNotificationRow) view; currentIndex++; boolean beforeSpeedBump; - if (mLowPriorityBeforeSpeedBump) { - beforeSpeedBump = !row.getEntry().ambient; - } else { + if (mHighPriorityBeforeSpeedBump) { beforeSpeedBump = row.getEntry().isHighPriority(); + } else { + beforeSpeedBump = !row.getEntry().ambient; } if (beforeSpeedBump) { speedBumpIndex = currentIndex; 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 38ff468304b7..cc0bc5f160e4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java @@ -57,6 +57,7 @@ import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.WindowManagerWrapper; +import java.io.PrintWriter; import java.util.concurrent.Executor; /** @@ -118,7 +119,7 @@ public class EdgeBackGestureHandler implements DisplayListener { private final Region mExcludeRegion = new Region(); // The edge width where touch down is allowed - private final int mEdgeWidth; + private int mEdgeWidth; // The slop to distinguish between horizontal and vertical motion private final float mTouchSlop; // Duration after which we consider the event as longpress. @@ -163,10 +164,6 @@ public class EdgeBackGestureHandler implements DisplayListener { mWm = context.getSystemService(WindowManager.class); mOverviewProxyService = overviewProxyService; - // TODO: Get this for the current user - mEdgeWidth = res.getDimensionPixelSize( - com.android.internal.R.dimen.config_backGestureInset); - // Reduce the default touch slop to ensure that we can intercept the gesture // before the app starts to react to it. // TODO(b/130352502) Tune this value and extract into a constant @@ -176,6 +173,12 @@ public class EdgeBackGestureHandler implements DisplayListener { mNavBarHeight = res.getDimensionPixelSize(R.dimen.navigation_bar_frame_height); mMinArrowPosition = res.getDimensionPixelSize(R.dimen.navigation_edge_arrow_min_y); mFingerOffset = res.getDimensionPixelSize(R.dimen.navigation_edge_finger_offset); + updateCurrentUserResources(res); + } + + public void updateCurrentUserResources(Resources res) { + mEdgeWidth = res.getDimensionPixelSize( + com.android.internal.R.dimen.config_backGestureInset); } /** @@ -194,9 +197,10 @@ public class EdgeBackGestureHandler implements DisplayListener { updateIsEnabled(); } - public void onNavigationModeChanged(int mode) { + public void onNavigationModeChanged(int mode, Context currentUserContext) { mIsGesturalModeEnabled = QuickStepContract.isGesturalMode(mode); updateIsEnabled(); + updateCurrentUserResources(currentUserContext.getResources()); } private void disposeInputChannel() { @@ -270,6 +274,8 @@ public class EdgeBackGestureHandler implements DisplayListener { | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); + mEdgePanelLp.privateFlags |= + WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; mEdgePanelLp.setTitle(TAG + mDisplayId); mEdgePanelLp.accessibilityTitle = mContext.getString(R.string.nav_bar_edge_panel); mEdgePanelLp.windowAnimations = 0; @@ -449,6 +455,16 @@ public class EdgeBackGestureHandler implements DisplayListener { mRightInset = rightInset; } + public void dump(PrintWriter pw) { + pw.println("EdgeBackGestureHandler:"); + pw.println(" mIsEnabled=" + mIsEnabled); + pw.println(" mAllowGesture=" + mAllowGesture); + pw.println(" mExcludeRegion=" + mExcludeRegion); + pw.println(" mImeHeight=" + mImeHeight); + pw.println(" mIsAttached=" + mIsAttached); + pw.println(" mEdgeWidth=" + mEdgeWidth); + } + class SysUiInputEventReceiver extends InputEventReceiver { SysUiInputEventReceiver(InputChannel channel, Looper looper) { super(channel, looper); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FloatingRotationButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FloatingRotationButton.java index f5016da29ad7..6bbeffaa9bfe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FloatingRotationButton.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FloatingRotationButton.java @@ -16,8 +16,10 @@ package com.android.systemui.statusbar.phone; +import android.annotation.ColorInt; import android.content.Context; import android.content.res.Resources; +import android.graphics.Color; import android.graphics.PixelFormat; import android.view.ContextThemeWrapper; import android.view.Gravity; @@ -26,6 +28,7 @@ import android.view.Surface; import android.view.View; import android.view.WindowManager; +import com.android.settingslib.Utils; import com.android.systemui.R; import com.android.systemui.statusbar.policy.KeyButtonDrawable; import com.android.systemui.statusbar.policy.KeyButtonView; @@ -33,6 +36,8 @@ import com.android.systemui.statusbar.policy.KeyButtonView; /** Containing logic for the rotation button on the physical left bottom corner of the screen. */ public class FloatingRotationButton implements RotationButton { + private static final float BACKGROUND_ALPHA = 0.92f; + private final Context mContext; private final WindowManager mWindowManager; private final KeyButtonView mKeyButtonView; @@ -151,8 +156,18 @@ public class FloatingRotationButton implements RotationButton { public KeyButtonDrawable getImageDrawable() { Context context = new ContextThemeWrapper(mContext.getApplicationContext(), mRotationButtonController.getStyleRes()); - return KeyButtonDrawable.create(context, R.drawable.ic_sysbar_rotate_button, - false /* shadow */, true /* hasOvalBg */); + final int dualToneDarkTheme = Utils.getThemeAttr(context, R.attr.darkIconTheme); + final int dualToneLightTheme = Utils.getThemeAttr(context, R.attr.lightIconTheme); + Context lightContext = new ContextThemeWrapper(context, dualToneLightTheme); + Context darkContext = new ContextThemeWrapper(context, dualToneDarkTheme); + @ColorInt int darkColor = Utils.getColorAttrDefaultColor(darkContext, + R.attr.singleToneColor); + Color ovalBackgroundColor = Color.valueOf(Color.red(darkColor), Color.green(darkColor), + Color.blue(darkColor), BACKGROUND_ALPHA); + + return KeyButtonDrawable.create(lightContext, + Utils.getColorAttrDefaultColor(lightContext, R.attr.singleToneColor), darkColor, + R.drawable.ic_sysbar_rotate_button, false /* shadow */, ovalBackgroundColor); } @Override 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 443cc4397bd3..c0a1b123fe77 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java @@ -112,7 +112,9 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener final boolean guestEnabled = !mContext.getSystemService(DevicePolicyManager.class) .getGuestUserDisabled(null); - return mUserSwitcherController.getSwitchableUserCount() > 1 || guestEnabled + return mUserSwitcherController.getSwitchableUserCount() > 1 + // If we cannot add guests even if they are enabled, do not show + || (guestEnabled && !mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)) || mContext.getResources().getBoolean(R.bool.qs_show_user_switcher_for_single_user); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 90bce391c68d..ed486cdce665 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -772,9 +772,10 @@ public class NavigationBarView extends FrameLayout implements @Override public void onNavigationModeChanged(int mode) { + Context curUserCtx = Dependency.get(NavigationModeController.class).getCurrentUserContext(); mNavBarMode = mode; mBarTransitions.onNavigationModeChanged(mNavBarMode); - mEdgeBackGestureHandler.onNavigationModeChanged(mNavBarMode); + mEdgeBackGestureHandler.onNavigationModeChanged(mNavBarMode, curUserCtx); mRecentsOnboarding.onNavigationModeChanged(mNavBarMode); getRotateSuggestionButton().onNavigationModeChanged(mNavBarMode); @@ -1103,6 +1104,7 @@ public class NavigationBarView extends FrameLayout implements mContextualButtonGroup.dump(pw); mRecentsOnboarding.dump(pw); mTintController.dump(pw); + mEdgeBackGestureHandler.dump(pw); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java index 77eb469c4b29..11242201d893 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java @@ -224,7 +224,7 @@ public class NavigationModeController implements Dumpable { return mode; } - private Context getCurrentUserContext() { + public Context getCurrentUserContext() { int userId = ActivityManagerWrapper.getInstance().getCurrentUserId(); if (DEBUG) { Log.d(TAG, "getCurrentUserContext: contextUser=" + mContext.getUserId() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index 501e59734691..98505cf38afa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -41,7 +41,7 @@ import java.util.function.Function; public class NotificationIconAreaController implements DarkReceiver, StatusBarStateController.StateListener { - public static final String LOW_PRIORITY = "low_priority"; + public static final String HIGH_PRIORITY = "high_priority"; private final ContrastColorUtil mContrastColorUtil; private final NotificationEntryManager mEntryManager; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index f458618a43f2..e20a23edc66d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -315,10 +315,11 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { @Override public void onViewRemoved(View child) { super.onViewRemoved(child); - if (mAnimationsEnabled && child instanceof StatusBarIconView) { + + if (child instanceof StatusBarIconView) { boolean isReplacingIcon = isReplacingIcon(child); final StatusBarIconView icon = (StatusBarIconView) child; - if (icon.getVisibleState() != StatusBarIconView.STATE_HIDDEN + if (mAnimationsEnabled && icon.getVisibleState() != StatusBarIconView.STATE_HIDDEN && child.getVisibility() == VISIBLE && isReplacingIcon) { int animationStartIndex = findFirstViewIndexAfter(icon.getTranslationX()); if (mAddAnimationStartIndex < 0) { @@ -329,7 +330,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } if (!mChangingViewPositions) { mIconStates.remove(child); - if (!isReplacingIcon) { + if (mAnimationsEnabled && !isReplacingIcon) { addTransientView(icon, 0); boolean isIsolatedIcon = child == mIsolatedIcon; icon.setVisibleState(StatusBarIconView.STATE_HIDDEN, true /* animate */, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/RotationContextButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/RotationContextButton.java index b117dec44cb4..24e73362defe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/RotationContextButton.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/RotationContextButton.java @@ -24,7 +24,6 @@ import android.content.Context; import android.view.ContextThemeWrapper; import android.view.View; -import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.policy.KeyButtonDrawable; /** Containing logic for the rotation button in nav bar. */ @@ -61,7 +60,7 @@ public class RotationContextButton extends ContextualButton implements Context context = new ContextThemeWrapper(getContext().getApplicationContext(), mRotationButtonController.getStyleRes()); return KeyButtonDrawable.create(context, mIconResId, false /* shadow */, - QuickStepContract.isGesturalMode(mNavBarMode)); + null /* ovalBackgroundColor */); } @Override 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 5fff054b3bc2..1fdabc0a9fee 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -317,17 +317,6 @@ public class StatusBar extends SystemUI implements DemoMode, /** If true, the lockscreen will show a distinct wallpaper */ public static final boolean ENABLE_LOCKSCREEN_WALLPAPER = true; - private static final AudioAttributes AUDIO_ATTRIBUTES = - new AudioAttributes.Builder() - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - // Temporary fix for b/123870990. No time in this release to - // introduce a new vibration type, but we need to distinguish these vibrations - // from other haptic feedback vibrations. Fortunately, Alarm vibrations have - // exactly the same behavior as we need - // TODO: refactor within the scope of b/132170758 - .setUsage(AudioAttributes.USAGE_ALARM) - .build(); - static { boolean onlyCoreApps; try { @@ -3222,8 +3211,7 @@ public class StatusBar extends SystemUI implements DemoMode, // Lock wallpaper defines the color of the majority of the views, hence we'll use it // to set our default theme. - final boolean lockDarkText = mColorExtractor.getColors(WallpaperManager.FLAG_LOCK, true - /* ignoreVisibility */).supportsDarkText(); + final boolean lockDarkText = mColorExtractor.getNeutralColors().supportsDarkText(); final int themeResId = lockDarkText ? R.style.Theme_SystemUI_Light : R.style.Theme_SystemUI; if (mContext.getThemeResId() != themeResId) { mContext.setTheme(themeResId); @@ -3700,7 +3688,7 @@ public class StatusBar extends SystemUI implements DemoMode, private void vibrateForCameraGesture() { // Make sure to pass -1 for repeat so VibratorService doesn't stop us when going to sleep. - mVibrator.vibrate(mCameraLaunchGestureVibePattern, -1 /* repeat */, AUDIO_ATTRIBUTES); + mVibrator.vibrate(mCameraLaunchGestureVibePattern, -1 /* repeat */); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java index 891bb35127ee..c73ed60f161d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java @@ -25,7 +25,6 @@ import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENAB import android.app.ActivityManager; import android.app.IActivityManager; -import android.app.WallpaperManager; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.res.Resources; @@ -556,17 +555,7 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat return; } - StatusBarStateController state = Dependency.get(StatusBarStateController.class); - int which; - if (state.getState() == StatusBarState.KEYGUARD - || state.getState() == StatusBarState.SHADE_LOCKED) { - which = WallpaperManager.FLAG_LOCK; - } else { - which = WallpaperManager.FLAG_SYSTEM; - } - final boolean useDarkText = mColorExtractor.getColors(which, - true /* ignoreVisibility */).supportsDarkText(); - + final boolean useDarkText = mColorExtractor.getNeutralColors().supportsDarkText(); // Make sure we have the correct navbar/statusbar colors. setKeyguardDark(useDarkText); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java index 568de63b0112..8fcaa67e7614 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java @@ -82,9 +82,9 @@ public class KeyButtonDrawable extends Drawable { private AnimatedVectorDrawable mAnimatedDrawable; public KeyButtonDrawable(Drawable d, @ColorInt int lightColor, @ColorInt int darkColor, - boolean horizontalFlip, boolean hasOvalBg) { + boolean horizontalFlip, Color ovalBackgroundColor) { this(d, new ShadowDrawableState(lightColor, darkColor, - d instanceof AnimatedVectorDrawable, horizontalFlip, hasOvalBg)); + d instanceof AnimatedVectorDrawable, horizontalFlip, ovalBackgroundColor)); } private KeyButtonDrawable(Drawable d, ShadowDrawableState state) { @@ -166,7 +166,7 @@ public class KeyButtonDrawable extends Drawable { public void setColorFilter(ColorFilter colorFilter) { mIconPaint.setColorFilter(colorFilter); if (mAnimatedDrawable != null) { - if (mState.mHasOvalBg) { + if (hasOvalBg()) { mAnimatedDrawable.setColorFilter( new PorterDuffColorFilter(mState.mLightColor, PorterDuff.Mode.SRC_IN)); } else { @@ -212,15 +212,6 @@ public class KeyButtonDrawable extends Drawable { return mState.mBaseWidth + (mState.mShadowSize + Math.abs(mState.mShadowOffsetX)) * 2; } - /** Return if the drawable has oval background. */ - public boolean hasOvalBg() { - return mState.mHasOvalBg; - } - - public int getDarkColor() { - return mState.mDarkColor; - } - public boolean canAnimate() { return mState.mSupportsAnimation; } @@ -290,6 +281,14 @@ public class KeyButtonDrawable extends Drawable { return mState.canApplyTheme(); } + @ColorInt int getDrawableBackgroundColor() { + return mState.mOvalBackgroundColor.toArgb(); + } + + boolean hasOvalBg() { + return mState.mOvalBackgroundColor != null; + } + private void regenerateBitmapIconCache() { final int width = getIntrinsicWidth(); final int height = getIntrinsicHeight(); @@ -394,16 +393,16 @@ public class KeyButtonDrawable extends Drawable { final int mLightColor; final int mDarkColor; final boolean mSupportsAnimation; - final boolean mHasOvalBg; + final Color mOvalBackgroundColor; public ShadowDrawableState(@ColorInt int lightColor, @ColorInt int darkColor, - boolean animated, boolean horizontalFlip, boolean hasOvalBg) { + boolean animated, boolean horizontalFlip, Color ovalBackgroundColor) { mLightColor = lightColor; mDarkColor = darkColor; mSupportsAnimation = animated; mAlpha = 255; mHorizontalFlip = horizontalFlip; - mHasOvalBg = hasOvalBg; + mOvalBackgroundColor = ovalBackgroundColor; } @Override @@ -428,16 +427,17 @@ public class KeyButtonDrawable extends Drawable { * @param ctx Context to get the drawable and determine the dark and light theme * @param icon the icon resource id * @param hasShadow if a shadow will appear with the drawable - * @param hasOvalBg if an oval bg will be drawn + * @param ovalBackgroundColor the color of the oval bg that will be drawn * @return KeyButtonDrawable */ public static KeyButtonDrawable create(@NonNull Context ctx, @DrawableRes int icon, - boolean hasShadow, boolean hasOvalBg) { + boolean hasShadow, Color ovalBackgroundColor) { final int dualToneDarkTheme = Utils.getThemeAttr(ctx, R.attr.darkIconTheme); final int dualToneLightTheme = Utils.getThemeAttr(ctx, R.attr.lightIconTheme); Context lightContext = new ContextThemeWrapper(ctx, dualToneLightTheme); Context darkContext = new ContextThemeWrapper(ctx, dualToneDarkTheme); - return KeyButtonDrawable.create(lightContext, darkContext, icon, hasShadow, hasOvalBg); + return KeyButtonDrawable.create(lightContext, darkContext, icon, hasShadow, + ovalBackgroundColor); } /** @@ -446,7 +446,7 @@ public class KeyButtonDrawable extends Drawable { */ public static KeyButtonDrawable create(@NonNull Context ctx, @DrawableRes int icon, boolean hasShadow) { - return create(ctx, icon, hasShadow, false /* hasOvalBg */); + return create(ctx, icon, hasShadow, null /* ovalBackgroundColor */); } /** @@ -454,11 +454,11 @@ public class KeyButtonDrawable extends Drawable { * {@link #create(Context, int, boolean, boolean)}. */ public static KeyButtonDrawable create(Context lightContext, Context darkContext, - @DrawableRes int iconResId, boolean hasShadow, boolean hasOvalBg) { + @DrawableRes int iconResId, boolean hasShadow, Color ovalBackgroundColor) { return create(lightContext, Utils.getColorAttrDefaultColor(lightContext, R.attr.singleToneColor), Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor), - iconResId, hasShadow, hasOvalBg); + iconResId, hasShadow, ovalBackgroundColor); } /** @@ -467,12 +467,12 @@ public class KeyButtonDrawable extends Drawable { */ public static KeyButtonDrawable create(Context context, @ColorInt int lightColor, @ColorInt int darkColor, @DrawableRes int iconResId, boolean hasShadow, - boolean hasOvalBg) { + Color ovalBackgroundColor) { final Resources res = context.getResources(); boolean isRtl = res.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; Drawable d = context.getDrawable(iconResId); final KeyButtonDrawable drawable = new KeyButtonDrawable(d, lightColor, darkColor, - isRtl && d.isAutoMirrored(), hasOvalBg); + isRtl && d.isAutoMirrored(), ovalBackgroundColor); if (hasShadow) { int offsetX = res.getDimensionPixelSize(R.dimen.nav_key_button_shadow_offset_x); int offsetY = res.getDimensionPixelSize(R.dimen.nav_key_button_shadow_offset_y); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index c9579fdd3788..64b28424ae63 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -79,6 +79,7 @@ public class KeyButtonView extends ImageView implements ButtonInterface { private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); private final InputManager mInputManager; private final Paint mOvalBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); + private float mDarkIntensity; private boolean mHasOvalBg = false; private final Runnable mCheckLongPress = new Runnable() { @@ -304,6 +305,23 @@ public class KeyButtonView extends ImageView implements ButtonInterface { return true; } + @Override + public void setImageDrawable(Drawable drawable) { + super.setImageDrawable(drawable); + + if (drawable == null) { + return; + } + KeyButtonDrawable keyButtonDrawable = (KeyButtonDrawable) drawable; + keyButtonDrawable.setDarkIntensity(mDarkIntensity); + mHasOvalBg = keyButtonDrawable.hasOvalBg(); + if (mHasOvalBg) { + mOvalBgPaint.setColor(keyButtonDrawable.getDrawableBackgroundColor()); + } + mRipple.setType(keyButtonDrawable.hasOvalBg() ? KeyButtonRipple.Type.OVAL + : KeyButtonRipple.Type.ROUNDED_RECT); + } + public void playSoundEffect(int soundConstant) { if (!mPlaySounds) return; mAudioManager.playSoundEffect(soundConstant, ActivityManager.getCurrentUser()); @@ -360,17 +378,11 @@ public class KeyButtonView extends ImageView implements ButtonInterface { @Override public void setDarkIntensity(float darkIntensity) { + mDarkIntensity = darkIntensity; + Drawable drawable = getDrawable(); if (drawable != null) { - KeyButtonDrawable keyButtonDrawable = (KeyButtonDrawable) drawable; - keyButtonDrawable.setDarkIntensity(darkIntensity); - mHasOvalBg = keyButtonDrawable.hasOvalBg(); - if (mHasOvalBg) { - mOvalBgPaint.setColor(keyButtonDrawable.getDarkColor()); - } - mRipple.setType(keyButtonDrawable.hasOvalBg() ? KeyButtonRipple.Type.OVAL - : KeyButtonRipple.Type.ROUNDED_RECT); - + ((KeyButtonDrawable) drawable).setDarkIntensity(darkIntensity); // Since we reuse the same drawable for multiple views, we need to invalidate the view // manually. invalidate(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 2afe485eff8e..13f93b923505 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -545,7 +545,7 @@ public class MobileSignalController extends SignalController< } private boolean isDataDisabled() { - return !mPhone.getDataEnabled(mSubscriptionInfo.getSubscriptionId()); + return !mPhone.isDataCapable(); } @VisibleForTesting @@ -566,6 +566,7 @@ public class MobileSignalController extends SignalController< pw.println(" mDataState=" + mDataState + ","); pw.println(" mDataNetType=" + mDataNetType + ","); pw.println(" mInflateSignalStrengths=" + mInflateSignalStrengths + ","); + pw.println(" isDataDisabled=" + isDataDisabled() + ","); } class MobilePhoneStateListener extends PhoneStateListener { diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java b/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java index efd6e03b0d20..fa7af0be77f1 100644 --- a/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java +++ b/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java @@ -16,6 +16,8 @@ package com.android.systemui.util.leak; +import android.content.ClipData; +import android.content.ClipDescription; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -47,10 +49,11 @@ public class DumpTruck { private static final String FILEPROVIDER_PATH = "leak"; private static final String TAG = "DumpTruck"; - private static final int BUFSIZ = 512 * 1024; // 512K + private static final int BUFSIZ = 1024 * 1024; // 1MB private final Context context; private Uri hprofUri; + private long pss; final StringBuilder body = new StringBuilder(); public DumpTruck(Context context) { @@ -89,6 +92,7 @@ public class DumpTruck { .append(info.currentPss) .append(" uss=") .append(info.currentUss); + pss = info.currentPss; } } if (pid == myPid) { @@ -114,6 +118,7 @@ public class DumpTruck { if (DumpTruck.zipUp(zipfile, paths)) { final File pathFile = new File(zipfile); hprofUri = FileProvider.getUriForFile(context, FILEPROVIDER_AUTHORITY, pathFile); + Log.v(TAG, "Heap dump accessible at URI: " + hprofUri); } } catch (IOException e) { Log.e(TAG, "unable to zip up heapdumps", e); @@ -138,16 +143,27 @@ public class DumpTruck { * @return share intent */ public Intent createShareIntent() { - Intent shareIntent = new Intent(Intent.ACTION_SEND); + Intent shareIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - shareIntent.putExtra(Intent.EXTRA_SUBJECT, "SystemUI memory dump"); + shareIntent.putExtra(Intent.EXTRA_SUBJECT, + String.format("SystemUI memory dump (pss=%dM)", pss / 1024)); shareIntent.putExtra(Intent.EXTRA_TEXT, body.toString()); if (hprofUri != null) { + final ArrayList<Uri> uriList = new ArrayList<>(); + uriList.add(hprofUri); shareIntent.setType("application/zip"); - shareIntent.putExtra(Intent.EXTRA_STREAM, hprofUri); + shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList); + + // Include URI in ClipData also, so that grantPermission picks it up. + // We don't use setData here because some apps interpret this as "to:". + ClipData clipdata = new ClipData(new ClipDescription("content", + new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}), + new ClipData.Item(hprofUri)); + shareIntent.setClipData(clipdata); + shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } return shareIntent; } diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java index aa3fd5f69802..583f6b340d47 100644 --- a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java @@ -16,9 +16,13 @@ package com.android.systemui.util.leak; +import static android.service.quicksettings.Tile.STATE_ACTIVE; +import static android.telephony.ims.feature.ImsFeature.STATE_UNAVAILABLE; + import static com.android.internal.logging.MetricsLogger.VIEW_UNKNOWN; import static com.android.systemui.Dependency.BG_LOOPER_NAME; +import android.annotation.Nullable; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; @@ -38,11 +42,11 @@ import android.os.Message; import android.os.Process; import android.os.SystemProperties; import android.provider.Settings; -import android.service.quicksettings.Tile; import android.text.format.DateUtils; import android.util.Log; import android.util.LongSparseArray; +import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.SystemUI; import com.android.systemui.SystemUIFactory; @@ -50,6 +54,8 @@ import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.tileimpl.QSTileImpl; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.ArrayList; import javax.inject.Inject; @@ -59,7 +65,7 @@ import javax.inject.Singleton; /** */ @Singleton -public class GarbageMonitor { +public class GarbageMonitor implements Dumpable { private static final boolean LEAK_REPORTING_ENABLED = Build.IS_DEBUGGABLE && SystemProperties.getBoolean("debug.enable_leak_reporting", false); @@ -77,12 +83,15 @@ public class GarbageMonitor { private static final long GARBAGE_INSPECTION_INTERVAL = 15 * DateUtils.MINUTE_IN_MILLIS; // 15 min private static final long HEAP_TRACK_INTERVAL = 1 * DateUtils.MINUTE_IN_MILLIS; // 1 min + private static final int HEAP_TRACK_HISTORY_LEN = 720; // 12 hours private static final int DO_GARBAGE_INSPECTION = 1000; private static final int DO_HEAP_TRACK = 3000; private static final int GARBAGE_ALLOWANCE = 5; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + private final Handler mHandler; private final TrackedGarbage mTrackedGarbage; private final LeakReporter mLeakReporter; @@ -180,7 +189,7 @@ public class GarbageMonitor { sb.append(p); sb.append(" "); } - Log.v(TAG, sb.toString()); + if (DEBUG) Log.v(TAG, sb.toString()); } private void update() { @@ -189,18 +198,18 @@ public class GarbageMonitor { for (int i = 0; i < dinfos.length; i++) { Debug.MemoryInfo dinfo = dinfos[i]; if (i > mPids.size()) { - Log.e(TAG, "update: unknown process info received: " + dinfo); + if (DEBUG) Log.e(TAG, "update: unknown process info received: " + dinfo); break; } final long pid = mPids.get(i).intValue(); final ProcessMemInfo info = mData.get(pid); - info.head = (info.head + 1) % info.pss.length; info.pss[info.head] = info.currentPss = dinfo.getTotalPss(); info.uss[info.head] = info.currentUss = dinfo.getTotalPrivateDirty(); + info.head = (info.head + 1) % info.pss.length; if (info.currentPss > info.max) info.max = info.currentPss; if (info.currentUss > info.max) info.max = info.currentUss; if (info.currentPss == 0) { - Log.v(TAG, "update: pid " + pid + " has pss=0, it probably died"); + if (DEBUG) Log.v(TAG, "update: pid " + pid + " has pss=0, it probably died"); mData.remove(pid); } } @@ -230,11 +239,36 @@ public class GarbageMonitor { return b + SUFFIXES[i]; } - private void dumpHprofAndShare() { - final Intent share = mDumpTruck.captureHeaps(getTrackedProcesses()).createShareIntent(); - mContext.startActivity(share); + private Intent dumpHprofAndGetShareIntent() { + return mDumpTruck.captureHeaps(getTrackedProcesses()).createShareIntent(); } + @Override + public void dump(@Nullable FileDescriptor fd, PrintWriter pw, @Nullable String[] args) { + pw.println("GarbageMonitor params:"); + pw.println(String.format(" mHeapLimit=%d KB", mHeapLimit)); + pw.println(String.format(" GARBAGE_INSPECTION_INTERVAL=%d (%.1f mins)", + GARBAGE_INSPECTION_INTERVAL, + (float) GARBAGE_INSPECTION_INTERVAL / DateUtils.MINUTE_IN_MILLIS)); + final float htiMins = HEAP_TRACK_INTERVAL / DateUtils.MINUTE_IN_MILLIS; + pw.println(String.format(" HEAP_TRACK_INTERVAL=%d (%.1f mins)", + HEAP_TRACK_INTERVAL, + htiMins)); + pw.println(String.format(" HEAP_TRACK_HISTORY_LEN=%d (%.1f hr total)", + HEAP_TRACK_HISTORY_LEN, + (float) HEAP_TRACK_HISTORY_LEN * htiMins / 60f)); + + pw.println("GarbageMonitor tracked processes:"); + + for (long pid : mPids) { + final ProcessMemInfo pmi = mData.get(pid); + if (pmi != null) { + pmi.dump(fd, pw, args); + } + } + } + + private static class MemoryIconDrawable extends Drawable { long pss, limit; final Drawable baseIcon; @@ -244,7 +278,7 @@ public class GarbageMonitor { MemoryIconDrawable(Context context) { baseIcon = context.getDrawable(R.drawable.ic_memory).mutate(); dp = context.getResources().getDisplayMetrics().density; - paint.setColor(QSTileImpl.getColorForState(context, Tile.STATE_ACTIVE)); + paint.setColor(QSTileImpl.getColorForState(context, STATE_ACTIVE)); } public void setPss(long pss) { @@ -354,6 +388,7 @@ public class GarbageMonitor { private final GarbageMonitor gm; private ProcessMemInfo pmi; + private boolean dumpInProgress; @Inject public MemoryTile(QSHost host) { @@ -373,8 +408,26 @@ public class GarbageMonitor { @Override protected void handleClick() { - getHost().collapsePanels(); - mHandler.post(gm::dumpHprofAndShare); + if (dumpInProgress) return; + + dumpInProgress = true; + refreshState(); + new Thread("HeapDumpThread") { + @Override + public void run() { + try { + // wait for animations & state changes + Thread.sleep(500); + } catch (InterruptedException ignored) { } + final Intent shareIntent = gm.dumpHprofAndGetShareIntent(); + mHandler.post(() -> { + dumpInProgress = false; + refreshState(); + getHost().collapsePanels(); + mContext.startActivity(shareIntent); + }); + } + }.start(); } @Override @@ -404,9 +457,12 @@ public class GarbageMonitor { pmi = gm.getMemInfo(Process.myPid()); final MemoryGraphIcon icon = new MemoryGraphIcon(); icon.setHeapLimit(gm.mHeapLimit); + state.state = dumpInProgress ? STATE_UNAVAILABLE : STATE_ACTIVE; + state.label = dumpInProgress + ? "Dumping..." + : mContext.getString(R.string.heap_dump_tile_name); if (pmi != null) { icon.setPss(pmi.currentPss); - state.label = mContext.getString(R.string.heap_dump_tile_name); state.secondaryLabel = String.format( "pss: %s / %s", @@ -414,7 +470,6 @@ public class GarbageMonitor { formatBytes(gm.mHeapLimit * 1024)); } else { icon.setPss(0); - state.label = "Dump SysUI"; state.secondaryLabel = null; } state.icon = icon; @@ -433,13 +488,14 @@ public class GarbageMonitor { } } - public static class ProcessMemInfo { + /** */ + public static class ProcessMemInfo implements Dumpable { public long pid; public String name; public long startTime; public long currentPss, currentUss; - public long[] pss = new long[256]; - public long[] uss = new long[256]; + public long[] pss = new long[HEAP_TRACK_HISTORY_LEN]; + public long[] uss = new long[HEAP_TRACK_HISTORY_LEN]; public long max = 1; public int head = 0; @@ -452,9 +508,33 @@ public class GarbageMonitor { public long getUptime() { return System.currentTimeMillis() - startTime; } + + @Override + public void dump(@Nullable FileDescriptor fd, PrintWriter pw, @Nullable String[] args) { + pw.print("{ \"pid\": "); + pw.print(pid); + pw.print(", \"name\": \""); + pw.print(name.replace('"', '-')); + pw.print("\", \"start\": "); + pw.print(startTime); + pw.print(", \"pss\": ["); + // write pss values starting from the oldest, which is pss[head], wrapping around to + // pss[(head-1) % pss.length] + for (int i = 0; i < pss.length; i++) { + if (i > 0) pw.print(","); + pw.print(pss[(head + i) % pss.length]); + } + pw.print("], \"uss\": ["); + for (int i = 0; i < uss.length; i++) { + if (i > 0) pw.print(","); + pw.print(uss[(head + i) % uss.length]); + } + pw.println("] }"); + } } - public static class Service extends SystemUI { + /** */ + public static class Service extends SystemUI implements Dumpable { private GarbageMonitor mGarbageMonitor; @Override @@ -472,6 +552,11 @@ public class GarbageMonitor { mGarbageMonitor.startHeapTracking(); } } + + @Override + public void dump(@Nullable FileDescriptor fd, PrintWriter pw, @Nullable String[] args) { + if (mGarbageMonitor != null) mGarbageMonitor.dump(fd, pw, args); + } } private class BackgroundHeapCheckHandler extends Handler { diff --git a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java index 9c2c82257173..41747f407546 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java +++ b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java @@ -40,6 +40,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.MockitoAnnotations; /** @@ -57,6 +58,8 @@ public class SysuiColorExtractorTests extends SysuiTestCase { ColorExtractor.TYPE_DARK, ColorExtractor.TYPE_EXTRA_DARK}; + @Mock + private WallpaperManager mWallpaperManager; private ColorExtractor.GradientColors mColors; private SysuiColorExtractor mColorExtractor; @@ -72,32 +75,15 @@ public class SysuiColorExtractorTests extends SysuiTestCase { outGradientColorsNormal.set(mColors); outGradientColorsDark.set(mColors); outGradientColorsExtraDark.set(mColors); - }, mock(ConfigurationController.class), false); + }, mock(ConfigurationController.class), mWallpaperManager, true /* immediately */); } @Test - public void getColors_usesGreyIfWallpaperNotVisible() { - simulateEvent(mColorExtractor); - mColorExtractor.setWallpaperVisible(false); - - ColorExtractor.GradientColors fallbackColors = mColorExtractor.getNeutralColors(); - - for (int type : sTypes) { - assertEquals("Not using fallback!", - mColorExtractor.getColors(WallpaperManager.FLAG_SYSTEM, type), fallbackColors); - assertNotEquals("Wallpaper visibility event should not affect lock wallpaper.", - mColorExtractor.getColors(WallpaperManager.FLAG_LOCK, type), fallbackColors); - } - } - - @Test - public void getColors_doesntUseFallbackIfVisible() { + public void getColors() { mColors.setMainColor(Color.RED); mColors.setSecondaryColor(Color.RED); simulateEvent(mColorExtractor); - mColorExtractor.setWallpaperVisible(true); - for (int which : sWhich) { for (int type : sTypes) { assertEquals("Not using extracted colors!", @@ -109,8 +95,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase { @Test public void getColors_fallbackWhenMediaIsVisible() { simulateEvent(mColorExtractor); - mColorExtractor.setWallpaperVisible(true); - mColorExtractor.setHasBackdrop(true); + mColorExtractor.setHasMediaArtwork(true); ColorExtractor.GradientColors fallbackColors = mColorExtractor.getNeutralColors(); @@ -127,7 +112,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase { Tonal tonal = mock(Tonal.class); ConfigurationController configurationController = mock(ConfigurationController.class); SysuiColorExtractor sysuiColorExtractor = new SysuiColorExtractor(getContext(), - tonal, configurationController, false /* registerVisibility */); + tonal, configurationController, mWallpaperManager, true /* immediately */); verify(configurationController).addCallback(eq(sysuiColorExtractor)); reset(tonal); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java index 4467faf66830..33042918cfc9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java @@ -27,10 +27,12 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AlarmManager; +import android.database.ContentObserver; import android.hardware.display.AmbientDisplayConfiguration; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -39,6 +41,7 @@ import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.doze.DozeSensors.TriggerSensor; import com.android.systemui.plugins.SensorManagerPlugin; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.AsyncSensorManager; @@ -73,6 +76,8 @@ public class DozeSensorsTest extends SysuiTestCase { private Consumer<Boolean> mProxCallback; @Mock private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy; + @Mock + private TriggerSensor mMockTriggerSensor; private SensorManagerPlugin.SensorEventListener mWakeLockScreenListener; private TestableLooper mTestableLooper; private DozeSensors mDozeSensors; @@ -107,6 +112,25 @@ public class DozeSensorsTest extends SysuiTestCase { anyBoolean(), anyFloat(), anyFloat(), eq(null)); } + @Test + public void testSetListening_firstTrue_registerSettingsObserver() { + mDozeSensors.mSensors = new TriggerSensor[] {mMockTriggerSensor}; + + mDozeSensors.setListening(true); + + verify(mMockTriggerSensor).registerSettingsObserver(any(ContentObserver.class)); + } + + @Test + public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() { + mDozeSensors.mSensors = new TriggerSensor[] {mMockTriggerSensor}; + mDozeSensors.setListening(true); + + mDozeSensors.setListening(true); + + verify(mMockTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class)); + } + private class TestableDozeSensors extends DozeSensors { TestableDozeSensors() { 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 56265d08c131..d42598209545 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 @@ -70,6 +70,7 @@ import com.android.systemui.statusbar.notification.row.FooterView; import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.phone.NotificationGroupManager; +import com.android.systemui.statusbar.phone.NotificationIconAreaController; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; @@ -110,6 +111,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Mock private NotificationData mNotificationData; @Mock private NotificationRemoteInputManager mRemoteInputManager; @Mock private RemoteInputController mRemoteInputController; + @Mock private NotificationIconAreaController mNotificationIconAreaController; @Mock private MetricsLogger mMetricsLogger; @Mock private NotificationRoundnessManager mNotificationRoundnessManager; private TestableNotificationEntryManager mEntryManager; @@ -162,6 +164,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { mStackScroller.setHeadsUpManager(mHeadsUpManager); mStackScroller.setGroupManager(mGroupManager); mStackScroller.setEmptyShadeView(mEmptyShadeView); + mStackScroller.setIconAreaController(mNotificationIconAreaController); // Stub out functionality that isn't necessary to test. doNothing().when(mBar) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java index cb70a1fa3a3b..be69f5f8a844 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java @@ -180,9 +180,9 @@ public class NavigationBarContextTest extends SysuiTestCase { final Drawable d = mock(Drawable.class); final ContextualButton button = spy(mBtn0); final KeyButtonDrawable kbd1 = spy(new KeyButtonDrawable(d, unusedColor, unusedColor, - false /* horizontalFlip */, false /* hasOvalBg */)); + false /* horizontalFlip */, null /* ovalBackgroundColor */)); final KeyButtonDrawable kbd2 = spy(new KeyButtonDrawable(d, unusedColor, unusedColor, - false /* horizontalFlip */, false /* hasOvalBg */)); + false /* horizontalFlip */, null /* ovalBackgroundColor */)); kbd1.setDarkIntensity(TEST_DARK_INTENSITY); kbd2.setDarkIntensity(0f); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index 616b46a6d316..3464fe574007 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -164,7 +164,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected void setupNetworkController() { // For now just pretend to be the data sim, so we can test that too. mSubId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID; - when(mMockTm.getDataEnabled(mSubId)).thenReturn(true); + when(mMockTm.isDataCapable()).thenReturn(true); setDefaultSubId(mSubId); setSubscriptions(mSubId); mMobileSignalController = mNetworkController.mMobileSignalControllers.get(mSubId); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java index cd0a04411ee1..5128675e2723 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java @@ -119,7 +119,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { @Test public void testNoInternetIcon_withDefaultSub() { setupNetworkController(); - when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + when(mMockTm.isDataCapable()).thenReturn(false); setupDefaultSignal(); updateDataConnectionState(TelephonyManager.DATA_CONNECTED, 0); setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); @@ -133,7 +133,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { @Test public void testDataDisabledIcon_withDefaultSub() { setupNetworkController(); - when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + when(mMockTm.isDataCapable()).thenReturn(false); setupDefaultSignal(); updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0); setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); @@ -147,7 +147,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { @Test public void testNoInternetIcon_withoutDefaultSub() { setupNetworkController(); - when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + when(mMockTm.isDataCapable()).thenReturn(false); setupDefaultSignal(); setDefaultSubId(mSubId + 1); updateDataConnectionState(TelephonyManager.DATA_CONNECTED, 0); @@ -162,7 +162,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { @Test public void testDataDisabledIcon_withoutDefaultSub() { setupNetworkController(); - when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + when(mMockTm.isDataCapable()).thenReturn(false); setupDefaultSignal(); setDefaultSubId(mSubId + 1); updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0); @@ -218,7 +218,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { @Test public void testDataDisabledIcon_UserNotSetup() { setupNetworkController(); - when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + when(mMockTm.isDataCapable()).thenReturn(false); setupDefaultSignal(); updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0); setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); @@ -233,7 +233,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { @Test public void testAlwaysShowDataRatIcon() { setupDefaultSignal(); - when(mMockTm.getDataEnabled(mSubId)).thenReturn(false); + when(mMockTm.isDataCapable()).thenReturn(false); updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, TelephonyManager.NETWORK_TYPE_GSM); diff --git a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/dimens.xml b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/dimens.xml index 1232201de862..ac1f0226be52 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/dimens.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/dimens.xml @@ -25,6 +25,6 @@ <dimen name="navigation_bar_width">16dp</dimen> <!-- Height of the bottom navigation / system bar. --> <dimen name="navigation_bar_frame_height">48dp</dimen> - <!-- The height of the bottom navigation gesture area. --> + <!-- The height of the bottom navigation gesture area. --> <dimen name="navigation_bar_gesture_height">32dp</dimen> </resources>
\ No newline at end of file diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml index c8f994c982e5..d5991f367c43 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/config.xml @@ -37,6 +37,15 @@ {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. --> <bool name="config_navBarNeedsScrim">false</bool> + <!-- Controls the opacity of the navigation bar depending on the visibility of the + various workspace stacks. + 0 - Nav bar is always opaque when either the freeform stack or docked stack is visible. + 1 - Nav bar is always translucent when the freeform stack is visible, otherwise always + opaque. + 2 - Nav bar is never forced opaque. + --> + <integer name="config_navBarOpacityMode">2</integer> + <!-- Controls whether seamless rotation should be allowed even though the navbar can move (which normally prevents seamless rotation). --> <bool name="config_allowSeamlessRotationDespiteNavBarMoving">true</bool> diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/dimens.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/dimens.xml index 987d20375e5e..ac1f0226be52 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/dimens.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values/dimens.xml @@ -25,4 +25,6 @@ <dimen name="navigation_bar_width">16dp</dimen> <!-- Height of the bottom navigation / system bar. --> <dimen name="navigation_bar_frame_height">48dp</dimen> + <!-- The height of the bottom navigation gesture area. --> + <dimen name="navigation_bar_gesture_height">32dp</dimen> </resources>
\ No newline at end of file diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml index 693110adb312..ff507ee9f46c 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/config.xml @@ -37,6 +37,15 @@ {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. --> <bool name="config_navBarNeedsScrim">false</bool> + <!-- Controls the opacity of the navigation bar depending on the visibility of the + various workspace stacks. + 0 - Nav bar is always opaque when either the freeform stack or docked stack is visible. + 1 - Nav bar is always translucent when the freeform stack is visible, otherwise always + opaque. + 2 - Nav bar is never forced opaque. + --> + <integer name="config_navBarOpacityMode">2</integer> + <!-- Controls whether seamless rotation should be allowed even though the navbar can move (which normally prevents seamless rotation). --> <bool name="config_allowSeamlessRotationDespiteNavBarMoving">true</bool> diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/dimens.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/dimens.xml index 987d20375e5e..ac1f0226be52 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/dimens.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values/dimens.xml @@ -25,4 +25,6 @@ <dimen name="navigation_bar_width">16dp</dimen> <!-- Height of the bottom navigation / system bar. --> <dimen name="navigation_bar_frame_height">48dp</dimen> + <!-- The height of the bottom navigation gesture area. --> + <dimen name="navigation_bar_gesture_height">32dp</dimen> </resources>
\ No newline at end of file diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml index 5cd6ce3d7d50..378756a50f16 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/config.xml @@ -37,6 +37,15 @@ {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. --> <bool name="config_navBarNeedsScrim">false</bool> + <!-- Controls the opacity of the navigation bar depending on the visibility of the + various workspace stacks. + 0 - Nav bar is always opaque when either the freeform stack or docked stack is visible. + 1 - Nav bar is always translucent when the freeform stack is visible, otherwise always + opaque. + 2 - Nav bar is never forced opaque. + --> + <integer name="config_navBarOpacityMode">2</integer> + <!-- Controls whether seamless rotation should be allowed even though the navbar can move (which normally prevents seamless rotation). --> <bool name="config_allowSeamlessRotationDespiteNavBarMoving">true</bool> diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/dimens.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/dimens.xml index 987d20375e5e..ac1f0226be52 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/dimens.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values/dimens.xml @@ -25,4 +25,6 @@ <dimen name="navigation_bar_width">16dp</dimen> <!-- Height of the bottom navigation / system bar. --> <dimen name="navigation_bar_frame_height">48dp</dimen> + <!-- The height of the bottom navigation gesture area. --> + <dimen name="navigation_bar_gesture_height">32dp</dimen> </resources>
\ No newline at end of file diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index e2a874ea0f26..d16244167c62 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -3019,46 +3019,10 @@ class AlarmManagerService extends SystemService { DateFormat.format(pattern, info.getTriggerTime()).toString(); } - /** - * If the last time AlarmThread woke up precedes any due wakeup or non-wakeup alarm that we set - * by more than half a minute, log a wtf. - */ - private void validateLastAlarmExpiredLocked(long nowElapsed) { - final StringBuilder errorMsg = new StringBuilder(); - boolean stuck = false; - if (mNextNonWakeup < (nowElapsed - 10_000) && mLastWakeup < mNextNonWakeup) { - stuck = true; - errorMsg.append("[mNextNonWakeup="); - TimeUtils.formatDuration(mNextNonWakeup - nowElapsed, errorMsg); - errorMsg.append(" set at "); - TimeUtils.formatDuration(mNextNonWakeUpSetAt - nowElapsed, errorMsg); - errorMsg.append(", mLastWakeup="); - TimeUtils.formatDuration(mLastWakeup - nowElapsed, errorMsg); - errorMsg.append(", timerfd_gettime=" + mInjector.getNextAlarm(ELAPSED_REALTIME)); - errorMsg.append("];"); - } - if (mNextWakeup < (nowElapsed - 10_000) && mLastWakeup < mNextWakeup) { - stuck = true; - errorMsg.append("[mNextWakeup="); - TimeUtils.formatDuration(mNextWakeup - nowElapsed, errorMsg); - errorMsg.append(" set at "); - TimeUtils.formatDuration(mNextWakeUpSetAt - nowElapsed, errorMsg); - errorMsg.append(", mLastWakeup="); - TimeUtils.formatDuration(mLastWakeup - nowElapsed, errorMsg); - errorMsg.append(", timerfd_gettime=" - + mInjector.getNextAlarm(ELAPSED_REALTIME_WAKEUP)); - errorMsg.append("];"); - } - if (stuck) { - Slog.wtf(TAG, "Alarm delivery stuck: " + errorMsg.toString()); - } - } - void rescheduleKernelAlarmsLocked() { // Schedule the next upcoming wakeup alarm. If there is a deliverable batch // prior to that which contains no wakeups, we schedule that as well. final long nowElapsed = mInjector.getElapsedRealtime(); - validateLastAlarmExpiredLocked(nowElapsed); long nextNonWakeup = 0; if (mAlarmBatches.size() > 0) { final Batch firstWakeup = findFirstWakeupBatchLocked(); diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 5027a124e075..e81d1721b271 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.RECEIVE_DATA_ACTIVITY_CHANGE; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; import static android.net.ConnectivityManager.NETID_UNSET; +import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC; import static android.net.ConnectivityManager.TYPE_ETHERNET; import static android.net.ConnectivityManager.TYPE_NONE; import static android.net.ConnectivityManager.TYPE_VPN; @@ -6901,8 +6902,10 @@ public class ConnectivityService extends IConnectivityManager.Stub final int userId = UserHandle.getCallingUserId(); - final IpMemoryStore ipMemoryStore = IpMemoryStore.getMemoryStore(mContext); - ipMemoryStore.factoryReset(); + Binder.withCleanCallingIdentity(() -> { + final IpMemoryStore ipMemoryStore = IpMemoryStore.getMemoryStore(mContext); + ipMemoryStore.factoryReset(); + }); // Turn airplane mode off setAirplaneMode(false); @@ -6952,6 +6955,12 @@ public class ConnectivityService extends IConnectivityManager.Stub } } + // restore private DNS settings to default mode (opportunistic) + if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_PRIVATE_DNS)) { + Settings.Global.putString(mContext.getContentResolver(), + Settings.Global.PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_OPPORTUNISTIC); + } + Settings.Global.putString(mContext.getContentResolver(), Settings.Global.NETWORK_AVOID_BAD_WIFI, null); } diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index d2b992bad462..deff7ef7d39a 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -580,6 +580,7 @@ class StorageManagerService extends IStorageManager.Stub private static final int H_RUN_IDLE_MAINT = 11; private static final int H_ABORT_IDLE_MAINT = 12; private static final int H_BOOT_COMPLETED = 13; + private static final int H_COMPLETE_UNLOCK_USER = 14; class StorageManagerServiceHandler extends Handler { public StorageManagerServiceHandler(Looper looper) { @@ -698,7 +699,10 @@ class StorageManagerService extends IStorageManager.Stub abortIdleMaint((Runnable)msg.obj); break; } - + case H_COMPLETE_UNLOCK_USER: { + completeUnlockUser((int) msg.obj); + break; + } } } } @@ -978,6 +982,17 @@ class StorageManagerService extends IStorageManager.Stub Slog.wtf(TAG, e); } + mHandler.obtainMessage(H_COMPLETE_UNLOCK_USER, userId).sendToTarget(); + } + + private void completeUnlockUser(int userId) { + // If user 0 has completed unlock, perform a one-time migration of legacy obb data + // to its new location. This may take time depending on the size of the data to be copied + // so it's done on the StorageManager handler thread. + if (userId == 0) { + mPmInternal.migrateLegacyObbData(); + } + // Record user as started so newly mounted volumes kick off events // correctly, then synthesize events for any already-mounted volumes. synchronized (mLock) { @@ -2820,6 +2835,12 @@ class StorageManagerService extends IStorageManager.Stub } } + private boolean isSystemUnlocked(int userId) { + synchronized (mLock) { + return ArrayUtils.contains(mSystemUnlockedUsers, userId); + } + } + @Override public void prepareUserStorage(String volumeUuid, int userId, int serialNumber, int flags) { enforcePermission(android.Manifest.permission.STORAGE_INTERNAL); @@ -2996,6 +3017,11 @@ class StorageManagerService extends IStorageManager.Stub final boolean realState = (flags & StorageManager.FLAG_REAL_STATE) != 0; final boolean includeInvisible = (flags & StorageManager.FLAG_INCLUDE_INVISIBLE) != 0; + // Report all volumes as unmounted until we've recorded that user 0 has unlocked. There + // are no guarantees that callers will see a consistent view of the volume before that + // point + final boolean systemUserUnlocked = isSystemUnlocked(UserHandle.USER_SYSTEM); + final boolean userKeyUnlocked; final boolean storagePermission; final long token = Binder.clearCallingIdentity(); @@ -3031,7 +3057,9 @@ class StorageManagerService extends IStorageManager.Stub if (!match) continue; boolean reportUnmounted = false; - if ((vol.getType() == VolumeInfo.TYPE_EMULATED) && !userKeyUnlocked) { + if (!systemUserUnlocked) { + reportUnmounted = true; + } else if ((vol.getType() == VolumeInfo.TYPE_EMULATED) && !userKeyUnlocked) { reportUnmounted = true; } else if (!storagePermission && !realState) { reportUnmounted = true; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f14a3fdda8db..627ca911f9b9 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -7299,6 +7299,13 @@ public class ActivityManagerService extends IActivityManager.Stub if (wasInLaunchingProviders) { mHandler.removeMessages(CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG, r); } + // Make sure the package is associated with the process. + // XXX We shouldn't need to do this, since we have added the package + // when we generated the providers in generateApplicationProvidersLocked(). + // But for some reason in some cases we get here with the package no longer + // added... for now just patch it in to make things happy. + r.addPackage(dst.info.applicationInfo.packageName, + dst.info.applicationInfo.longVersionCode, mProcessStats); synchronized (dst) { dst.provider = src.provider; dst.setProcess(r); diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java index b053d84de7d6..aa8bc04f0f7c 100644 --- a/services/core/java/com/android/server/am/CoreSettingsObserver.java +++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java @@ -76,6 +76,8 @@ final class CoreSettingsObserver extends ContentObserver { sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYER_APP, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_ALL_APPS, int.class); sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_OPT_IN_APPS, String.class); + sGlobalSettingToTypeMap.put( + Settings.Global.GAME_DRIVER_PRERELEASE_OPT_IN_APPS, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_OPT_OUT_APPS, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_BLACKLIST, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GAME_DRIVER_WHITELIST, String.class); diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 943fe75b425a..d64a2c210f27 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -63,7 +63,6 @@ import android.os.AppZygote; import android.os.Binder; import android.os.Build; import android.os.Bundle; -import android.os.GraphicsEnvironment; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -705,16 +704,6 @@ public final class ProcessList { return prefix + "+" + Integer.toString(diff); } - private static boolean shouldUseSystemGraphicsDriver(Context context, Bundle coreSettings, - ApplicationInfo applicationInfo) { - final boolean shouldUseGameDriver = - GraphicsEnvironment.shouldUseGameDriver(context, coreSettings, applicationInfo); - final boolean shouldUseAngle = - GraphicsEnvironment.shouldUseAngle(context, coreSettings, - applicationInfo.packageName); - return !shouldUseGameDriver && !shouldUseAngle; - } - public static String makeOomAdjString(int setAdj, boolean compact) { if (setAdj >= ProcessList.CACHED_APP_MIN_ADJ) { return buildOomTag("cch", "cch", " ", setAdj, @@ -1811,8 +1800,6 @@ public final class ProcessList { String seInfo, String requiredAbi, String instructionSet, String invokeWith, long startTime) { try { - final boolean useSystemGraphicsDriver = shouldUseSystemGraphicsDriver(mService.mContext, - mService.mCoreSettingsObserver.getCoreSettingsLocked(), app.info); Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Start proc: " + app.processName); checkSlow(startTime, "startProcess: asking zygote to start proc"); @@ -1822,7 +1809,6 @@ public final class ProcessList { app.processName, uid, uid, gids, runtimeFlags, mountExternal, app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, null, app.info.packageName, - useSystemGraphicsDriver, new String[] {PROC_START_SEQ_IDENT + app.startSeq}); } else if (hostingRecord.usesAppZygote()) { final AppZygote appZygote = createAppZygoteForProcessIfNeeded(app); @@ -1831,14 +1817,13 @@ public final class ProcessList { app.processName, uid, uid, gids, runtimeFlags, mountExternal, app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, null, app.info.packageName, - /*useUsapPool=*/ false, useSystemGraphicsDriver, + /*useUsapPool=*/ false, new String[] {PROC_START_SEQ_IDENT + app.startSeq}); } else { startResult = Process.start(entryPoint, app.processName, uid, uid, gids, runtimeFlags, mountExternal, app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, invokeWith, app.info.packageName, - useSystemGraphicsDriver, new String[] {PROC_START_SEQ_IDENT + app.startSeq}); } checkSlow(startTime, "startProcess: returned from zygote!"); diff --git a/services/core/java/com/android/server/biometrics/ClientMonitor.java b/services/core/java/com/android/server/biometrics/ClientMonitor.java index 421b3f5ae106..942e0501d88d 100644 --- a/services/core/java/com/android/server/biometrics/ClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/ClientMonitor.java @@ -42,12 +42,7 @@ public abstract class ClientMonitor extends LoggableMonitor implements IBinder.D private static final AudioAttributes FINGERPRINT_SONFICATION_ATTRIBUTES = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - // Temporary fix for b/123870990. No time in this release to - // introduce a new vibration type, but we need to distinguish these vibrations - // from other haptic feedback vibrations. Fortunately, Alarm vibrations have - // exactly the same behavior as we need - // TODO: refactor within the scope of b/132170758 - .setUsage(AudioAttributes.USAGE_ALARM) + .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) .build(); private final Context mContext; diff --git a/services/core/java/com/android/server/gpu/GpuService.java b/services/core/java/com/android/server/gpu/GpuService.java index d4396534d067..955f17781540 100644 --- a/services/core/java/com/android/server/gpu/GpuService.java +++ b/services/core/java/com/android/server/gpu/GpuService.java @@ -64,7 +64,6 @@ public class GpuService extends SystemService { private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; private static final String GAME_DRIVER_WHITELIST_FILENAME = "whitelist.txt"; - private static final String GAME_DRIVER_SPHAL_LIBRARIES_FILENAME = "sphal_libraries.txt"; private static final int BASE64_FLAGS = Base64.NO_PADDING | Base64.NO_WRAP; private final Context mContext; @@ -230,9 +229,6 @@ public class GpuService extends SystemService { // Reset the whitelist. Settings.Global.putString(mContentResolver, Settings.Global.GAME_DRIVER_WHITELIST, ""); - // Reset the sphal libraries - Settings.Global.putString(mContentResolver, - Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES, ""); mGameDriverVersionCode = driverInfo.longVersionCode; try { @@ -241,10 +237,6 @@ public class GpuService extends SystemService { assetToSettingsGlobal(mContext, driverContext, GAME_DRIVER_WHITELIST_FILENAME, Settings.Global.GAME_DRIVER_WHITELIST, ","); - - assetToSettingsGlobal(mContext, driverContext, GAME_DRIVER_SPHAL_LIBRARIES_FILENAME, - Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES, ":"); - } catch (PackageManager.NameNotFoundException e) { if (DEBUG) { Slog.w(TAG, "driver package '" + mDriverPackageName + "' not installed"); diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java index 7689bd26a193..65dac8bf7cdd 100644 --- a/services/core/java/com/android/server/job/JobServiceContext.java +++ b/services/core/java/com/android/server/job/JobServiceContext.java @@ -247,10 +247,20 @@ public final class JobServiceContext implements ServiceConnection { mVerb = VERB_BINDING; scheduleOpTimeOutLocked(); final Intent intent = new Intent().setComponent(job.getServiceComponent()); - boolean binding = mContext.bindServiceAsUser(intent, this, - Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND - | Context.BIND_NOT_VISIBLE | Context.BIND_ADJUST_BELOW_PERCEPTIBLE, - new UserHandle(job.getUserId())); + boolean binding = false; + try { + binding = mContext.bindServiceAsUser(intent, this, + Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND + | Context.BIND_NOT_VISIBLE | Context.BIND_ADJUST_BELOW_PERCEPTIBLE, + new UserHandle(job.getUserId())); + } catch (SecurityException e) { + // Some permission policy, for example INTERACT_ACROSS_USERS and + // android:singleUser, can result in a SecurityException being thrown from + // bindServiceAsUser(). If this happens, catch it and fail gracefully. + Slog.w(TAG, "Job service " + job.getServiceComponent().getShortClassName() + + " cannot be executed: " + e.getMessage()); + binding = false; + } if (!binding) { if (DEBUG) { Slog.d(TAG, job.getServiceComponent().getShortClassName() + " unavailable."); diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index f28bce5d5e7b..e7636ae8acb4 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -937,7 +937,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements mGnssNavigationMessageProvider.onGpsEnabledChanged(); mGnssBatchingProvider.enable(); if (mGnssVisibilityControl != null) { - mGnssVisibilityControl.onGpsEnabledChanged(/* isEnabled= */true); + mGnssVisibilityControl.onGpsEnabledChanged(/* isEnabled= */ true); } } else { setGpsEnabled(false); diff --git a/services/core/java/com/android/server/location/GnssVisibilityControl.java b/services/core/java/com/android/server/location/GnssVisibilityControl.java index 3ee941920f48..ea4f9c456856 100644 --- a/services/core/java/com/android/server/location/GnssVisibilityControl.java +++ b/services/core/java/com/android/server/location/GnssVisibilityControl.java @@ -151,7 +151,6 @@ class GnssVisibilityControl { } private void handleInitialize() { - disableNfwLocationAccess(); // Disable until config properties are loaded. listenForProxyAppsPackageUpdates(); } @@ -261,25 +260,21 @@ class GnssVisibilityControl { return false; } - private void handleGpsEnabledChanged(boolean isEnabled) { - if (DEBUG) Log.d(TAG, "handleGpsEnabledChanged, isEnabled: " + isEnabled); - - if (mIsGpsEnabled == isEnabled) { - return; + private void handleGpsEnabledChanged(boolean isGpsEnabled) { + if (DEBUG) { + Log.d(TAG, "handleGpsEnabledChanged, mIsGpsEnabled: " + mIsGpsEnabled + + ", isGpsEnabled: " + isGpsEnabled); } - mIsGpsEnabled = isEnabled; + // The proxy app list in the GNSS HAL needs to be configured if it restarts after + // a crash. So, update HAL irrespective of the previous GPS enabled state. + mIsGpsEnabled = isGpsEnabled; if (!mIsGpsEnabled) { disableNfwLocationAccess(); return; } - // When GNSS was disabled, we already set the proxy app list to empty in GNSS HAL. - // Update only if the proxy app list is not empty. - String[] locationPermissionEnabledProxyApps = getLocationPermissionEnabledProxyApps(); - if (locationPermissionEnabledProxyApps.length != 0) { - setNfwLocationAccessProxyAppsInGnssHal(locationPermissionEnabledProxyApps); - } + setNfwLocationAccessProxyAppsInGnssHal(getLocationPermissionEnabledProxyApps()); } private void disableNfwLocationAccess() { diff --git a/services/core/java/com/android/server/om/IdmapManager.java b/services/core/java/com/android/server/om/IdmapManager.java index 4b435de3538b..b604aa87f8f3 100644 --- a/services/core/java/com/android/server/om/IdmapManager.java +++ b/services/core/java/com/android/server/om/IdmapManager.java @@ -58,9 +58,16 @@ class IdmapManager { private static final boolean VENDOR_IS_Q_OR_LATER; static { - // STOPSHIP(b/119390857): Check api version once Q sdk version is finalized - final String value = SystemProperties.get("ro.vndk.version", "Q"); - VENDOR_IS_Q_OR_LATER = value.equals("Q") || value.equals("q"); + final String value = SystemProperties.get("ro.vndk.version", "29"); + boolean isQOrLater; + try { + isQOrLater = Integer.parseInt(value) >= 29; + } catch (NumberFormatException e) { + // The version is not a number, therefore it is a development codename. + isQOrLater = true; + } + + VENDOR_IS_Q_OR_LATER = isQOrLater; } IdmapManager(final Installer installer, final PackageManagerHelper packageManager) { diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index c2d5b2f86002..adcd19e9bb5a 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -121,24 +121,6 @@ public class Installer extends SystemService { } } - @Override - public void onUnlockUser(int userId) { - if (userId == 0) { - if (!checkBeforeRemote()) return; - - if (mInstalld == null) { - Slog.wtf(TAG, "Call to onUnlockUser prior to onStart."); - return; - } - - try { - mInstalld.migrateLegacyObbData(); - } catch (RemoteException re) { - Slog.wtf(TAG, "Error migrating legacy OBB data.", re); - } - } - } - private void connect() { IBinder binder = ServiceManager.getService("installd"); if (binder != null) { @@ -708,6 +690,24 @@ public class Installer extends SystemService { } } + /** + * Migrates obb data from its legacy location {@code /data/media/obb} to + * {@code /data/media/0/Android/obb}. This call is idempotent and a fast no-op if data has + * already been migrated. + * + * @throws InstallerException if an error occurs. + */ + public boolean migrateLegacyObbData() throws InstallerException { + if (!checkBeforeRemote()) return false; + + try { + mInstalld.migrateLegacyObbData(); + return true; + } catch (Exception e) { + throw InstallerException.from(e); + } + } + private static void assertValidInstructionSet(String instructionSet) throws InstallerException { for (String abi : Build.SUPPORTED_ABIS) { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 7d5393deb3f8..4d84048fa603 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5643,27 +5643,6 @@ public class PackageManagerService extends IPackageManager.Stub for (int i = 0; pkg == null && i < N; i++) { pkg = mPackages.get(packageNames[i]); } - // Additional logs for b/111075456; ignore system UIDs - if (pkg == null && UserHandle.getAppId(uid) >= Process.FIRST_APPLICATION_UID) { - if (packageNames == null || packageNames.length < 2) { - // unclear if this is shared user or just a missing application - Log.e(TAG, "Failed to find package" - + "; permName: " + permName - + ", uid: " + uid - + ", caller: " + Binder.getCallingUid(), - new Throwable()); - } else { - // definitely shared user - Log.e(TAG, "Failed to find package" - + "; permName: " + permName - + ", uid: " + uid - + ", caller: " + Binder.getCallingUid() - + ", packages: " + Arrays.toString(packageNames), - new Throwable()); - } - // run again just to try to get debug output - getPackagesForUid_debug(uid, true); - } return mPermissionManager.checkUidPermission(permName, pkg, uid, getCallingUid()); } } @@ -6391,25 +6370,15 @@ public class PackageManagerService extends IPackageManager.Stub */ @Override public String[] getPackagesForUid(int uid) { - return getPackagesForUid_debug(uid, false); - } - // Debug output for b/111075456 - private String[] getPackagesForUid_debug(int uid, boolean debug) { final int callingUid = Binder.getCallingUid(); final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null; final int userId = UserHandle.getUserId(uid); final int appId = UserHandle.getAppId(uid); - if (debug) Slog.e(TAG, "Finding packages for UID" - + "; uid: " + uid - + ", userId: " + userId - + ", appId: " + appId - + ", caller: " + callingUid); // reader synchronized (mPackages) { final Object obj = mSettings.getSettingLPr(appId); if (obj instanceof SharedUserSetting) { if (isCallerInstantApp) { - if (debug) Slog.e(TAG, "Caller is instant and package has shared users"); return null; } final SharedUserSetting sus = (SharedUserSetting) obj; @@ -6417,13 +6386,8 @@ public class PackageManagerService extends IPackageManager.Stub String[] res = new String[N]; final Iterator<PackageSetting> it = sus.packages.iterator(); int i = 0; - if (debug && !it.hasNext()) Slog.e(TAG, "Shared user, but, no packages"); while (it.hasNext()) { PackageSetting ps = it.next(); - if (debug) Slog.e(TAG, "Check shared package" - + "; installed? " + ps.getInstalled(userId) - + ", shared setting: " + ps - + ", package setting: " + mSettings.mPackages.get(ps.name)); if (ps.getInstalled(userId)) { res[i++] = ps.name; } else { @@ -6436,12 +6400,6 @@ public class PackageManagerService extends IPackageManager.Stub if (ps.getInstalled(userId) && !filterAppAccessLPr(ps, callingUid, userId)) { return new String[]{ps.name}; } - if (debug) Slog.e(TAG, "Removing normal package" - + "; installed? " + ps.getInstalled(userId) - + ", filtered? " + filterAppAccessLPr(ps, callingUid, userId)); - } else if (debug) { - if (debug) Slog.e(TAG, "No setting found" - + "; obj: " + (obj == null ? "<<NULL>>" : obj.toString())); } } return null; @@ -24963,6 +24921,15 @@ public class PackageManagerService extends IPackageManager.Stub mSettings.setRuntimePermissionsFingerPrintLPr(fingerPrint, userId); } } + + @Override + public void migrateLegacyObbData() { + try { + mInstaller.migrateLegacyObbData(); + } catch (Exception e) { + Slog.wtf(TAG, e); + } + } } @GuardedBy("mPackages") diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java index 1d01a84138a4..6882afb6285d 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyService.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java @@ -19,6 +19,7 @@ package com.android.server.policy; import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_DEFAULT; import static android.app.AppOpsManager.MODE_ERRORED; +import static android.app.AppOpsManager.MODE_FOREGROUND; import static android.app.AppOpsManager.MODE_IGNORED; import static android.app.AppOpsManager.OP_NONE; import static android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION; @@ -290,7 +291,7 @@ public final class PermissionPolicyService extends SystemService { * * Currently, only used by the restricted permissions logic. * - * @see #syncRestrictedOps + * @see #syncPackages */ private final @NonNull ArrayList<OpToRestrict> mOpsToDefault = new ArrayList<>(); @@ -299,16 +300,14 @@ public final class PermissionPolicyService extends SystemService { * * Currently, only used by the restricted permissions logic. * - * @see #syncRestrictedOps + * @see #syncPackages */ private final @NonNull ArrayList<OpToUnrestrict> mOpsToAllowIfDefault = new ArrayList<>(); /** * All ops that need to be flipped to allow. * - * Currently, only used by the restricted permissions logic. - * - * @see #syncRestrictedOps + * @see #syncPackages */ private final @NonNull ArrayList<OpToUnrestrict> mOpsToAllow = new ArrayList<>(); @@ -317,16 +316,25 @@ public final class PermissionPolicyService extends SystemService { * * Currently, only used by the restricted permissions logic. * - * @see #syncRestrictedOps + * @see #syncPackages */ private final @NonNull ArrayList<OpToUnrestrict> mOpsToIgnoreIfDefault = new ArrayList<>(); /** - * All foreground permissions + * All ops that need to be flipped to ignore. * - * @see #syncOpsOfFgPermissions() + * @see #syncPackages */ - private final @NonNull ArrayList<FgPermission> mFgPermOps = new ArrayList<>(); + private final @NonNull ArrayList<OpToUnrestrict> mOpsToIgnore = new ArrayList<>(); + + /** + * All ops that need to be flipped to foreground. + * + * Currently, only used by the foreground/background permissions logic. + * + * @see #syncPackages + */ + private final @NonNull ArrayList<OpToUnrestrict> mOpsToForeground = new ArrayList<>(); PermissionToOpSynchroniser(@NonNull Context context) { mContext = context; @@ -335,11 +343,11 @@ public final class PermissionPolicyService extends SystemService { } /** - * Set app ops that belong to restricted permissions. + * Set app ops that were added in {@link #addPackage}. * * <p>This processes ops previously added by {@link #addOpIfRestricted} */ - private void syncRestrictedOps() { + private void syncPackages() { final int allowCount = mOpsToAllow.size(); for (int i = 0; i < allowCount; i++) { final OpToUnrestrict op = mOpsToAllow.get(i); @@ -350,6 +358,16 @@ public final class PermissionPolicyService extends SystemService { final OpToUnrestrict op = mOpsToAllowIfDefault.get(i); setUidModeAllowedIfDefault(op.code, op.uid, op.packageName); } + final int foregroundCount = mOpsToForeground.size(); + for (int i = 0; i < foregroundCount; i++) { + final OpToUnrestrict op = mOpsToForeground.get(i); + setUidModeForeground(op.code, op.uid); + } + final int ignoreCount = mOpsToIgnore.size(); + for (int i = 0; i < ignoreCount; i++) { + final OpToUnrestrict op = mOpsToIgnore.get(i); + setUidModeIgnored(op.code, op.uid); + } final int ignoreIfDefaultCount = mOpsToIgnoreIfDefault.size(); for (int i = 0; i < ignoreIfDefaultCount; i++) { final OpToUnrestrict op = mOpsToIgnoreIfDefault.get(i); @@ -363,46 +381,8 @@ public final class PermissionPolicyService extends SystemService { } /** - * Set app ops that belong to restricted permissions. - * - * <p>This processed ops previously added by {@link #addOpIfRestricted} - */ - private void syncOpsOfFgPermissions() { - int numFgPermOps = mFgPermOps.size(); - for (int i = 0; i < numFgPermOps; i++) { - FgPermission perm = mFgPermOps.get(i); - - if (mPackageManager.checkPermission(perm.fgPermissionName, perm.packageName) - == PackageManager.PERMISSION_GRANTED) { - if (mPackageManager.checkPermission(perm.bgPermissionName, perm.packageName) - == PackageManager.PERMISSION_GRANTED) { - mAppOpsManager.setUidMode( - AppOpsManager.permissionToOpCode(perm.fgPermissionName), perm.uid, - AppOpsManager.MODE_ALLOWED); - } else { - mAppOpsManager.setUidMode( - AppOpsManager.permissionToOpCode(perm.fgPermissionName), perm.uid, - AppOpsManager.MODE_FOREGROUND); - } - } else { - mAppOpsManager.setUidMode( - AppOpsManager.permissionToOpCode(perm.fgPermissionName), perm.uid, - AppOpsManager.MODE_IGNORED); - } - } - } - - /** - * Synchronize all previously {@link #addPackage added} packages. - */ - void syncPackages() { - syncRestrictedOps(); - syncOpsOfFgPermissions(); - } - - /** * Add op that belong to a restricted permission for later processing in - * {@link #syncRestrictedOps}. + * {@link #syncPackages()}. * * <p>Note: Called with the package lock held. Do <u>not</u> call into app-op manager. * @@ -424,19 +404,29 @@ public final class PermissionPolicyService extends SystemService { mContext.getUser()) & FLAG_PERMISSION_APPLY_RESTRICTION) != 0; if (permissionInfo.isHardRestricted()) { - if (applyRestriction) { - mOpsToDefault.add(new OpToRestrict(uid, opCode)); - } else { - mOpsToAllowIfDefault.add(new OpToUnrestrict(uid, pkg.packageName, opCode)); + if (opCode != OP_NONE) { + if (applyRestriction) { + mOpsToDefault.add(new OpToRestrict(uid, opCode)); + } else { + mOpsToAllowIfDefault.add(new OpToUnrestrict(uid, pkg.packageName, opCode)); + } } } else if (permissionInfo.isSoftRestricted()) { final SoftRestrictedPermissionPolicy policy = SoftRestrictedPermissionPolicy.forPermission(mContext, pkg.applicationInfo, permission); - final int op = policy.getAppOp(); + if (opCode != OP_NONE) { + if (policy.canBeGranted()) { + mOpsToAllowIfDefault.add(new OpToUnrestrict(uid, pkg.packageName, opCode)); + } else { + mOpsToDefault.add(new OpToRestrict(uid, opCode)); + } + } + + final int op = policy.resolveAppOp(); if (op != OP_NONE) { - switch (policy.getAppOpMode()) { + switch (policy.getDesiredOpMode()) { case MODE_DEFAULT: mOpsToDefault.add(new OpToRestrict(uid, op)); break; @@ -444,16 +434,22 @@ public final class PermissionPolicyService extends SystemService { if (policy.shouldSetAppOpIfNotDefault()) { mOpsToAllow.add(new OpToUnrestrict(uid, pkg.packageName, op)); } else { - mOpsToAllowIfDefault.add(new OpToUnrestrict(uid, pkg.packageName, - op)); + mOpsToAllowIfDefault.add( + new OpToUnrestrict(uid, pkg.packageName, + op)); } break; + case MODE_FOREGROUND: + Slog.wtf(LOG_TAG, + "Setting appop to foreground is not implemented"); + break; case MODE_IGNORED: if (policy.shouldSetAppOpIfNotDefault()) { - Slog.wtf(LOG_TAG, "Always ignoring appops is not implemented"); + mOpsToIgnore.add(new OpToUnrestrict(uid, pkg.packageName, op)); } else { - mOpsToIgnoreIfDefault.add(new OpToUnrestrict(uid, pkg.packageName, - op)); + mOpsToIgnoreIfDefault.add( + new OpToUnrestrict(uid, pkg.packageName, + op)); } break; case MODE_ERRORED: @@ -463,19 +459,59 @@ public final class PermissionPolicyService extends SystemService { } } + /** + * Add op that belong to a foreground permission for later processing in + * {@link #syncPackages()}. + * + * <p>Note: Called with the package lock held. Do <u>not</u> call into app-op manager. + * + * @param permissionInfo The permission that is currently looked at + * @param pkg The package looked at + */ private void addOpIfFgPermissions(@NonNull PermissionInfo permissionInfo, @NonNull PackageInfo pkg) { - if (pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) { - // Pre-M apps do not store their fg/bg state in the permissions - return; - } + final String bgPermissionName = permissionInfo.backgroundPermission; - if (permissionInfo.backgroundPermission == null) { + if (bgPermissionName == null) { return; } - mFgPermOps.add(new FgPermission(pkg.applicationInfo.uid, pkg.packageName, - permissionInfo.name, permissionInfo.backgroundPermission)); + final String permission = permissionInfo.name; + final int opCode = AppOpsManager.permissionToOpCode(permission); + final String pkgName = pkg.packageName; + final int uid = pkg.applicationInfo.uid; + + if (mPackageManager.checkPermission(permission, pkgName) + == PackageManager.PERMISSION_GRANTED) { + boolean isBgHardRestricted = false; + try { + final PermissionInfo bgPermInfo = mPackageManager.getPermissionInfo( + bgPermissionName, 0); + + if (bgPermInfo.isSoftRestricted()) { + Slog.wtf(LOG_TAG, "Support for soft restricted background permissions not " + + "implemented"); + } + + isBgHardRestricted = + bgPermInfo.isHardRestricted() && (mPackageManager.getPermissionFlags( + bgPermissionName, pkgName, UserHandle.getUserHandleForUid(uid)) + & FLAG_PERMISSION_APPLY_RESTRICTION) != 0; + } catch (NameNotFoundException e) { + Slog.w(LOG_TAG, "Cannot read permission state of " + bgPermissionName, e); + } + + final boolean isBgPermGranted = mPackageManager.checkPermission(bgPermissionName, + pkgName) == PackageManager.PERMISSION_GRANTED; + + if (!isBgHardRestricted && isBgPermGranted) { + mOpsToAllow.add(new OpToUnrestrict(uid, pkgName, opCode)); + } else { + mOpsToForeground.add(new OpToUnrestrict(uid, pkgName, opCode)); + } + } else { + mOpsToIgnore.add(new OpToUnrestrict(uid, pkgName, opCode)); + } } /** @@ -525,14 +561,33 @@ public final class PermissionPolicyService extends SystemService { mAppOpsManager.setUidMode(opCode, uid, AppOpsManager.MODE_ALLOWED); } + private void setUidModeForeground(int opCode, int uid) { + mAppOpsManager.setUidMode(opCode, uid, AppOpsManager.MODE_FOREGROUND); + } + private void setUidModeIgnoredIfDefault(int opCode, int uid, @NonNull String packageName) { setUidModeIfDefault(opCode, uid, AppOpsManager.MODE_IGNORED, packageName); } + private void setUidModeIgnored(int opCode, int uid) { + mAppOpsManager.setUidMode(opCode, uid, MODE_IGNORED); + } + private void setUidModeIfDefault(int opCode, int uid, int mode, @NonNull String packageName) { - final int currentMode = mAppOpsManager.unsafeCheckOpRaw(AppOpsManager - .opToPublicName(opCode), uid, packageName); + final int currentMode; + try { + currentMode = mAppOpsManager.unsafeCheckOpRaw(AppOpsManager + .opToPublicName(opCode), uid, packageName); + } catch (SecurityException e) { + // This might happen if the app was uninstalled in between the add and sync step. + // In this case the package name cannot be resolved inside appops service and hence + // the uid does not match. + Slog.w(LOG_TAG, "Cannot set mode of uid=" + uid + " op=" + opCode + " to " + mode, + e); + return; + } + if (currentMode == MODE_DEFAULT) { mAppOpsManager.setUidMode(opCode, uid, mode); } @@ -563,21 +618,6 @@ public final class PermissionPolicyService extends SystemService { this.code = code; } } - - private class FgPermission { - final int uid; - final @NonNull String packageName; - final @NonNull String fgPermissionName; - final @NonNull String bgPermissionName; - - private FgPermission(int uid, @NonNull String packageName, - @NonNull String fgPermissionName, @NonNull String bgPermissionName) { - this.uid = uid; - this.packageName = packageName; - this.fgPermissionName = fgPermissionName; - this.bgPermissionName = bgPermissionName; - } - } } private class Internal extends PermissionPolicyInternal { diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index c31b8094602a..da87b2f1994b 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -4863,6 +4863,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } startedWakingUp(ON_BECAUSE_OF_UNKNOWN); + finishedWakingUp(ON_BECAUSE_OF_UNKNOWN); screenTurningOn(null); screenTurnedOn(); } diff --git a/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java b/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java index e19b708bcdae..d44761728c16 100644 --- a/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java +++ b/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java @@ -33,7 +33,6 @@ import android.app.AppOpsManager; import android.content.Context; import android.content.pm.ApplicationInfo; import android.os.Build; -import android.util.Log; /** * The behavior of soft restricted permissions is different for each permission. This class collects @@ -43,8 +42,6 @@ import android.util.Log; * {@link com.android.packageinstaller.permission.utils.SoftRestrictedPermissionPolicy} */ public abstract class SoftRestrictedPermissionPolicy { - private static final String LOG_TAG = SoftRestrictedPermissionPolicy.class.getSimpleName(); - private static final int FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT = FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT | FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT @@ -53,12 +50,12 @@ public abstract class SoftRestrictedPermissionPolicy { private static final SoftRestrictedPermissionPolicy DUMMY_POLICY = new SoftRestrictedPermissionPolicy() { @Override - public int getAppOp() { + public int resolveAppOp() { return OP_NONE; } @Override - public int getAppOpMode() { + public int getDesiredOpMode() { return MODE_DEFAULT; } @@ -100,12 +97,12 @@ public abstract class SoftRestrictedPermissionPolicy { return new SoftRestrictedPermissionPolicy() { @Override - public int getAppOp() { + public int resolveAppOp() { return OP_LEGACY_STORAGE; } @Override - public int getAppOpMode() { + public int getDesiredOpMode() { if (applyRestriction) { return MODE_DEFAULT; } else if (hasRequestedLegacyExternalStorage) { @@ -119,7 +116,7 @@ public abstract class SoftRestrictedPermissionPolicy { public boolean shouldSetAppOpIfNotDefault() { // Do not switch from allowed -> ignored as this would mean to retroactively // turn on isolated storage. This will make the app loose all its files. - return getAppOpMode() != MODE_IGNORED; + return getDesiredOpMode() != MODE_IGNORED; } @Override @@ -127,10 +124,6 @@ public abstract class SoftRestrictedPermissionPolicy { if (isWhiteListed || targetSDK >= Build.VERSION_CODES.Q) { return true; } else { - Log.w(LOG_TAG, permission + " for " + appInfo.packageName - + " is not whitelisted and targetSDK " + targetSDK + "<" - + Build.VERSION_CODES.Q); - return false; } } @@ -145,16 +138,16 @@ public abstract class SoftRestrictedPermissionPolicy { * @return An app op to be changed based on the state of the permission or * {@link AppOpsManager#OP_NONE} if not app-op should be set. */ - public abstract int getAppOp(); + public abstract int resolveAppOp(); /** - * @return The mode the {@link #getAppOp() app op} should be in. + * @return The mode the {@link #resolveAppOp() app op} should be in. */ - public abstract @AppOpsManager.Mode int getAppOpMode(); + public abstract @AppOpsManager.Mode int getDesiredOpMode(); /** - * @return If the {@link #getAppOp() app op} should be set even if the app-op is currently not - * {@link AppOpsManager#MODE_DEFAULT}. + * @return If the {@link #resolveAppOp() app op} should be set even if the app-op is currently + * not {@link AppOpsManager#MODE_DEFAULT}. */ public abstract boolean shouldSetAppOpIfNotDefault(); diff --git a/services/core/java/com/android/server/policy/TEST_MAPPING b/services/core/java/com/android/server/policy/TEST_MAPPING index 02b0e21a33c0..c7f8c07432a8 100644 --- a/services/core/java/com/android/server/policy/TEST_MAPPING +++ b/services/core/java/com/android/server/policy/TEST_MAPPING @@ -35,6 +35,14 @@ "include-filter": "android.permission2.cts.RestrictedPermissionsTest" } ] + }, + { + "name": "CtsPermissionTestCases", + "options": [ + { + "include-filter": "android.permission.cts.SplitPermissionTest" + } + ] } ], "postsubmit": [ diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java index 165055ac828c..11fd7953e08f 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java @@ -82,6 +82,22 @@ public class WebViewUpdateServiceImpl { void prepareWebViewInSystemServer() { migrateFallbackStateOnBoot(); mWebViewUpdater.prepareWebViewInSystemServer(); + if (getCurrentWebViewPackage() == null) { + // We didn't find a valid WebView implementation. Try explicitly re-enabling the + // fallback package for all users in case it was disabled, even if we already did the + // one-time migration before. If this actually changes the state, WebViewUpdater will + // see the PackageManager broadcast shortly and try again. + WebViewProviderInfo[] webviewProviders = mSystemInterface.getWebViewPackages(); + WebViewProviderInfo fallbackProvider = getFallbackProvider(webviewProviders); + if (fallbackProvider != null) { + Slog.w(TAG, "No valid provider, trying to enable " + fallbackProvider.packageName); + mSystemInterface.enablePackageForAllUsers(mContext, fallbackProvider.packageName, + true); + } else { + Slog.e(TAG, "No valid provider and no fallback available."); + } + } + boolean multiProcessEnabled = isMultiProcessEnabled(); mSystemInterface.notifyZygote(multiProcessEnabled); if (multiProcessEnabled) { diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 5c55c2e63da1..0a88eef86ea8 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1419,6 +1419,13 @@ class ActivityStarter { stack.finishActivityLocked(mStartActivity, RESULT_CANCELED, null /* intentResultData */, "startActivity", true /* oomAdj */); } + + // Stack should also be detached from display and be removed if it's empty. + if (startedActivityStack != null && startedActivityStack.isAttached() + && startedActivityStack.numActivities() == 0 + && !startedActivityStack.isActivityTypeHome()) { + startedActivityStack.remove(); + } } mService.mWindowManager.continueSurfaceLayout(); } @@ -2289,15 +2296,17 @@ class ActivityStarter { } private int setTaskFromReuseOrCreateNewTask(TaskRecord taskToAffiliate) { + if (mRestrictedBgActivity && (mReuseTask == null || !mReuseTask.containsAppUid(mCallingUid)) + && handleBackgroundActivityAbort(mStartActivity)) { + return START_ABORTED; + } + mTargetStack = computeStackFocus(mStartActivity, true, mLaunchFlags, mOptions); // Do no move the target stack to front yet, as we might bail if // isLockTaskModeViolation fails below. if (mReuseTask == null) { - if (mRestrictedBgActivity && handleBackgroundActivityAbort(mStartActivity)) { - return START_ABORTED; - } final TaskRecord task = mTargetStack.createTaskRecord( mSupervisor.getNextTaskIdForUserLocked(mStartActivity.mUserId), mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info, @@ -2310,11 +2319,6 @@ class ActivityStarter { if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity + " in new task " + mStartActivity.getTaskRecord()); } else { - if (mRestrictedBgActivity && !mReuseTask.containsAppUid(mCallingUid)) { - if (handleBackgroundActivityAbort(mStartActivity)) { - return START_ABORTED; - } - } addOrReparentStartingActivity(mReuseTask, "setTaskFromReuseOrCreateNewTask"); } diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 60cfe14f4080..918927912c0b 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -540,14 +540,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree // If the app was already visible, don't reset the waitingToShow state. if (isHidden()) { waitingToShow = true; - - // Let's reset the draw state in order to prevent the starting window to be - // immediately dismissed when the app still has the surface. - forAllWindows(w -> { - if (w.mAttrs.type != TYPE_APPLICATION_STARTING) { - w.mWinAnimator.resetDrawState(); - } - }, true /* traverseTopToBottom */); } } @@ -1330,7 +1322,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree if (prevDc == null || prevDc == mDisplayContent) { return; } - if (prevDc.mChangingApps.contains(this)) { + + prevDc.mOpeningApps.remove(this); + if (prevDc.mChangingApps.remove(this)) { // This gets called *after* the AppWindowToken has been reparented to the new display. // That reparenting resulted in this window changing modes (eg. FREEFORM -> FULLSCREEN), // so this token is now "frozen" while waiting for the animation to start on prevDc @@ -1339,6 +1333,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree // so we need to cancel the change transition here. clearChangeLeash(getPendingTransaction(), true /* cancel */); } + prevDc.mClosingApps.remove(this); + if (prevDc.mFocusedApp == this) { prevDc.setFocusedApp(null); final TaskStack stack = dc.getTopStack(); @@ -3224,16 +3220,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree true /* topToBottom */); } - void removeFromPendingTransition() { - if (isWaitingForTransitionStart() && mDisplayContent != null) { - mDisplayContent.mOpeningApps.remove(this); - if (mDisplayContent.mChangingApps.remove(this)) { - clearChangeLeash(getPendingTransaction(), true /* cancel */); - } - mDisplayContent.mClosingApps.remove(this); - } - } - private void updateColorTransform() { if (mSurfaceControl != null && mLastAppSaturationInfo != null) { getPendingTransaction().setColorTransform(mSurfaceControl, diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index c3a769b63e5a..80848a8f24f0 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2377,9 +2377,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo + " to its current displayId=" + mDisplayId); } - // Clean up all pending transitions when stack reparent to another display. - stack.forAllAppWindows(AppWindowToken::removeFromPendingTransition); - prevDc.mTaskStackContainers.removeChild(stack); mTaskStackContainers.addStackToDisplay(stack, onTop); } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 203704bf7224..6dd85270e7e8 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -731,8 +731,13 @@ public final class SystemServer { (int) SystemClock.elapsedRealtime()); } traceBeginAndSlog("StartPackageManagerService"); - mPackageManagerService = PackageManagerService.main(mSystemContext, installer, - mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); + try { + Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain"); + mPackageManagerService = PackageManagerService.main(mSystemContext, installer, + mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); + } finally { + Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain"); + } mFirstBoot = mPackageManagerService.isFirstBoot(); mPackageManager = mSystemContext.getPackageManager(); traceEnd(); diff --git a/services/net/java/android/net/ipmemorystore/NetworkAttributes.java b/services/net/java/android/net/ipmemorystore/NetworkAttributes.java index e76976991797..818515ac9af1 100644 --- a/services/net/java/android/net/ipmemorystore/NetworkAttributes.java +++ b/services/net/java/android/net/ipmemorystore/NetworkAttributes.java @@ -127,6 +127,7 @@ public class NetworkAttributes { @Nullable private static InetAddress getByAddressOrNull(@Nullable final byte[] address) { + if (null == address) return null; try { return InetAddress.getByAddress(address); } catch (UnknownHostException e) { @@ -227,7 +228,9 @@ public class NetworkAttributes { } /** - * Set the lease expiry timestamp of assigned v4 address. + * Set the lease expiry timestamp of assigned v4 address. Long.MAX_VALUE is used + * to represent "infinite lease". + * * @param assignedV4AddressExpiry The lease expiry timestamp of assigned v4 address. * @return This builder. */ diff --git a/services/net/java/android/net/ipmemorystore/OnNetworkAttributesRetrievedListener.java b/services/net/java/android/net/ipmemorystore/OnNetworkAttributesRetrievedListener.java index ca6f3029d496..395ad98f38e0 100644 --- a/services/net/java/android/net/ipmemorystore/OnNetworkAttributesRetrievedListener.java +++ b/services/net/java/android/net/ipmemorystore/OnNetworkAttributesRetrievedListener.java @@ -40,8 +40,8 @@ public interface OnNetworkAttributesRetrievedListener { // NonNull, but still don't crash the system server if null if (null != listener) { listener.onNetworkAttributesRetrieved( - new Status(statusParcelable), l2Key, - new NetworkAttributes(networkAttributesParcelable)); + new Status(statusParcelable), l2Key, null == networkAttributesParcelable + ? null : new NetworkAttributes(networkAttributesParcelable)); } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java index bee3b2baf3dd..397d2155beeb 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java @@ -16,6 +16,7 @@ package com.android.server.notification; +import static android.app.Notification.EXTRA_SMALL_ICON; import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE; import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL; import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_POSITIVE; @@ -24,6 +25,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; @@ -33,8 +35,13 @@ import android.app.INotificationManager; import android.app.Notification; import android.app.NotificationChannel; import android.app.PendingIntent; +import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.graphics.Bitmap; +import android.graphics.drawable.Icon; import android.os.Binder; +import android.os.Build; import android.os.IBinder; import android.os.Parcel; import android.service.notification.NotificationListenerService; @@ -44,20 +51,34 @@ import android.service.notification.NotificationRankingUpdate; import android.service.notification.SnoozeCriterion; import android.test.suitebuilder.annotation.SmallTest; -import androidx.test.runner.AndroidJUnit4; - import com.android.server.UiServiceTestCase; +import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.List; +import androidx.test.runner.AndroidJUnit4; + @SmallTest @RunWith(AndroidJUnit4.class) public class NotificationListenerServiceTest extends UiServiceTestCase { + int targetSdk = 0; + + @Before + public void setUp() { + targetSdk = mContext.getApplicationInfo().targetSdkVersion; + } + + @After + public void tearDown() { + mContext.getApplicationInfo().targetSdkVersion = targetSdk; + } + @Test public void testGetActiveNotifications_notNull() throws Exception { TestListenerService service = new TestListenerService(); @@ -109,17 +130,6 @@ public class NotificationListenerServiceTest extends UiServiceTestCase { assertEquals(nru, nru1); } - private void detailedAssertEquals(RankingMap a, RankingMap b) { - Ranking arank = new Ranking(); - Ranking brank = new Ranking(); - assertArrayEquals(a.getOrderedKeys(), b.getOrderedKeys()); - for (String key : a.getOrderedKeys()) { - a.getRanking(key, arank); - b.getRanking(key, brank); - detailedAssertEquals("ranking for key <" + key + ">", arank, brank); - } - } - // Tests parceling of RankingMap and RankingMap.equals @Test public void testRankingMap_parcel() { @@ -133,28 +143,6 @@ public class NotificationListenerServiceTest extends UiServiceTestCase { assertEquals(rmap, rmap1); } - private void detailedAssertEquals(String comment, Ranking a, Ranking b) { - assertEquals(comment, a.getKey(), b.getKey()); - assertEquals(comment, a.getRank(), b.getRank()); - assertEquals(comment, a.matchesInterruptionFilter(), b.matchesInterruptionFilter()); - assertEquals(comment, a.getVisibilityOverride(), b.getVisibilityOverride()); - assertEquals(comment, a.getSuppressedVisualEffects(), b.getSuppressedVisualEffects()); - assertEquals(comment, a.getImportance(), b.getImportance()); - assertEquals(comment, a.getImportanceExplanation(), b.getImportanceExplanation()); - assertEquals(comment, a.getOverrideGroupKey(), b.getOverrideGroupKey()); - assertEquals(comment, a.getChannel(), b.getChannel()); - assertEquals(comment, a.getAdditionalPeople(), b.getAdditionalPeople()); - assertEquals(comment, a.getSnoozeCriteria(), b.getSnoozeCriteria()); - assertEquals(comment, a.canShowBadge(), b.canShowBadge()); - assertEquals(comment, a.getUserSentiment(), b.getUserSentiment()); - assertEquals(comment, a.isSuspended(), b.isSuspended()); - assertEquals(comment, a.getLastAudiblyAlertedMillis(), b.getLastAudiblyAlertedMillis()); - assertEquals(comment, a.isNoisy(), b.isNoisy()); - assertEquals(comment, a.getSmartReplies(), b.getSmartReplies()); - assertEquals(comment, a.canBubble(), b.canBubble()); - assertActionsEqual(a.getSmartActions(), b.getSmartActions()); - } - // Tests parceling of Ranking and Ranking.equals @Test public void testRanking_parcel() { @@ -167,10 +155,6 @@ public class NotificationListenerServiceTest extends UiServiceTestCase { assertEquals(ranking, ranking1); } - private void detailedAssertEquals(NotificationRankingUpdate a, NotificationRankingUpdate b) { - assertEquals(a.getRankingMap(), b.getRankingMap()); - } - // Tests NotificationRankingUpdate.equals(), and by extension, RankingMap and Ranking. @Test public void testRankingUpdate_equals() { @@ -203,6 +187,49 @@ public class NotificationListenerServiceTest extends UiServiceTestCase { assertNotEquals(nru, nru2); } + @Test + public void testLegacyIcons_preM() { + TestListenerService service = new TestListenerService(); + service.attachBaseContext(mContext); + service.targetSdk = Build.VERSION_CODES.LOLLIPOP_MR1; + + Bitmap largeIcon = Bitmap.createBitmap(100, 200, Bitmap.Config.RGB_565); + + Notification n = new Notification.Builder(mContext, "channel") + .setSmallIcon(android.R.drawable.star_on) + .setLargeIcon(Icon.createWithBitmap(largeIcon)) + .setContentTitle("test") + .build(); + + service.createLegacyIconExtras(n); + + assertEquals(android.R.drawable.star_on, n.extras.getInt(EXTRA_SMALL_ICON)); + assertEquals(android.R.drawable.star_on, n.icon); + assertNotNull(n.largeIcon); + assertNotNull(n.extras.getParcelable(Notification.EXTRA_LARGE_ICON)); + } + + @Test + public void testLegacyIcons_mPlus() { + TestListenerService service = new TestListenerService(); + service.attachBaseContext(mContext); + service.targetSdk = Build.VERSION_CODES.M; + + Bitmap largeIcon = Bitmap.createBitmap(100, 200, Bitmap.Config.RGB_565); + + Notification n = new Notification.Builder(mContext, "channel") + .setSmallIcon(android.R.drawable.star_on) + .setLargeIcon(Icon.createWithBitmap(largeIcon)) + .setContentTitle("test") + .build(); + + service.createLegacyIconExtras(n); + + assertEquals(0, n.extras.getInt(EXTRA_SMALL_ICON)); + assertNull(n.largeIcon); + } + + // Test data private String[] mKeys = new String[] { "key", "key1", "key2", "key3", "key4"}; @@ -346,8 +373,46 @@ public class NotificationListenerServiceTest extends UiServiceTestCase { } } + private void detailedAssertEquals(NotificationRankingUpdate a, NotificationRankingUpdate b) { + assertEquals(a.getRankingMap(), b.getRankingMap()); + } + + private void detailedAssertEquals(String comment, Ranking a, Ranking b) { + assertEquals(comment, a.getKey(), b.getKey()); + assertEquals(comment, a.getRank(), b.getRank()); + assertEquals(comment, a.matchesInterruptionFilter(), b.matchesInterruptionFilter()); + assertEquals(comment, a.getVisibilityOverride(), b.getVisibilityOverride()); + assertEquals(comment, a.getSuppressedVisualEffects(), b.getSuppressedVisualEffects()); + assertEquals(comment, a.getImportance(), b.getImportance()); + assertEquals(comment, a.getImportanceExplanation(), b.getImportanceExplanation()); + assertEquals(comment, a.getOverrideGroupKey(), b.getOverrideGroupKey()); + assertEquals(comment, a.getChannel(), b.getChannel()); + assertEquals(comment, a.getAdditionalPeople(), b.getAdditionalPeople()); + assertEquals(comment, a.getSnoozeCriteria(), b.getSnoozeCriteria()); + assertEquals(comment, a.canShowBadge(), b.canShowBadge()); + assertEquals(comment, a.getUserSentiment(), b.getUserSentiment()); + assertEquals(comment, a.isSuspended(), b.isSuspended()); + assertEquals(comment, a.getLastAudiblyAlertedMillis(), b.getLastAudiblyAlertedMillis()); + assertEquals(comment, a.isNoisy(), b.isNoisy()); + assertEquals(comment, a.getSmartReplies(), b.getSmartReplies()); + assertEquals(comment, a.canBubble(), b.canBubble()); + assertActionsEqual(a.getSmartActions(), b.getSmartActions()); + } + + private void detailedAssertEquals(RankingMap a, RankingMap b) { + Ranking arank = new Ranking(); + Ranking brank = new Ranking(); + assertArrayEquals(a.getOrderedKeys(), b.getOrderedKeys()); + for (String key : a.getOrderedKeys()) { + a.getRanking(key, arank); + b.getRanking(key, brank); + detailedAssertEquals("ranking for key <" + key + ">", arank, brank); + } + } + public static class TestListenerService extends NotificationListenerService { private final IBinder binder = new LocalBinder(); + public int targetSdk = 0; public TestListenerService() { mWrapper = mock(NotificationListenerWrapper.class); @@ -369,5 +434,19 @@ public class NotificationListenerServiceTest extends UiServiceTestCase { return TestListenerService.this; } } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + } + + @Override + public ApplicationInfo getApplicationInfo() { + ApplicationInfo info = super.getApplicationInfo(); + if (targetSdk != 0) { + info.targetSdkVersion = targetSdk; + } + return info; + } } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java index 53b0add8c37e..4986a6d5bd0d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java @@ -585,7 +585,10 @@ class ActivityTestsBase { } void tearDown() { - mHandlerThread.quitSafely(); + // Make sure there are no running messages and then quit the thread so the next test + // won't be affected. + mHandlerThread.getThreadHandler().runWithScissors(mHandlerThread::quit, + 0 /* timeout */); } } @@ -630,7 +633,8 @@ class ActivityTestsBase { mWindowManager = prepareMockWindowManager(); mKeyguardController = mock(KeyguardController.class); - // Do not schedule idle timeouts + // Do not schedule idle that may touch methods outside the scope of the test. + doNothing().when(this).scheduleIdleLocked(); doNothing().when(this).scheduleIdleTimeoutLocked(any()); // unit test version does not handle launch wake lock doNothing().when(this).acquireLaunchWakelock(); diff --git a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java index e8e2a3d8453e..7a0ab9ca6a28 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java +++ b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java @@ -29,8 +29,6 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; -import android.provider.DeviceConfig; -import android.provider.Settings; import android.telephony.Rlog; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -364,23 +362,8 @@ public final class TelephonyPermissions { */ private static boolean reportAccessDeniedToReadIdentifiers(Context context, int subId, int pid, int uid, String callingPackage, String message) { - // Check if the application is not preinstalled; if not then a separate setting is required - // to relax the check to begin flagging problems with non-preinstalled apps early. - boolean relax3PDeviceIdentifierCheck = Settings.Global.getInt(context.getContentResolver(), - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_3P_CHECK_RELAXED, 0) == 1; boolean isPreinstalled = false; - // Also check if the application is a preloaded non-privileged app; if so there is a - // separate setting to relax the check for these apps to ensure users can relax the check - // for non-preinstalled or non-priv apps as needed while continuing to test the other. - boolean relaxNonPrivDeviceIdentifierCheck = Settings.Global.getInt( - context.getContentResolver(), - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_NON_PRIV_CHECK_RELAXED, 0) == 1; boolean isPrivApp = false; - // Similar to above support relaxing the check for privileged apps while still enforcing it - // for non-privileged and non-preinstalled apps. - boolean relaxPrivDeviceIdentifierCheck = Settings.Global.getInt( - context.getContentResolver(), - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_PRIV_CHECK_RELAXED, 0) == 1; ApplicationInfo callingPackageInfo = null; try { callingPackageInfo = context.getPackageManager().getApplicationInfoAsUser( @@ -399,58 +382,40 @@ public final class TelephonyPermissions { Log.e(LOG_TAG, "Exception caught obtaining package info for package " + callingPackage, e); } - // The new Q restrictions for device identifier access will be enforced for all apps with - // settings to individually disable the new restrictions for privileged, preloaded - // non-privileged, and non-preinstalled apps. - if (!isIdentifierCheckDisabled() && ( - (isPrivApp && !relaxPrivDeviceIdentifierCheck) - || (!isPreinstalled && !relax3PDeviceIdentifierCheck) - || (isPreinstalled && !isPrivApp && !relaxNonPrivDeviceIdentifierCheck))) { - // The current package should only be reported in StatsLog if it has not previously been - // reported for the currently invoked device identifier method. - boolean packageReported = sReportedDeviceIDPackages.containsKey(callingPackage); - if (!packageReported || !sReportedDeviceIDPackages.get(callingPackage).contains( - message)) { - Set invokedMethods; - if (!packageReported) { - invokedMethods = new HashSet<String>(); - sReportedDeviceIDPackages.put(callingPackage, invokedMethods); - } else { - invokedMethods = sReportedDeviceIDPackages.get(callingPackage); - } - invokedMethods.add(message); - StatsLog.write(StatsLog.DEVICE_IDENTIFIER_ACCESS_DENIED, callingPackage, message, - isPreinstalled, isPrivApp); + // The current package should only be reported in StatsLog if it has not previously been + // reported for the currently invoked device identifier method. + boolean packageReported = sReportedDeviceIDPackages.containsKey(callingPackage); + if (!packageReported || !sReportedDeviceIDPackages.get(callingPackage).contains( + message)) { + Set invokedMethods; + if (!packageReported) { + invokedMethods = new HashSet<String>(); + sReportedDeviceIDPackages.put(callingPackage, invokedMethods); + } else { + invokedMethods = sReportedDeviceIDPackages.get(callingPackage); } - Log.w(LOG_TAG, "reportAccessDeniedToReadIdentifiers:" + callingPackage + ":" + message - + ":isPreinstalled=" + isPreinstalled + ":isPrivApp=" + isPrivApp); - // if the target SDK is pre-Q then check if the calling package would have previously - // had access to device identifiers. - if (callingPackageInfo != null && ( - callingPackageInfo.targetSdkVersion < Build.VERSION_CODES.Q)) { - if (context.checkPermission( - android.Manifest.permission.READ_PHONE_STATE, - pid, - uid) == PackageManager.PERMISSION_GRANTED) { - return false; - } - if (checkCarrierPrivilegeForSubId(subId)) { - return false; - } + invokedMethods.add(message); + StatsLog.write(StatsLog.DEVICE_IDENTIFIER_ACCESS_DENIED, callingPackage, message, + isPreinstalled, isPrivApp); + } + Log.w(LOG_TAG, "reportAccessDeniedToReadIdentifiers:" + callingPackage + ":" + message + + ":isPreinstalled=" + isPreinstalled + ":isPrivApp=" + isPrivApp); + // if the target SDK is pre-Q then check if the calling package would have previously + // had access to device identifiers. + if (callingPackageInfo != null && ( + callingPackageInfo.targetSdkVersion < Build.VERSION_CODES.Q)) { + if (context.checkPermission( + android.Manifest.permission.READ_PHONE_STATE, + pid, + uid) == PackageManager.PERMISSION_GRANTED) { + return false; + } + if (checkCarrierPrivilegeForSubId(subId)) { + return false; } - throw new SecurityException(message + ": The user " + uid - + " does not meet the requirements to access device identifiers."); - } else { - return checkReadPhoneState(context, subId, pid, uid, callingPackage, message); } - } - - /** - * Returns true if the new device identifier access restrictions are disabled. - */ - private static boolean isIdentifierCheckDisabled() { - return DeviceConfig.getInt(DeviceConfig.NAMESPACE_PRIVACY, - PROPERTY_DEVICE_IDENTIFIER_ACCESS_RESTRICTIONS_DISABLED, 0) == 1; + throw new SecurityException(message + ": The user " + uid + + " does not meet the requirements to access device identifiers."); } /** diff --git a/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java b/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java index 17fa93135c7d..45ddc3eed39c 100644 --- a/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java +++ b/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java @@ -39,6 +39,8 @@ import com.android.internal.colorextraction.types.Tonal; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; /** * Tests color extraction generation. @@ -48,16 +50,19 @@ import org.junit.runner.RunWith; public class ColorExtractorTest { Context mContext; + @Mock + WallpaperManager mWallpaperManager; @Before public void setup() { + MockitoAnnotations.initMocks(this); mContext = InstrumentationRegistry.getContext(); } @Test public void ColorExtractor_extractWhenInitialized() { ExtractionType type = mock(Tonal.class); - new ColorExtractor(mContext, type, true); + new ColorExtractor(mContext, type, true, mWallpaperManager); // 1 for lock and 1 for system verify(type, times(2)) .extractInto(any(), any(), any(), any()); @@ -84,7 +89,7 @@ public class ColorExtractorTest { outGradientColorsDark.set(colorsExpectedDark); outGradientColorsExtraDark.set(colorsExpectedExtraDark); }; - ColorExtractor extractor = new ColorExtractor(mContext, type, true); + ColorExtractor extractor = new ColorExtractor(mContext, type, true, mWallpaperManager); GradientColors colors = extractor.getColors(WallpaperManager.FLAG_SYSTEM, ColorExtractor.TYPE_NORMAL); @@ -99,7 +104,8 @@ public class ColorExtractorTest { public void addOnColorsChangedListener_invokesListener() { ColorExtractor.OnColorsChangedListener mockedListeners = mock(ColorExtractor.OnColorsChangedListener.class); - ColorExtractor extractor = new ColorExtractor(mContext, new Tonal(mContext), true); + ColorExtractor extractor = new ColorExtractor(mContext, new Tonal(mContext), true, + mWallpaperManager); extractor.addOnColorsChangedListener(mockedListeners); extractor.onColorsChanged(new WallpaperColors(Color.valueOf(Color.RED), null, null), diff --git a/tools/incident_section_gen/main.cpp b/tools/incident_section_gen/main.cpp index c9c0edc59585..91f875ed9918 100644 --- a/tools/incident_section_gen/main.cpp +++ b/tools/incident_section_gen/main.cpp @@ -408,9 +408,10 @@ static bool generateSectionListCpp(Descriptor const* descriptor) { for (int i=0; i<descriptor->field_count(); i++) { const FieldDescriptor* field = descriptor->field(i); - if (field->type() != FieldDescriptor::TYPE_MESSAGE - && field->type() != FieldDescriptor::TYPE_STRING) { - continue; + if (field->type() != FieldDescriptor::TYPE_MESSAGE && + field->type() != FieldDescriptor::TYPE_STRING && + field->type() != FieldDescriptor::TYPE_BYTES) { + continue; } const SectionFlags s = getSectionFlags(field); |