diff options
44 files changed, 699 insertions, 434 deletions
diff --git a/config/dirty-image-objects b/config/dirty-image-objects index dfd091cc1aff..2584610e2848 100644 --- a/config/dirty-image-objects +++ b/config/dirty-image-objects @@ -28,359 +28,270 @@ # Then, grep for lines containing "Private dirty object" from the output. # This particular file was generated by dumping systemserver and systemui. # -Landroid/accounts/Account; -Landroid/accounts/OnAccountsUpdateListener; Landroid/animation/LayoutTransition; Landroid/app/ActivityManager; -Landroid/app/ActivityManager$OnUidImportanceListener; Landroid/app/ActivityTaskManager; Landroid/app/ActivityThread; -Landroid/app/admin/DevicePolicyManager; Landroid/app/AlarmManager; -Landroid/app/Application; Landroid/app/AppOpsManager; -Landroid/app/backup/BackupManager; Landroid/app/ContextImpl; -Landroid/app/INotificationManager; -Landroid/app/Notification$BigPictureStyle; -Landroid/app/Notification$BigTextStyle; -Landroid/app/Notification$InboxStyle; -Landroid/app/NotificationChannel; -Landroid/app/NotificationChannelGroup; +Landroid/app/Notification; Landroid/app/NotificationManager; -Landroid/app/PendingIntent; -Landroid/app/PendingIntent$OnFinished; +Landroid/app/PendingIntent$FinishedDispatcher; +Landroid/app/PropertyInvalidatedCache$NoPreloadHolder; Landroid/app/QueuedWork; Landroid/app/ResourcesManager; +Landroid/app/SystemServiceRegistry; Landroid/app/WallpaperManager; -Landroid/app/WindowConfiguration; -Landroid/bluetooth/BluetoothAdapter; -Landroid/bluetooth/BluetoothDevice; -Landroid/bluetooth/BluetoothProfile; -Landroid/bluetooth/IBluetoothA2dp; -Landroid/bluetooth/IBluetoothHeadsetPhone; -Landroid/bluetooth/IBluetoothHidDevice; -Landroid/bluetooth/IBluetoothHidHost; -Landroid/bluetooth/IBluetoothMap; -Landroid/bluetooth/IBluetoothPan; -Landroid/bluetooth/IBluetoothPbap; -Landroid/bluetooth/IBluetoothSap; -Landroid/content/ClipboardManager$OnPrimaryClipChangedListener; -Landroid/content/ComponentName; -Landroid/content/ContentProvider$PipeDataWriter; +Landroid/app/backup/BackupManager; +Landroid/compat/Compatibility; +Landroid/content/AsyncQueryHandler; +Landroid/content/ContentProviderClient; Landroid/content/ContentResolver; Landroid/content/Context; -Landroid/content/Intent; -Landroid/content/pm/PackageManager$OnPermissionsChangedListener; -Landroid/content/pm/VersionedPackage; -Landroid/content/res/Configuration; -Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener; +Landroid/content/pm/PackageItemInfo; +Landroid/content/pm/UserPackage; +Landroid/content/res/ResourceTimer; Landroid/database/CursorWindow; Landroid/database/sqlite/SQLiteCompatibilityWalFlags; -Landroid/database/sqlite/SQLiteDatabase$CursorFactory; +Landroid/database/sqlite/SQLiteDebug$NoPreloadHolder; Landroid/database/sqlite/SQLiteGlobal; -Landroid/database/sqlite/SQLiteTransactionListener; Landroid/ddm/DdmHandleAppName; Landroid/graphics/Bitmap; Landroid/graphics/Canvas; -Landroid/graphics/drawable/AdaptiveIconDrawable; -Landroid/graphics/drawable/ColorDrawable; -Landroid/graphics/drawable/GradientDrawable; -Landroid/graphics/drawable/Icon; -Landroid/graphics/drawable/InsetDrawable; -Landroid/graphics/drawable/RippleDrawable; -Landroid/graphics/drawable/VectorDrawable$VGroup; -Landroid/graphics/ImageDecoder; -Landroid/graphics/Rect; +Landroid/graphics/Compatibility; +Landroid/graphics/HardwareRenderer; Landroid/graphics/TemporaryBuffer; -Landroid/hardware/biometrics/BiometricSourceType; -Landroid/hardware/display/ColorDisplayManager$ColorDisplayManagerInternal; -Landroid/hardware/display/DisplayManagerGlobal; -Landroid/hardware/display/NightDisplayListener$Callback; -Landroid/hardware/input/InputManager; -Landroid/hardware/input/InputManager$InputDeviceListener; +Landroid/graphics/Typeface; +Landroid/graphics/drawable/AdaptiveIconDrawable; Landroid/hardware/SensorPrivacyManager; Landroid/hardware/SystemSensorManager; -Landroid/icu/impl/OlsonTimeZone; -Landroid/icu/text/BreakIterator; +Landroid/hardware/devicestate/DeviceStateManagerGlobal; +Landroid/hardware/display/ColorDisplayManager$ColorDisplayManagerInternal; +Landroid/hardware/display/DisplayManagerGlobal; +Landroid/hardware/input/InputManagerGlobal; +Landroid/hardware/location/GeofenceHardwareImpl; +Landroid/icu/impl/number/range/StandardPluralRanges; Landroid/icu/text/Collator; -Landroid/icu/text/DateFormat$BooleanAttribute; -Landroid/icu/text/DateTimePatternGenerator$DTPGflags; -Landroid/icu/text/PluralRules$Operand; Landroid/icu/util/TimeZone; -Landroid/location/GpsStatus$Listener; -Landroid/location/LocationListener; +Landroid/location/LocationManager; Landroid/media/AudioManager; +Landroid/media/AudioPlaybackConfiguration; +Landroid/media/AudioSystem; +Landroid/media/MediaCodec; +Landroid/media/MediaCodecList; +Landroid/media/MediaFrameworkPlatformInitializer; +Landroid/media/MediaRouter2Manager; Landroid/media/MediaRouter; Landroid/media/PlayerBase; -Landroid/media/session/MediaSessionManager; -Landroid/net/apf/ApfCapabilities; -Landroid/net/ConnectivityManager; -Landroid/net/ConnectivityManager$OnNetworkActiveListener; -Landroid/net/ConnectivityThread$Singleton; -Landroid/net/IpConfiguration$IpAssignment; -Landroid/net/IpConfiguration$ProxySettings; -Landroid/net/IpPrefix; -Landroid/net/LinkAddress; -Landroid/net/LinkProperties; -Landroid/net/Network; -Landroid/net/NetworkCapabilities; -Landroid/net/NetworkInfo; -Landroid/net/NetworkInfo$State; -Landroid/net/NetworkRequest; -Landroid/net/NetworkRequest$Type; -Landroid/net/RouteInfo; -Landroid/net/StringNetworkSpecifier; -Landroid/net/TrafficStats; -Landroid/net/UidRange; -Landroid/net/Uri$HierarchicalUri; -Landroid/net/Uri$StringUri; -Landroid/net/wifi/WifiManager; -Landroid/net/wifi/WifiManager$SoftApCallback; -Landroid/os/AsyncResult; +Landroid/media/audiopolicy/AudioProductStrategy; +Landroid/media/audiopolicy/AudioVolumeGroup; +Landroid/nfc/NfcAdapter; +Landroid/nfc/NfcFrameworkInitializer; +Landroid/nfc/cardemulation/CardEmulation; Landroid/os/AsyncTask; +Landroid/os/BaseBundle; +Landroid/os/Binder; Landroid/os/BinderProxy; -Landroid/os/Bundle; -Landroid/os/DeadObjectException; Landroid/os/Environment; Landroid/os/FileObserver; Landroid/os/Handler; -Landroid/os/IDeviceIdleController; Landroid/os/LocaleList; Landroid/os/Looper; Landroid/os/Message; -Landroid/os/ParcelUuid; +Landroid/os/NullVibrator; +Landroid/os/Parcel; Landroid/os/Process; -Landroid/os/RecoverySystem; Landroid/os/ServiceManager; -Landroid/os/storage/StorageManager; Landroid/os/StrictMode; -Landroid/os/Trace; +Landroid/os/UEventObserver; +Landroid/os/UserManager; Landroid/os/WorkSource; -Landroid/os/WorkSource$WorkChain; +Landroid/os/storage/StorageManager; Landroid/permission/PermissionManager; +Landroid/provider/DeviceConfigInitializer; Landroid/provider/FontsContract; -Landroid/provider/Settings$SettingNotFoundException; +Landroid/provider/Settings; +Landroid/renderscript/RenderScript; Landroid/renderscript/RenderScriptCacheDir; -Landroid/security/IKeyChainService; -Landroid/security/keystore/AndroidKeyStoreProvider; +Landroid/security/keystore2/KeyStoreCryptoOperationUtils; Landroid/security/net/config/ApplicationConfig; Landroid/security/net/config/SystemCertificateSource$NoPreloadHolder; -Landroid/telecom/PhoneAccountHandle; +Landroid/security/net/config/UserCertificateSource$NoPreloadHolder; +Landroid/telecom/Log; +Landroid/telecom/TelecomManager; Landroid/telephony/AnomalyReporter; -Landroid/telephony/CellSignalStrengthCdma; -Landroid/telephony/CellSignalStrengthGsm; -Landroid/telephony/CellSignalStrengthLte; -Landroid/telephony/CellSignalStrengthNr; -Landroid/telephony/CellSignalStrengthTdscdma; -Landroid/telephony/CellSignalStrengthWcdma; -Landroid/telephony/DataSpecificRegistrationInfo; -Landroid/telephony/emergency/EmergencyNumber; -Landroid/telephony/ims/ImsMmTelManager$CapabilityCallback$CapabilityBinder; -Landroid/telephony/ims/ImsMmTelManager$RegistrationCallback$RegistrationBinder; -Landroid/telephony/ims/ImsReasonInfo; -Landroid/telephony/ims/ProvisioningManager$Callback$CallbackBinder; -Landroid/telephony/ModemActivityInfo; -Landroid/telephony/ModemInfo; -Landroid/telephony/NetworkRegistrationInfo; -Landroid/telephony/NetworkService; +Landroid/telephony/TelephonyFrameworkInitializer; +Landroid/telephony/TelephonyLocalConnection; Landroid/telephony/TelephonyManager; -Landroid/telephony/VoiceSpecificRegistrationInfo; +Landroid/telephony/TelephonyRegistryManager; +Landroid/text/DynamicLayout; +Landroid/text/TextUtils; Landroid/text/format/DateFormat; +Landroid/text/format/DateUtils; +Landroid/text/method/ArrowKeyMovementMethod; +Landroid/text/method/LinkMovementMethod; Landroid/text/method/SingleLineTransformationMethod; -Landroid/text/Selection$MemoryTextWatcher; -Landroid/text/SpanWatcher; -Landroid/text/style/AlignmentSpan; -Landroid/text/style/CharacterStyle; -Landroid/text/style/LeadingMarginSpan; -Landroid/text/style/LineBackgroundSpan; -Landroid/text/style/LineHeightSpan; -Landroid/text/style/MetricAffectingSpan; -Landroid/text/style/ReplacementSpan; -Landroid/text/style/SuggestionSpan; -Landroid/text/style/TabStopSpan; -Landroid/text/TextUtils; -Landroid/text/TextWatcher; -Landroid/transition/ChangeClipBounds; -Landroid/transition/ChangeImageTransform; -Landroid/transition/ChangeTransform; +Landroid/text/style/ClickableSpan; +Landroid/timezone/TelephonyLookup; +Landroid/timezone/TimeZoneFinder; Landroid/util/ArrayMap; Landroid/util/ArraySet; -Landroid/util/DisplayMetrics; Landroid/util/EventLog; -Landroid/util/Log; -Landroid/util/Patterns; -Landroid/view/AbsSavedState$1; -Landroid/view/accessibility/AccessibilityManager; -Landroid/view/accessibility/AccessibilityManager$AccessibilityServicesStateChangeListener; -Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener; -Landroid/view/accessibility/AccessibilityNodeIdManager; -Landroid/view/autofill/AutofillManager; -Landroid/view/autofill/Helper; +Landroid/util/NtpTrustedTime; Landroid/view/Choreographer; -Landroid/view/inputmethod/InputMethodManager; -Landroid/view/IWindowManager; +Landroid/view/CrossWindowBlurListeners; +Landroid/view/DisplayCutout; +Landroid/view/KeyEvent; +Landroid/view/MotionEvent; Landroid/view/PointerIcon; -Landroid/view/RemoteAnimationAdapter; -Landroid/view/ThreadedRenderer; +Landroid/view/RoundedCorners; +Landroid/view/SurfaceControl; Landroid/view/View; -Landroid/view/View$OnHoverListener; +Landroid/view/ViewGroup$TouchTarget; Landroid/view/ViewRootImpl; -Landroid/view/ViewStub; -Landroid/view/ViewStub$OnInflateListener; Landroid/view/ViewTreeObserver; -Landroid/view/WindowManager$LayoutParams; Landroid/view/WindowManagerGlobal; -Landroid/widget/ActionMenuPresenter$OverflowMenuButton; -Landroid/widget/ActionMenuView; -Landroid/widget/Button; -Landroid/widget/CheckBox; -Landroid/widget/FrameLayout; -Landroid/widget/ImageButton; +Landroid/view/accessibility/AccessibilityManager; +Landroid/view/accessibility/AccessibilityNodeIdManager; +Landroid/view/autofill/Helper; +Landroid/view/inputmethod/IInputMethodManagerGlobalInvoker; +Landroid/view/inputmethod/InputMethodManager; +Landroid/webkit/CookieSyncManager; +Landroid/webkit/WebView; +Landroid/webkit/WebViewFactory; +Landroid/webkit/WebViewZygote; +Landroid/widget/AbsListView; Landroid/widget/ImageView; Landroid/widget/LinearLayout; -Landroid/widget/RelativeLayout; -Landroid/widget/SeekBar; -Landroid/widget/Space; -Landroid/widget/TextView; -Landroid/widget/Toolbar; -[B -Lcom/android/ims/ImsManager; +Landroid/widget/Toast; +Landroid/window/SurfaceSyncGroup; +Lcom/android/i18n/timezone/TelephonyLookup; +Lcom/android/i18n/timezone/TimeZoneFinder; +Lcom/android/internal/config/appcloning/AppCloningDeviceConfigHelper; +Lcom/android/internal/content/om/OverlayConfig; +Lcom/android/internal/display/BrightnessSynchronizer; +Lcom/android/internal/infra/AndroidFuture; +Lcom/android/internal/inputmethod/ImeTracing; +Lcom/android/internal/inputmethod/InputMethodPrivilegedOperationsRegistry; +Lcom/android/internal/jank/InteractionJankMonitor$InstanceHolder; +Lcom/android/internal/jank/InteractionJankMonitor; Lcom/android/internal/logging/MetricsLogger; Lcom/android/internal/os/BackgroundThread; Lcom/android/internal/os/BinderInternal; -Lcom/android/internal/os/BinderInternal$BinderProxyLimitListener; +Lcom/android/internal/os/KernelCpuBpfTracking; Lcom/android/internal/os/RuntimeInit; Lcom/android/internal/os/SomeArgs; -Lcom/android/internal/policy/DecorView; -Lcom/android/internal/statusbar/IStatusBarService; -Lcom/android/internal/telephony/AppSmsManager; -Landroid/telephony/CallerInfoAsyncQuery$OnQueryCompleteListener; -Lcom/android/internal/telephony/CarrierActionAgent; -Lcom/android/internal/telephony/cat/CatService; -Lcom/android/internal/telephony/cat/IconLoader; -Lcom/android/internal/telephony/cat/RilMessageDecoder; -Lcom/android/internal/telephony/cdma/CdmaSubscriptionSourceManager; -Lcom/android/internal/telephony/cdma/EriManager; -Lcom/android/internal/telephony/CellularNetworkValidator; -Lcom/android/internal/telephony/CommandException; -Lcom/android/internal/telephony/dataconnection/DataConnection$DcActivatingState; -Lcom/android/internal/telephony/dataconnection/DataConnection$DcActiveState; -Lcom/android/internal/telephony/dataconnection/DataConnection$DcInactiveState; -Lcom/android/internal/telephony/dataconnection/DataEnabledSettings; -Lcom/android/internal/telephony/dataconnection/DcTracker; -Lcom/android/internal/telephony/euicc/EuiccCardController; -Lcom/android/internal/telephony/euicc/EuiccController; -Lcom/android/internal/telephony/GsmAlphabet; -Lcom/android/internal/telephony/GsmCdmaCallTracker; -Lcom/android/internal/telephony/GsmCdmaPhone; -Lcom/android/internal/telephony/IccPhoneBookInterfaceManager; -Lcom/android/internal/telephony/IccSmsInterfaceManager; -Lcom/android/internal/telephony/ims/ImsResolver; -Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker; -Lcom/android/internal/telephony/imsphone/ImsPhone; -Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker; -Lcom/android/internal/telephony/ims/RcsMessageStoreController; +Lcom/android/internal/os/ZygoteInit; +Lcom/android/internal/policy/AttributeCache; +Lcom/android/internal/protolog/BaseProtoLogImpl; +Lcom/android/internal/protolog/ProtoLogImpl; +Lcom/android/internal/statusbar/NotificationVisibility; +Lcom/android/internal/telephony/CellBroadcastServiceManager; Lcom/android/internal/telephony/IntentBroadcaster; -Lcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy; -Lcom/android/internal/telephony/metrics/TelephonyMetrics; +Lcom/android/internal/telephony/MccTable; Lcom/android/internal/telephony/MultiSimSettingController; -Lcom/android/internal/telephony/nano/CarrierIdProto$CarrierAttribute; -Lcom/android/internal/telephony/nano/CarrierIdProto$CarrierId; -Lcom/android/internal/telephony/nano/TelephonyProto$RilDataCall; -Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession$Event; -Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$RilCall; -Lcom/android/internal/telephony/NitzStateMachine; +Lcom/android/internal/telephony/PackageChangeReceiver; Lcom/android/internal/telephony/PhoneConfigurationManager; Lcom/android/internal/telephony/PhoneFactory; -Lcom/android/internal/telephony/PhoneSwitcher; Lcom/android/internal/telephony/ProxyController; -Lcom/android/internal/telephony/RadioConfig; -Lcom/android/internal/telephony/RIL; Lcom/android/internal/telephony/RILRequest; -Lcom/android/internal/telephony/RilWakelockInfo; -Lcom/android/internal/telephony/ServiceStateTracker; -Lcom/android/internal/telephony/SimActivationTracker; +Lcom/android/internal/telephony/RadioConfig; +Lcom/android/internal/telephony/RadioInterfaceCapabilityController; Lcom/android/internal/telephony/SmsApplication; Lcom/android/internal/telephony/SmsBroadcastUndelivered; -Lcom/android/internal/telephony/SmsStorageMonitor; -Lcom/android/internal/telephony/SmsUsageMonitor; -Lcom/android/internal/telephony/SubscriptionController; -Lcom/android/internal/telephony/SubscriptionInfoUpdater; +Lcom/android/internal/telephony/SomeArgs; Lcom/android/internal/telephony/TelephonyComponentFactory; Lcom/android/internal/telephony/TelephonyDevController; -Lcom/android/internal/telephony/TelephonyTester; -Lcom/android/internal/telephony/uicc/AdnRecordCache; -Lcom/android/internal/telephony/uicc/UiccCardApplication; +Lcom/android/internal/telephony/cat/CatService; +Lcom/android/internal/telephony/cdma/CdmaInboundSmsHandler; +Lcom/android/internal/telephony/cdma/CdmaSubscriptionSourceManager; +Lcom/android/internal/telephony/euicc/EuiccCardController; +Lcom/android/internal/telephony/euicc/EuiccController; +Lcom/android/internal/telephony/ims/ImsResolver; +Lcom/android/internal/telephony/metrics/TelephonyMetrics; +Lcom/android/internal/telephony/nano/PersistAtomsProto$CarrierIdMismatch; +Lcom/android/internal/telephony/nano/PersistAtomsProto$CellularDataServiceSwitch; +Lcom/android/internal/telephony/nano/PersistAtomsProto$CellularServiceState; +Lcom/android/internal/telephony/nano/PersistAtomsProto$DataCallSession; +Lcom/android/internal/telephony/nano/PersistAtomsProto$EmergencyNumbersInfo; +Lcom/android/internal/telephony/nano/PersistAtomsProto$GbaEvent; +Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsDedicatedBearerEvent; +Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsDedicatedBearerListenerEvent; +Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationFeatureTagStats; +Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationServiceDescStats; +Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationStats; +Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationTermination; +Lcom/android/internal/telephony/nano/PersistAtomsProto$IncomingSms; +Lcom/android/internal/telephony/nano/PersistAtomsProto$NetworkRequests; +Lcom/android/internal/telephony/nano/PersistAtomsProto$NetworkRequestsV2; +Lcom/android/internal/telephony/nano/PersistAtomsProto$OutgoingShortCodeSms; +Lcom/android/internal/telephony/nano/PersistAtomsProto$OutgoingSms; +Lcom/android/internal/telephony/nano/PersistAtomsProto$PresenceNotifyEvent; +Lcom/android/internal/telephony/nano/PersistAtomsProto$RcsAcsProvisioningStats; +Lcom/android/internal/telephony/nano/PersistAtomsProto$RcsClientProvisioningStats; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteController; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteIncomingDatagram; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteOutgoingDatagram; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteProvision; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteSession; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteSosMessageRecommender; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SipDelegateStats; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SipMessageResponse; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SipTransportFeatureTagStats; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SipTransportSession; +Lcom/android/internal/telephony/nano/PersistAtomsProto$UceEventStats; +Lcom/android/internal/telephony/nano/PersistAtomsProto$UnmeteredNetworks; +Lcom/android/internal/telephony/nano/PersistAtomsProto$VoiceCallRatUsage; +Lcom/android/internal/telephony/nano/PersistAtomsProto$VoiceCallSession; +Lcom/android/internal/telephony/nano/TelephonyProto$RilDataCall; +Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$RilCall; +Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyServiceState$NetworkRegistrationInfo; +Lcom/android/internal/telephony/satellite/PointingAppController; +Lcom/android/internal/telephony/satellite/SatelliteModemInterface; Lcom/android/internal/telephony/uicc/UiccController; -Lcom/android/internal/telephony/uicc/UiccProfile; Lcom/android/internal/telephony/uicc/UiccStateChangedLauncher; -Lcom/android/internal/telephony/uicc/UsimFileHandler; -Lcom/android/internal/telephony/uicc/VoiceMailConstants; -Lcom/android/internal/util/LatencyTracker; -Lcom/android/internal/util/StateMachine$SmHandler; -Lcom/android/okhttp/OkHttpClient; -Lcom/android/okhttp/okio/AsyncTimeout; -Lcom/android/okhttp/okio/SegmentPool; +Lcom/android/internal/util/ContrastColorUtil; +Lcom/android/internal/view/WindowManagerPolicyThread; +Lcom/android/org/bouncycastle/crypto/CryptoServicesRegistrar; Lcom/android/phone/ecc/nano/ProtobufEccData$CountryInfo; Lcom/android/phone/ecc/nano/ProtobufEccData$EccInfo; -Lcom/android/server/sip/SipWakeupTimer; -Lcom/android/server/SystemConfig; +Lcom/android/server/AppWidgetBackupBridge; Ldalvik/system/BaseDexClassLoader; Ldalvik/system/BlockGuard; Ldalvik/system/CloseGuard; Ldalvik/system/RuntimeHooks; Ldalvik/system/SocketTagger; -Ljava/io/BufferedReader; -Ljava/lang/AssertionError; -Ljava/lang/Boolean; -Ljava/lang/Byte; -Ljava/lang/Character; -Ljava/lang/CharSequence; -Ljava/lang/Class; -Ljava/lang/IllegalAccessException; -Ljava/lang/IllegalStateException; -Ljava/lang/NoSuchMethodException; -Ljava/lang/NullPointerException; -Ljava/lang/Object; -[Ljava/lang/Object; -Ljava/lang/ref/FinalizerReference; -Ljava/lang/Runnable; -Ljava/lang/SecurityException; -Ljava/lang/Short; -[Ljava/lang/String; +Ldalvik/system/VMRuntime; +Ldalvik/system/ZipPathValidator; +Ldalvik/system/ZygoteHooks; Ljava/lang/System; Ljava/lang/Thread; Ljava/lang/Throwable; -Ljava/lang/UnsatisfiedLinkError; -Ljava/net/Inet6Address; -Ljava/net/Socket; -Ljava/net/SocketException; +Ljava/lang/ref/FinalizerReference; +Ljava/lang/ref/ReferenceQueue; +Ljava/net/ResponseCache; Ljava/nio/Bits; Ljava/nio/charset/Charset; -Ljava/security/interfaces/RSAPrivateKey; Ljava/security/Provider; Ljava/util/Collections; -Ljava/util/concurrent/Executor; Ljava/util/GregorianCalendar; -Ljava/util/Locale; Ljava/util/Locale$NoImagePreloadHolder; +Ljava/util/Locale; Ljava/util/Scanner; -Ljava/util/Set; Ljava/util/TimeZone; +Ljava/util/concurrent/ForkJoinPool; +Ljava/util/concurrent/ThreadLocalRandom; +Ljavax/net/ServerSocketFactory; Ljavax/net/SocketFactory; -Ljavax/net/ssl/HttpsURLConnection; Ljavax/net/ssl/HttpsURLConnection$NoPreloadHolder; +Ljavax/net/ssl/HttpsURLConnection; Ljavax/net/ssl/SSLContext; -Ljavax/net/ssl/SSLSessionContext; +Ljavax/net/ssl/SSLServerSocketFactory; Ljavax/net/ssl/SSLSocketFactory; Llibcore/io/Libcore; -Llibcore/io/Memory; Llibcore/net/NetworkSecurityPolicy; -Llibcore/timezone/TimeZoneFinder; -Lorg/apache/http/params/HttpParams; Lsun/misc/Cleaner; -Lsun/nio/ch/FileChannelImpl; Lsun/nio/ch/FileChannelImpl$Unmapper; -Lsun/nio/fs/UnixChannelFactory; +Lsun/nio/ch/FileChannelImpl; Lsun/security/jca/Providers; diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 499d38c31b59..50f393b53277 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -1725,16 +1725,17 @@ public class ResolverActivity extends Activity implements if (inWorkProfile) { ((TextView) findViewById(R.id.open_cross_profile)).setText( - devicePolicyResourcesManager.getString(MINIRESOLVER_OPEN_IN_WORK, - () -> getString(R.string.miniresolver_open_in_work, targetDisplayLabel), + devicePolicyResourcesManager.getString(MINIRESOLVER_OPEN_IN_PERSONAL, + () -> getString(R.string.miniresolver_open_in_personal, + targetDisplayLabel), targetDisplayLabel)); ((Button) findViewById(R.id.use_same_profile_browser)).setText( devicePolicyResourcesManager.getString(MINIRESOLVER_USE_WORK_BROWSER, () -> getString(R.string.miniresolver_use_work_browser))); } else { ((TextView) findViewById(R.id.open_cross_profile)).setText( - devicePolicyResourcesManager.getString(MINIRESOLVER_OPEN_IN_PERSONAL, - () -> getString(R.string.miniresolver_open_in_personal, + devicePolicyResourcesManager.getString(MINIRESOLVER_OPEN_IN_WORK, + () -> getString(R.string.miniresolver_open_in_work, targetDisplayLabel), targetDisplayLabel)); ((Button) findViewById(R.id.use_same_profile_browser)).setText( diff --git a/core/res/res/values-mcc310/config.xml b/core/res/res/values-mcc310/config.xml index df398f9aab32..76abceeb74b1 100644 --- a/core/res/res/values-mcc310/config.xml +++ b/core/res/res/values-mcc310/config.xml @@ -22,4 +22,7 @@ <!-- Whether safe headphone volume is enabled or not (country specific). --> <bool name="config_safe_media_volume_enabled">false</bool> + <!-- Whether safe headphone sound dosage warning is enabled or not (country specific). --> + <bool name="config_safe_sound_dosage_mcc_enabled">false</bool> + </resources> diff --git a/core/res/res/values-mcc311/config.xml b/core/res/res/values-mcc311/config.xml index df398f9aab32..6e0b678f94d9 100644 --- a/core/res/res/values-mcc311/config.xml +++ b/core/res/res/values-mcc311/config.xml @@ -22,4 +22,7 @@ <!-- Whether safe headphone volume is enabled or not (country specific). --> <bool name="config_safe_media_volume_enabled">false</bool> + <!-- Whether safe headphone sound dosage warning is enabled or not (country specific). --> + <bool name="config_safe_sound_dosage_enabled">false</bool> + </resources> diff --git a/core/res/res/values-mcc312/config.xml b/core/res/res/values-mcc312/config.xml index df398f9aab32..6e0b678f94d9 100644 --- a/core/res/res/values-mcc312/config.xml +++ b/core/res/res/values-mcc312/config.xml @@ -22,4 +22,7 @@ <!-- Whether safe headphone volume is enabled or not (country specific). --> <bool name="config_safe_media_volume_enabled">false</bool> + <!-- Whether safe headphone sound dosage warning is enabled or not (country specific). --> + <bool name="config_safe_sound_dosage_enabled">false</bool> + </resources> diff --git a/core/res/res/values-mcc313/config.xml b/core/res/res/values-mcc313/config.xml index df398f9aab32..6e0b678f94d9 100644 --- a/core/res/res/values-mcc313/config.xml +++ b/core/res/res/values-mcc313/config.xml @@ -22,4 +22,7 @@ <!-- Whether safe headphone volume is enabled or not (country specific). --> <bool name="config_safe_media_volume_enabled">false</bool> + <!-- Whether safe headphone sound dosage warning is enabled or not (country specific). --> + <bool name="config_safe_sound_dosage_enabled">false</bool> + </resources> diff --git a/core/res/res/values-mcc314/config.xml b/core/res/res/values-mcc314/config.xml index df398f9aab32..6e0b678f94d9 100644 --- a/core/res/res/values-mcc314/config.xml +++ b/core/res/res/values-mcc314/config.xml @@ -22,4 +22,7 @@ <!-- Whether safe headphone volume is enabled or not (country specific). --> <bool name="config_safe_media_volume_enabled">false</bool> + <!-- Whether safe headphone sound dosage warning is enabled or not (country specific). --> + <bool name="config_safe_sound_dosage_enabled">false</bool> + </resources> diff --git a/core/res/res/values-mcc315/config.xml b/core/res/res/values-mcc315/config.xml index df398f9aab32..6e0b678f94d9 100644 --- a/core/res/res/values-mcc315/config.xml +++ b/core/res/res/values-mcc315/config.xml @@ -22,4 +22,7 @@ <!-- Whether safe headphone volume is enabled or not (country specific). --> <bool name="config_safe_media_volume_enabled">false</bool> + <!-- Whether safe headphone sound dosage warning is enabled or not (country specific). --> + <bool name="config_safe_sound_dosage_enabled">false</bool> + </resources> diff --git a/core/res/res/values-mcc316/config.xml b/core/res/res/values-mcc316/config.xml index df398f9aab32..6e0b678f94d9 100644 --- a/core/res/res/values-mcc316/config.xml +++ b/core/res/res/values-mcc316/config.xml @@ -22,4 +22,7 @@ <!-- Whether safe headphone volume is enabled or not (country specific). --> <bool name="config_safe_media_volume_enabled">false</bool> + <!-- Whether safe headphone sound dosage warning is enabled or not (country specific). --> + <bool name="config_safe_sound_dosage_enabled">false</bool> + </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 12dad7eb1faa..7bc3ab80da99 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2105,9 +2105,6 @@ <!-- The default volume for the ring stream --> <integer name="config_audio_ring_vol_default">5</integer> - <!-- Enable sound dose computation and warnings --> - <bool name="config_audio_csd_enabled_default">true</bool> - <!-- The default value for whether head tracking for spatial audio is enabled for a newly connected audio device --> <bool name="config_spatial_audio_head_tracking_enabled_default">false</bool> @@ -2939,6 +2936,9 @@ <!-- Whether safe headphone volume is enabled or not (country specific). --> <bool name="config_safe_media_volume_enabled">true</bool> + <!-- Whether safe headphone sound dosage warning is enabled or not (country specific). --> + <bool name="config_safe_sound_dosage_enabled">true</bool> + <!-- Whether safe headphone volume warning dialog is disabled on Vol+ (operator specific). --> <bool name="config_safe_media_disable_on_volume_up">true</bool> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index bb10f7ae7c93..e25425d6cb18 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -283,7 +283,6 @@ <java-symbol type="attr" name="autofillSaveCustomSubtitleMaxHeight"/> <java-symbol type="bool" name="action_bar_embed_tabs" /> <java-symbol type="bool" name="action_bar_expanded_action_views_exclusive" /> - <java-symbol type="bool" name="config_audio_csd_enabled_default" /> <java-symbol type="integer" name="config_audio_notif_vol_default" /> <java-symbol type="integer" name="config_audio_notif_vol_steps" /> <java-symbol type="integer" name="config_audio_ring_vol_default" /> @@ -349,6 +348,7 @@ <java-symbol type="bool" name="config_useDevInputEventForAudioJack" /> <java-symbol type="bool" name="config_safe_media_volume_enabled" /> <java-symbol type="bool" name="config_safe_media_disable_on_volume_up" /> + <java-symbol type="bool" name="config_safe_sound_dosage_enabled" /> <java-symbol type="bool" name="config_camera_sound_forced" /> <java-symbol type="bool" name="config_dontPreferApn" /> <java-symbol type="bool" name="config_restartRadioAfterProvisioning" /> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java index d3f395846894..24fd86b45df4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java @@ -297,7 +297,7 @@ public class Bubble implements BubbleViewProvider { public BubbleInfo asBubbleBarBubble() { return new BubbleInfo(getKey(), getFlags(), - getShortcutInfo().getId(), + getShortcutId(), getIcon(), getUser().getIdentifier(), getPackageName()); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BubbleInfo.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BubbleInfo.java index b0dea7231a1e..d27d05b207a6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BubbleInfo.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BubbleInfo.java @@ -35,6 +35,7 @@ public class BubbleInfo implements Parcelable { private String mKey; // Same key as the Notification private int mFlags; // Flags from BubbleMetadata + @Nullable private String mShortcutId; private int mUserId; private String mPackageName; @@ -46,7 +47,7 @@ public class BubbleInfo implements Parcelable { @Nullable private Icon mIcon; - public BubbleInfo(String key, int flags, String shortcutId, @Nullable Icon icon, + public BubbleInfo(String key, int flags, @Nullable String shortcutId, @Nullable Icon icon, int userId, String packageName) { mKey = key; mFlags = flags; @@ -69,10 +70,12 @@ public class BubbleInfo implements Parcelable { return mKey; } + @Nullable public String getShortcutId() { return mShortcutId; } + @Nullable public Icon getIcon() { return mIcon; } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTest.java index de967bfa288b..afec1ee12341 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTest.java @@ -33,6 +33,7 @@ import android.content.pm.ShortcutInfo; import android.content.res.Resources; import android.graphics.drawable.Icon; import android.os.Bundle; +import android.os.UserHandle; import android.service.notification.StatusBarNotification; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -42,6 +43,7 @@ import androidx.test.filters.SmallTest; import com.android.wm.shell.R; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.common.ShellExecutor; +import com.android.wm.shell.common.bubbles.BubbleInfo; import org.junit.Before; import org.junit.Test; @@ -77,7 +79,7 @@ public class BubbleTest extends ShellTestCase { Intent target = new Intent(mContext, BubblesTestActivity.class); Notification.BubbleMetadata metadata = new Notification.BubbleMetadata.Builder( PendingIntent.getActivity(mContext, 0, target, PendingIntent.FLAG_MUTABLE), - Icon.createWithResource(mContext, R.drawable.bubble_ic_create_bubble)) + Icon.createWithResource(mContext, R.drawable.bubble_ic_create_bubble)) .build(); when(mSbn.getNotification()).thenReturn(mNotif); when(mNotif.getBubbleMetadata()).thenReturn(metadata); @@ -179,6 +181,34 @@ public class BubbleTest extends ShellTestCase { assertThat(bubble.isConversation()).isFalse(); } + @Test + public void testBubbleAsBubbleBarBubble_withShortcut() { + Bubble bubble = createBubbleWithShortcut(); + BubbleInfo bubbleInfo = bubble.asBubbleBarBubble(); + + assertThat(bubble.getShortcutInfo()).isNotNull(); + assertThat(bubbleInfo.getShortcutId()).isNotNull(); + assertThat(bubbleInfo.getShortcutId()).isEqualTo(bubble.getShortcutId()); + assertThat(bubbleInfo.getKey()).isEqualTo(bubble.getKey()); + assertThat(bubbleInfo.getUserId()).isEqualTo(bubble.getUser().getIdentifier()); + assertThat(bubbleInfo.getPackageName()).isEqualTo(bubble.getPackageName()); + } + + @Test + public void testBubbleAsBubbleBarBubble_withoutShortcut() { + Intent intent = new Intent(mContext, BubblesTestActivity.class); + intent.setPackage(mContext.getPackageName()); + Bubble bubble = Bubble.createAppBubble(intent, new UserHandle(1 /* userId */), + null /* icon */, mMainExecutor); + BubbleInfo bubbleInfo = bubble.asBubbleBarBubble(); + + assertThat(bubble.getShortcutInfo()).isNull(); + assertThat(bubbleInfo.getShortcutId()).isNull(); + assertThat(bubbleInfo.getKey()).isEqualTo(bubble.getKey()); + assertThat(bubbleInfo.getUserId()).isEqualTo(bubble.getUser().getIdentifier()); + assertThat(bubbleInfo.getPackageName()).isEqualTo(bubble.getPackageName()); + } + private Bubble createBubbleWithShortcut() { ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mContext) .setId("mockShortcutId") diff --git a/packages/SystemUI/res-keyguard/values/styles.xml b/packages/SystemUI/res-keyguard/values/styles.xml index 4fc411eaea9d..4d289ebeb30b 100644 --- a/packages/SystemUI/res-keyguard/values/styles.xml +++ b/packages/SystemUI/res-keyguard/values/styles.xml @@ -22,6 +22,7 @@ <!-- Keyguard PIN pad styles --> <style name="Keyguard.TextView" parent="@android:style/Widget.DeviceDefault.TextView"> <item name="android:textSize">@dimen/kg_status_line_font_size</item> + <item name="android:fontFamily">@*android:string/config_bodyFontFamily</item> </style> <style name="Keyguard.TextView.EmergencyButton" parent="Theme.SystemUI"> <item name="android:textColor">?androidprv:attr/materialColorOnTertiaryFixed</item> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 853930e174a7..6b461eebe2e0 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1257,7 +1257,10 @@ <string name="monitoring_description_managed_profile_network_logging">Your admin has turned on network logging, which monitors traffic in your work profile but not in your personal profile.</string> <!-- Monitoring dialog: Description of an active VPN. [CHAR LIMIT=NONE]--> - <string name="monitoring_description_named_vpn">This device is connected to the internet through <xliff:g id="vpn_app" example="Foo VPN App">%1$s</xliff:g>. Your network activity, including emails and browsing data, is visible to your IT admin.</string> + <string name="monitoring_description_named_vpn">This device is connected to the internet through <xliff:g id="vpn_app" example="Foo VPN App">%1$s</xliff:g>. Your network activity, including emails and browsing data, is visible to the VPN provider.</string> + + <!-- Monitoring dialog: Description of an active VPN on a managed device. [CHAR LIMIT=NONE]--> + <string name="monitoring_description_managed_device_named_vpn">This device is connected to the internet through <xliff:g id="vpn_app" example="Foo VPN App">%1$s</xliff:g>. Your network activity, including emails and browsing data, is visible to your IT admin.</string> <!-- Monitoring dialog: Description of two active VPNs. [CHAR LIMIT=NONE]--> <string name="monitoring_description_two_named_vpns">This device is connected to the internet through <xliff:g id="vpn_app" example="Foo VPN App">%1$s</xliff:g> and <xliff:g id="vpn_app" example="Bar VPN App">%2$s</xliff:g>. Your network activity, including emails and browsing data, is visible to your IT admin.</string> diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt index 5d608c3e3f9e..7cbd1f53612b 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt @@ -16,9 +16,11 @@ package com.android.systemui.controls.ui +import android.app.Activity import android.app.ActivityOptions import android.app.ActivityTaskManager import android.app.ActivityTaskManager.INVALID_TASK_ID +import android.app.ComponentOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED import android.app.Dialog import android.app.PendingIntent import android.content.ComponentName @@ -96,7 +98,9 @@ class DetailDialog( activityContext, 0 /* enterResId */, 0 /* exitResId */ - ) + ).setPendingIntentBackgroundActivityStartMode(MODE_BACKGROUND_ACTIVITY_START_ALLOWED) + options.isPendingIntentBackgroundActivityLaunchAllowedByPermission = true + taskView.startActivity( pendingIntent, fillInIntent, @@ -214,6 +218,12 @@ class DetailDialog( if (!isShowing()) return taskView.release() + val isActivityFinishing = + (activityContext as? Activity)?.let { it.isFinishing || it.isDestroyed } + if (isActivityFinishing == true) { + // Don't dismiss the dialog if the activity is finishing, it will get removed + return + } super.dismiss() } } diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index 75eab8274814..af7387b9236a 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -61,6 +61,9 @@ object Flags { // TODO(b/254512538): Tracking Bug val INSTANT_VOICE_REPLY = unreleasedFlag(111, "instant_voice_reply") + // TODO(b/279735475): Tracking Bug + @JvmField val NEW_LIGHT_BAR_LOGIC = unreleasedFlag(279735475, "new_light_bar_logic") + /** * This flag is server-controlled and should stay as [unreleasedFlag] since we never want to * enable it on release builds. diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java index d3b6fc237084..f64ed6078ddb 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java @@ -128,6 +128,7 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.CentralSurfaces; +import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -240,6 +241,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene private final ScreenshotHelper mScreenshotHelper; private final SysuiColorExtractor mSysuiColorExtractor; private final IStatusBarService mStatusBarService; + protected final LightBarController mLightBarController; protected final NotificationShadeWindowController mNotificationShadeWindowController; private final IWindowManager mIWindowManager; private final Executor mBackgroundExecutor; @@ -349,6 +351,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene MetricsLogger metricsLogger, SysuiColorExtractor colorExtractor, IStatusBarService statusBarService, + LightBarController lightBarController, NotificationShadeWindowController notificationShadeWindowController, IWindowManager iWindowManager, @Background Executor backgroundExecutor, @@ -381,6 +384,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mUiEventLogger = uiEventLogger; mSysuiColorExtractor = colorExtractor; mStatusBarService = statusBarService; + mLightBarController = lightBarController; mNotificationShadeWindowController = notificationShadeWindowController; mIWindowManager = iWindowManager; mBackgroundExecutor = backgroundExecutor; @@ -694,6 +698,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene ActionsDialogLite dialog = new ActionsDialogLite(mContext, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActionsLite, mAdapter, mOverflowAdapter, mSysuiColorExtractor, mStatusBarService, + mLightBarController, mNotificationShadeWindowController, this::onRefresh, mKeyguardShowing, mPowerAdapter, mUiEventLogger, mCentralSurfacesOptional, mKeyguardUpdateMonitor, mLockPatternUtils); @@ -2192,6 +2197,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene protected final SysuiColorExtractor mColorExtractor; private boolean mKeyguardShowing; protected float mScrimAlpha; + protected final LightBarController mLightBarController; protected final NotificationShadeWindowController mNotificationShadeWindowController; private ListPopupWindow mOverflowPopup; private Dialog mPowerOptionsDialog; @@ -2267,6 +2273,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene ActionsDialogLite(Context context, int themeRes, MyAdapter adapter, MyOverflowAdapter overflowAdapter, SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService, + LightBarController lightBarController, NotificationShadeWindowController notificationShadeWindowController, Runnable onRefreshCallback, boolean keyguardShowing, MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger, @@ -2282,6 +2289,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mPowerOptionsAdapter = powerAdapter; mColorExtractor = sysuiColorExtractor; mStatusBarService = statusBarService; + mLightBarController = lightBarController; mNotificationShadeWindowController = notificationShadeWindowController; mOnRefreshCallback = onRefreshCallback; mKeyguardShowing = keyguardShowing; @@ -2474,6 +2482,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene @Override protected void start() { mGlobalActionsLayout.updateList(); + mLightBarController.setGlobalActionsVisible(true); if (mBackgroundDrawable instanceof ScrimDrawable) { mColorExtractor.addOnColorsChangedListener(this); @@ -2504,6 +2513,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene @Override protected void stop() { + mLightBarController.setGlobalActionsVisible(false); mColorExtractor.removeOnColorsChangedListener(this); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooterUtils.java b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooterUtils.java index 0bce1f728e18..b70b94b00923 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooterUtils.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooterUtils.java @@ -719,7 +719,8 @@ public class QSSecurityFooterUtils implements DialogInterface.OnClickListener { String name = vpnName != null ? vpnName : vpnNameWorkProfile; String namedVp = mDpm.getResources().getString( QS_DIALOG_MANAGEMENT_NAMED_VPN, - () -> mContext.getString(R.string.monitoring_description_named_vpn, name), + () -> mContext.getString( + R.string.monitoring_description_managed_device_named_vpn, name), name); message.append(namedVp); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt index 4a3199850e0f..b80668379e49 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt @@ -385,6 +385,11 @@ open class QSTileViewImpl @JvmOverloads constructor( super.onInitializeAccessibilityNodeInfo(info) // Clear selected state so it is not announce by talkback. info.isSelected = false + info.text = if (TextUtils.isEmpty(secondaryLabel.text)) { + "${label.text}" + } else { + "${label.text}, ${secondaryLabel.text}" + } if (lastDisabledByPolicy) { info.addAction( AccessibilityNodeInfo.AccessibilityAction( @@ -402,12 +407,6 @@ open class QSTileViewImpl @JvmOverloads constructor( accessibilityClass } if (Switch::class.java.name == accessibilityClass) { - val label = resources.getString( - if (tileState) R.string.switch_bar_on else R.string.switch_bar_off) - // Set the text here for tests in - // android.platform.test.scenario.sysui.quicksettings. Can be removed when - // UiObject2 has a new getStateDescription() API and tests are updated. - info.text = label info.isChecked = tileState info.isCheckable = true if (isLongClickable) { diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java index 4012736b8beb..92c9a80e0c8c 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java @@ -85,11 +85,13 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardStatusBarView; +import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent; +import com.android.systemui.statusbar.policy.CastController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.LargeScreenUtils; @@ -116,6 +118,7 @@ public class QuickSettingsController { private final PulseExpansionHandler mPulseExpansionHandler; private final ShadeExpansionStateManager mShadeExpansionStateManager; private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; + private final LightBarController mLightBarController; private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController; private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; private final NotificationShadeDepthController mDepthController; @@ -135,6 +138,7 @@ public class QuickSettingsController { private final LockscreenGestureLogger mLockscreenGestureLogger; private final ShadeLogger mShadeLog; private final KeyguardFaceAuthInteractor mKeyguardFaceAuthInteractor; + private final CastController mCastController; private final FeatureFlags mFeatureFlags; private final InteractionJankMonitor mInteractionJankMonitor; private final ShadeRepository mShadeRepository; @@ -302,6 +306,7 @@ public class QuickSettingsController { NotificationRemoteInputManager remoteInputManager, ShadeExpansionStateManager shadeExpansionStateManager, StatusBarKeyguardViewManager statusBarKeyguardViewManager, + LightBarController lightBarController, NotificationStackScrollLayoutController notificationStackScrollLayoutController, LockscreenShadeTransitionController lockscreenShadeTransitionController, NotificationShadeDepthController notificationShadeDepthController, @@ -324,7 +329,8 @@ public class QuickSettingsController { InteractionJankMonitor interactionJankMonitor, ShadeLogger shadeLog, KeyguardFaceAuthInteractor keyguardFaceAuthInteractor, - ShadeRepository shadeRepository + ShadeRepository shadeRepository, + CastController castController ) { mPanelViewControllerLazy = panelViewControllerLazy; mPanelView = panelView; @@ -343,6 +349,7 @@ public class QuickSettingsController { mRemoteInputManager = remoteInputManager; mShadeExpansionStateManager = shadeExpansionStateManager; mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; + mLightBarController = lightBarController; mNotificationStackScrollLayoutController = notificationStackScrollLayoutController; mLockscreenShadeTransitionController = lockscreenShadeTransitionController; mDepthController = notificationShadeDepthController; @@ -364,6 +371,7 @@ public class QuickSettingsController { mMetricsLogger = metricsLogger; mShadeLog = shadeLog; mKeyguardFaceAuthInteractor = keyguardFaceAuthInteractor; + mCastController = castController; mFeatureFlags = featureFlags; mInteractionJankMonitor = interactionJankMonitor; mShadeRepository = shadeRepository; @@ -1014,6 +1022,9 @@ public class QuickSettingsController { mShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction); mShadeHeaderController.setQsExpandedFraction(qsExpansionFraction); mShadeHeaderController.setQsVisible(mVisible); + + // Update the light bar + mLightBarController.setQsExpanded(mFullyExpanded); } float getLockscreenShadeDragProgress() { @@ -1188,7 +1199,9 @@ public class QuickSettingsController { mLastClipBounds.set(left, top, right, bottom); if (mIsFullWidth) { clipStatusView = qsVisible; - float screenCornerRadius = mRecordingController.isRecording() ? 0 : mScreenCornerRadius; + float screenCornerRadius = + mRecordingController.isRecording() || mCastController.hasConnectedCastDevice() + ? 0 : mScreenCornerRadius; radius = (int) MathUtils.lerp(screenCornerRadius, mScrimCornerRadius, Math.min(top / (float) mScrimCornerRadius, 1f)); mScrimController.setNotificationBottomRadius(radius); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java index 534edb97bc5d..a058bf88e2e4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java @@ -25,6 +25,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARE import android.annotation.ColorInt; import android.content.Context; import android.graphics.Rect; +import android.util.Log; import android.view.InsetsFlags; import android.view.ViewDebug; import android.view.WindowInsetsController.Appearance; @@ -35,13 +36,17 @@ import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; +import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.flags.Flags; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.settings.DisplayTracker; import com.android.systemui.statusbar.policy.BatteryController; +import com.android.systemui.util.Compile; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Date; import javax.inject.Inject; @@ -51,10 +56,14 @@ import javax.inject.Inject; @SysUISingleton public class LightBarController implements BatteryController.BatteryStateChangeCallback, Dumpable { + private static final String TAG = "LightBarController"; + private static final boolean DEBUG = Compile.IS_DEBUG && Log.isLoggable(TAG, Log.DEBUG); + private static final float NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD = 0.1f; private final SysuiDarkIconDispatcher mStatusBarIconController; private final BatteryController mBatteryController; + private final boolean mUseNewLightBarLogic; private BiometricUnlockController mBiometricUnlockController; private LightBarTransitionsController mNavigationBarController; @@ -67,13 +76,17 @@ public class LightBarController implements BatteryController.BatteryStateChangeC private final int mLightIconColor; /** - * Whether the navigation bar should be light factoring in already how much alpha the scrim has + * Whether the navigation bar should be light factoring in already how much alpha the scrim has. + * "Light" refers to the background color of the navigation bar, so when this is true, + * it's referring to a state where the navigation bar icons are tinted dark. */ private boolean mNavigationLight; /** - * Whether the flags indicate that a light status bar is requested. This doesn't factor in the - * scrim alpha yet. + * Whether the flags indicate that a light navigation bar is requested. + * "Light" refers to the background color of the navigation bar, so when this is true, + * it's referring to a state where the navigation bar icons would be tinted dark. + * This doesn't factor in the scrim alpha yet. */ private boolean mHasLightNavigationBar; @@ -82,22 +95,34 @@ public class LightBarController implements BatteryController.BatteryStateChangeC * {@link #mNavigationLight} {@code false}. */ private boolean mForceDarkForScrim; + /** + * {@code true} if {@link #mHasLightNavigationBar} should be ignored and forcefully make + * {@link #mNavigationLight} {@code true}. + */ + private boolean mForceLightForScrim; private boolean mQsCustomizing; + private boolean mQsExpanded; + private boolean mGlobalActionsVisible; private boolean mDirectReplying; private boolean mNavbarColorManagedByIme; private boolean mIsCustomizingForBackNav; + private String mLastSetScrimStateLog; + private String mLastNavigationBarAppearanceChangedLog; + @Inject public LightBarController( Context ctx, DarkIconDispatcher darkIconDispatcher, BatteryController batteryController, NavigationModeController navModeController, + FeatureFlags featureFlags, DumpManager dumpManager, DisplayTracker displayTracker) { + mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC); mDarkIconColor = ctx.getColor(R.color.dark_mode_icon_color_single_tone); mLightIconColor = ctx.getColor(R.color.light_mode_icon_color_single_tone); mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher; @@ -159,9 +184,42 @@ public class LightBarController implements BatteryController.BatteryStateChangeC final boolean last = mNavigationLight; mHasLightNavigationBar = isLight(appearance, navigationBarMode, APPEARANCE_LIGHT_NAVIGATION_BARS); - mNavigationLight = mHasLightNavigationBar - && (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim) - && !mQsCustomizing; + if (mUseNewLightBarLogic) { + final boolean ignoreScrimForce = mDirectReplying && mNavbarColorManagedByIme; + final boolean darkForScrim = mForceDarkForScrim && !ignoreScrimForce; + final boolean lightForScrim = mForceLightForScrim && !ignoreScrimForce; + final boolean darkForQs = mQsCustomizing || mQsExpanded || mGlobalActionsVisible; + mNavigationLight = + ((mHasLightNavigationBar && !darkForScrim) || lightForScrim) && !darkForQs; + mLastNavigationBarAppearanceChangedLog = "onNavigationBarAppearanceChanged()" + + " appearance=" + appearance + + " nbModeChanged=" + nbModeChanged + + " navigationBarMode=" + navigationBarMode + + " navbarColorManagedByIme=" + navbarColorManagedByIme + + " mHasLightNavigationBar=" + mHasLightNavigationBar + + " ignoreScrimForce=" + ignoreScrimForce + + " darkForScrim=" + darkForScrim + + " lightForScrim=" + lightForScrim + + " darkForQs=" + darkForQs + + " mNavigationLight=" + mNavigationLight + + " last=" + last + + " timestamp=" + new Date(); + if (DEBUG) Log.d(TAG, mLastNavigationBarAppearanceChangedLog); + } else { + mNavigationLight = mHasLightNavigationBar + && (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim) + && !mQsCustomizing; + mLastNavigationBarAppearanceChangedLog = "onNavigationBarAppearanceChanged()" + + " appearance=" + appearance + + " nbModeChanged=" + nbModeChanged + + " navigationBarMode=" + navigationBarMode + + " navbarColorManagedByIme=" + navbarColorManagedByIme + + " mHasLightNavigationBar=" + mHasLightNavigationBar + + " mNavigationLight=" + mNavigationLight + + " last=" + last + + " timestamp=" + new Date(); + if (DEBUG) Log.d(TAG, mLastNavigationBarAppearanceChangedLog); + } if (mNavigationLight != last) { updateNavigation(); } @@ -188,6 +246,20 @@ public class LightBarController implements BatteryController.BatteryStateChangeC reevaluate(); } + /** Set if Quick Settings is fully expanded, which affects notification scrim visibility */ + public void setQsExpanded(boolean expanded) { + if (mQsExpanded == expanded) return; + mQsExpanded = expanded; + reevaluate(); + } + + /** Set if Global Actions dialog is visible, which requires dark mode (light buttons) */ + public void setGlobalActionsVisible(boolean visible) { + if (mGlobalActionsVisible == visible) return; + mGlobalActionsVisible = visible; + reevaluate(); + } + /** * Controls the light status bar temporarily for back navigation. * @param appearance the custmoized appearance. @@ -225,16 +297,52 @@ public class LightBarController implements BatteryController.BatteryStateChangeC public void setScrimState(ScrimState scrimState, float scrimBehindAlpha, GradientColors scrimInFrontColor) { - boolean forceDarkForScrimLast = mForceDarkForScrim; - // For BOUNCER/BOUNCER_SCRIMMED cases, we assume that alpha is always below threshold. - // This enables IMEs to control the navigation bar color. - // For other cases, scrim should be able to veto the light navigation bar. - mForceDarkForScrim = scrimState != ScrimState.BOUNCER - && scrimState != ScrimState.BOUNCER_SCRIMMED - && scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD - && !scrimInFrontColor.supportsDarkText(); - if (mHasLightNavigationBar && (mForceDarkForScrim != forceDarkForScrimLast)) { - reevaluate(); + if (mUseNewLightBarLogic) { + boolean forceDarkForScrimLast = mForceDarkForScrim; + boolean forceLightForScrimLast = mForceLightForScrim; + final boolean forceForScrim = + scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD; + final boolean scrimColorIsLight = scrimInFrontColor.supportsDarkText(); + + mForceDarkForScrim = forceForScrim && !scrimColorIsLight; + mForceLightForScrim = forceForScrim && scrimColorIsLight; + if (mHasLightNavigationBar) { + if (mForceDarkForScrim != forceDarkForScrimLast) reevaluate(); + } else { + if (mForceLightForScrim != forceLightForScrimLast) reevaluate(); + } + mLastSetScrimStateLog = "setScrimState()" + + " scrimState=" + scrimState + + " scrimBehindAlpha=" + scrimBehindAlpha + + " scrimInFrontColor=" + scrimInFrontColor + + " forceForScrim=" + forceForScrim + + " scrimColorIsLight=" + scrimColorIsLight + + " mHasLightNavigationBar=" + mHasLightNavigationBar + + " mForceDarkForScrim=" + mForceDarkForScrim + + " mForceLightForScrim=" + mForceLightForScrim + + " timestamp=" + new Date(); + if (DEBUG) Log.d(TAG, mLastSetScrimStateLog); + } else { + boolean forceDarkForScrimLast = mForceDarkForScrim; + // For BOUNCER/BOUNCER_SCRIMMED cases, we assume that alpha is always below threshold. + // This enables IMEs to control the navigation bar color. + // For other cases, scrim should be able to veto the light navigation bar. + // NOTE: this was also wrong for S and has been removed in the new logic. + mForceDarkForScrim = scrimState != ScrimState.BOUNCER + && scrimState != ScrimState.BOUNCER_SCRIMMED + && scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD + && !scrimInFrontColor.supportsDarkText(); + if (mHasLightNavigationBar && (mForceDarkForScrim != forceDarkForScrimLast)) { + reevaluate(); + } + mLastSetScrimStateLog = "setScrimState()" + + " scrimState=" + scrimState + + " scrimBehindAlpha=" + scrimBehindAlpha + + " scrimInFrontColor=" + scrimInFrontColor + + " mHasLightNavigationBar=" + mHasLightNavigationBar + + " mForceDarkForScrim=" + mForceDarkForScrim + + " timestamp=" + new Date(); + if (DEBUG) Log.d(TAG, mLastSetScrimStateLog); } } @@ -309,16 +417,24 @@ public class LightBarController implements BatteryController.BatteryStateChangeC pw.print(mAppearanceRegions[i].toString()); pw.print(" isLight="); pw.println(isLight); } - pw.print(" mNavigationLight="); pw.print(mNavigationLight); + pw.print(" mNavigationLight="); pw.println(mNavigationLight); pw.print(" mHasLightNavigationBar="); pw.println(mHasLightNavigationBar); - + pw.println(); pw.print(" mStatusBarMode="); pw.print(mStatusBarMode); pw.print(" mNavigationBarMode="); pw.println(mNavigationBarMode); - - pw.print(" mForceDarkForScrim="); pw.print(mForceDarkForScrim); - pw.print(" mQsCustomizing="); pw.print(mQsCustomizing); + pw.println(); + pw.print(" mForceDarkForScrim="); pw.println(mForceDarkForScrim); + pw.print(" mForceLightForScrim="); pw.println(mForceLightForScrim); + pw.println(); + pw.print(" mQsCustomizing="); pw.println(mQsCustomizing); + pw.print(" mQsExpanded="); pw.println(mQsExpanded); + pw.print(" mGlobalActionsVisible="); pw.println(mGlobalActionsVisible); pw.print(" mDirectReplying="); pw.println(mDirectReplying); pw.print(" mNavbarColorManagedByIme="); pw.println(mNavbarColorManagedByIme); + pw.println(); + pw.println(" Recent Calculation Logs:"); + pw.print(" "); pw.println(mLastSetScrimStateLog); + pw.print(" "); pw.println(mLastNavigationBarAppearanceChangedLog); pw.println(); @@ -344,6 +460,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC private final DarkIconDispatcher mDarkIconDispatcher; private final BatteryController mBatteryController; private final NavigationModeController mNavModeController; + private final FeatureFlags mFeatureFlags; private final DumpManager mDumpManager; private final DisplayTracker mDisplayTracker; @@ -352,12 +469,14 @@ public class LightBarController implements BatteryController.BatteryStateChangeC DarkIconDispatcher darkIconDispatcher, BatteryController batteryController, NavigationModeController navModeController, + FeatureFlags featureFlags, DumpManager dumpManager, DisplayTracker displayTracker) { mDarkIconDispatcher = darkIconDispatcher; mBatteryController = batteryController; mNavModeController = navModeController; + mFeatureFlags = featureFlags; mDumpManager = dumpManager; mDisplayTracker = displayTracker; } @@ -365,7 +484,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC /** Create an {@link LightBarController} */ public LightBarController create(Context context) { return new LightBarController(context, mDarkIconDispatcher, mBatteryController, - mNavModeController, mDumpManager, mDisplayTracker); + mNavModeController, mFeatureFlags, mDumpManager, mDisplayTracker); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 51c56a021825..fdb772bc6c13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -42,6 +42,7 @@ import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor.GradientColors; import com.android.internal.graphics.ColorUtils; +import com.android.internal.util.ContrastColorUtil; import com.android.internal.util.function.TriConsumer; import com.android.keyguard.BouncerPanelExpansionCalculator; import com.android.keyguard.KeyguardUpdateMonitor; @@ -249,6 +250,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener; private final LargeScreenShadeInterpolator mLargeScreenShadeInterpolator; private final FeatureFlags mFeatureFlags; + private final boolean mUseNewLightBarLogic; private Consumer<Integer> mScrimVisibleListener; private boolean mBlankScreen; private boolean mScreenBlankingCallbackCalled; @@ -306,6 +308,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump mScrimStateListener = lightBarController::setScrimState; mLargeScreenShadeInterpolator = largeScreenShadeInterpolator; mFeatureFlags = featureFlags; + mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC); mDefaultScrimAlpha = BUSY_SCRIM_ALPHA; mKeyguardStateController = keyguardStateController; @@ -1159,7 +1162,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump if (mClipsQsScrim && mQsBottomVisible) { alpha = mNotificationsAlpha; } - mScrimStateListener.accept(mState, alpha, mScrimInFront.getColors()); + if (mUseNewLightBarLogic) { + mScrimStateListener.accept(mState, alpha, mColors); + } else { + // NOTE: This wasn't wrong, but it implied that each scrim might have different colors, + // when in fact they all share the same GradientColors instance, which we own. + mScrimStateListener.accept(mState, alpha, mScrimInFront.getColors()); + } } private void dispatchScrimsVisible() { @@ -1487,8 +1496,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump int accent = Utils.getColorAccent(mScrimBehind.getContext()).getDefaultColor(); mColors.setMainColor(background); mColors.setSecondaryColor(accent); - mColors.setSupportsDarkText( - ColorUtils.calculateContrast(mColors.getMainColor(), Color.WHITE) > 4.5); + if (mUseNewLightBarLogic) { + final boolean isBackgroundLight = !ContrastColorUtil.isColorDark(background); + mColors.setSupportsDarkText(isBackgroundLight); + } else { + // NOTE: This was totally backward, but LightBarController was flipping it back. + // There may be other consumers of this which would struggle though + mColors.setSupportsDarkText( + ColorUtils.calculateContrast(mColors.getMainColor(), Color.WHITE) > 4.5); + } mNeedsDrawableColorUpdate = true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastController.java index 98cde2a049da..abedd3220c93 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastController.java @@ -28,6 +28,11 @@ public interface CastController extends CallbackController<Callback>, Dumpable { void startCasting(CastDevice device); void stopCasting(CastDevice device); + /** + * @return whether we have a connected device. + */ + boolean hasConnectedCastDevice(); + public interface Callback { void onCastDevicesChanged(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java index 7290a1a82070..f7b601b9d284 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java @@ -217,6 +217,12 @@ public class CastControllerImpl implements CastController { } } + @Override + public boolean hasConnectedCastDevice() { + return getCastDevices().stream().anyMatch( + castDevice -> castDevice.state == CastDevice.STATE_CONNECTED); + } + private void setProjection(MediaProjectionInfo projection, boolean started) { boolean changed = false; final MediaProjectionInfo oldProjection = mProjection; diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt index c3506e80966b..54142590b453 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt @@ -16,6 +16,7 @@ package com.android.systemui.controls.ui +import android.app.ActivityOptions import android.app.PendingIntent import android.testing.AndroidTestingRunner import android.testing.TestableLooper @@ -24,7 +25,10 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.broadcast.BroadcastSender import com.android.systemui.plugins.ActivityStarter import com.android.systemui.statusbar.policy.KeyguardStateController +import com.android.systemui.util.mockito.argumentCaptor +import com.android.systemui.util.mockito.capture import com.android.wm.shell.taskview.TaskView +import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -69,6 +73,25 @@ class DetailDialogTest : SysuiTestCase() { verify(taskView).startActivity(eq(pendingIntent), any(), any(), any()) } + @Test + fun testActivityOptionsAllowBal() { + // GIVEN the dialog is created with a PendingIntent + val dialog = createDialog(pendingIntent) + + // WHEN the TaskView is initialized + dialog.stateCallback.onInitialized() + + val optionsCaptor = argumentCaptor<ActivityOptions>() + + // THEN the ActivityOptions have the correct flags + verify(taskView).startActivity(any(), any(), capture(optionsCaptor), any()) + + assertThat(optionsCaptor.value.pendingIntentBackgroundActivityStartMode) + .isEqualTo(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) + assertThat(optionsCaptor.value.isPendingIntentBackgroundActivityLaunchAllowedByPermission) + .isTrue() + } + private fun createDialog(pendingIntent: PendingIntent): DetailDialog { return DetailDialog( mContext, diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java index 8795ac013bd3..c9ee1e8ef5b9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java @@ -70,6 +70,7 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.CentralSurfaces; +import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.telephony.TelephonyListenerManager; @@ -115,6 +116,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { @Mock private MetricsLogger mMetricsLogger; @Mock private SysuiColorExtractor mColorExtractor; @Mock private IStatusBarService mStatusBarService; + @Mock private LightBarController mLightBarController; @Mock private NotificationShadeWindowController mNotificationShadeWindowController; @Mock private IWindowManager mWindowManager; @Mock private Executor mBackgroundExecutor; @@ -166,6 +168,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { mMetricsLogger, mColorExtractor, mStatusBarService, + mLightBarController, mNotificationShadeWindowController, mWindowManager, mBackgroundExecutor, diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java index 88d7e9cb4de4..2dc78a323f55 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java @@ -587,14 +587,14 @@ public class QSSecurityFooterTest extends SysuiTestCase { assertEquals(addLink(mContext.getString(R.string.monitoring_description_two_named_vpns, VPN_PACKAGE, VPN_PACKAGE_2)), mFooterUtils.getVpnMessage(false, true, VPN_PACKAGE, VPN_PACKAGE_2)); - assertEquals(addLink(mContext.getString(R.string.monitoring_description_named_vpn, - VPN_PACKAGE)), + assertEquals(addLink(mContext.getString( + R.string.monitoring_description_managed_device_named_vpn, VPN_PACKAGE)), mFooterUtils.getVpnMessage(true, false, VPN_PACKAGE, null)); assertEquals(addLink(mContext.getString(R.string.monitoring_description_named_vpn, VPN_PACKAGE)), mFooterUtils.getVpnMessage(false, false, VPN_PACKAGE, null)); - assertEquals(addLink(mContext.getString(R.string.monitoring_description_named_vpn, - VPN_PACKAGE_2)), + assertEquals(addLink(mContext.getString( + R.string.monitoring_description_managed_device_named_vpn, VPN_PACKAGE_2)), mFooterUtils.getVpnMessage(true, true, null, VPN_PACKAGE_2)); assertEquals(addLink(mContext.getString( R.string.monitoring_description_managed_profile_named_vpn, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java index 1edc63c4417e..9a8ec88e992a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -151,6 +151,7 @@ import com.android.systemui.statusbar.phone.KeyguardBottomAreaViewController; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardStatusBarView; import com.android.systemui.statusbar.phone.KeyguardStatusBarViewController; +import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.ScreenOffAnimationController; import com.android.systemui.statusbar.phone.ScrimController; @@ -158,6 +159,7 @@ import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; import com.android.systemui.statusbar.phone.TapAgainViewController; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; +import com.android.systemui.statusbar.policy.CastController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardQsUserSwitchController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -239,6 +241,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { @Mock protected KeyguardStatusBarViewComponent mKeyguardStatusBarViewComponent; @Mock protected KeyguardClockSwitchController mKeyguardClockSwitchController; @Mock protected KeyguardStatusBarViewController mKeyguardStatusBarViewController; + @Mock protected LightBarController mLightBarController; @Mock protected NotificationStackScrollLayoutController mNotificationStackScrollLayoutController; @Mock protected NotificationShadeDepthController mNotificationShadeDepthController; @@ -306,6 +309,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { @Mock protected ActivityStarter mActivityStarter; @Mock protected KeyguardFaceAuthInteractor mKeyguardFaceAuthInteractor; @Mock protected ShadeRepository mShadeRepository; + @Mock private CastController mCastController; protected final int mMaxUdfpsBurnInOffsetY = 5; protected KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor; @@ -653,6 +657,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mNotificationRemoteInputManager, mShadeExpansionStateManager, mStatusBarKeyguardViewManager, + mLightBarController, mNotificationStackScrollLayoutController, mLockscreenShadeTransitionController, mNotificationShadeDepthController, @@ -675,7 +680,8 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mInteractionJankMonitor, mShadeLog, mKeyguardFaceAuthInteractor, - mShadeRepository + mShadeRepository, + mCastController ); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerTest.java index 8a9161e6d46d..1cf38732fdb2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerTest.java @@ -83,10 +83,12 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.phone.KeyguardBottomAreaView; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardStatusBarView; +import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; +import com.android.systemui.statusbar.policy.CastController; import com.android.systemui.statusbar.policy.KeyguardStateController; import dagger.Lazy; @@ -132,6 +134,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase { @Mock private PulseExpansionHandler mPulseExpansionHandler; @Mock private NotificationRemoteInputManager mNotificationRemoteInputManager; @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; + @Mock private LightBarController mLightBarController; @Mock private NotificationStackScrollLayoutController mNotificationStackScrollLayoutController; @Mock private LockscreenShadeTransitionController mLockscreenShadeTransitionController; @Mock private NotificationShadeDepthController mNotificationShadeDepthController; @@ -155,6 +158,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase { @Mock private ShadeLogger mShadeLogger; @Mock private DumpManager mDumpManager; @Mock private UiEventLogger mUiEventLogger; + @Mock private CastController mCastController; private SysuiStatusBarStateController mStatusBarStateController; @@ -221,6 +225,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase { mNotificationRemoteInputManager, mShadeExpansionStateManager, mStatusBarKeyguardViewManager, + mLightBarController, mNotificationStackScrollLayoutController, mLockscreenShadeTransitionController, mNotificationShadeDepthController, @@ -243,7 +248,8 @@ public class QuickSettingsControllerTest extends SysuiTestCase { mInteractionJankMonitor, mShadeLogger, mock(KeyguardFaceAuthInteractor.class), - mock(ShadeRepository.class) + mock(ShadeRepository.class), + mCastController ); mFragmentListener = mQsController.getQsFragmentListener(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java index 529519a6246e..a50155628027 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java @@ -22,21 +22,31 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARE import static junit.framework.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.graphics.Color; import android.graphics.Rect; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import androidx.annotation.ColorInt; import androidx.test.filters.SmallTest; +import com.android.internal.colorextraction.ColorExtractor.GradientColors; +import com.android.internal.util.ContrastColorUtil; import com.android.internal.view.AppearanceRegion; import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; +import com.android.systemui.flags.FakeFeatureFlags; +import com.android.systemui.flags.Flags; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.statusbar.policy.BatteryController; @@ -53,13 +63,25 @@ import java.util.ArrayList; @TestableLooper.RunWithLooper public class LightBarControllerTest extends SysuiTestCase { + private static final GradientColors COLORS_LIGHT = makeColors(Color.WHITE); + private static final GradientColors COLORS_DARK = makeColors(Color.BLACK); + private final FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags(); private LightBarTransitionsController mLightBarTransitionsController; + private LightBarTransitionsController mNavBarController; private SysuiDarkIconDispatcher mStatusBarIconController; private LightBarController mLightBarController; + /** Allow testing with NEW_LIGHT_BAR_LOGIC flag in different states */ + protected boolean testNewLightBarLogic() { + return false; + } + @Before public void setup() { + mFeatureFlags.set(Flags.NEW_LIGHT_BAR_LOGIC, testNewLightBarLogic()); mStatusBarIconController = mock(SysuiDarkIconDispatcher.class); + mNavBarController = mock(LightBarTransitionsController.class); + when(mNavBarController.supportsIconTintForNavMode(anyInt())).thenReturn(true); mLightBarTransitionsController = mock(LightBarTransitionsController.class); when(mStatusBarIconController.getTransitionsController()).thenReturn( mLightBarTransitionsController); @@ -68,10 +90,19 @@ public class LightBarControllerTest extends SysuiTestCase { mStatusBarIconController, mock(BatteryController.class), mock(NavigationModeController.class), + mFeatureFlags, mock(DumpManager.class), new FakeDisplayTracker(mContext)); } + private static GradientColors makeColors(@ColorInt int bgColor) { + GradientColors colors = new GradientColors(); + colors.setMainColor(bgColor); + colors.setSecondaryColor(bgColor); + colors.setSupportsDarkText(!ContrastColorUtil.isColorDark(bgColor)); + return colors; + } + @Test public void testOnStatusBarAppearanceChanged_multipleStacks_allStacksLight() { final Rect firstBounds = new Rect(0, 0, 1, 1); @@ -177,4 +208,54 @@ public class LightBarControllerTest extends SysuiTestCase { false /* navbarColorManagedByIme */); verify(mLightBarTransitionsController).setIconsDark(eq(false), anyBoolean()); } + + @Test + public void validateNavBarChangesUpdateIcons() { + assumeTrue(testNewLightBarLogic()); // Only run in the new suite + + // On the launcher in dark mode buttons are light + mLightBarController.setScrimState(ScrimState.UNLOCKED, 0f, COLORS_DARK); + mLightBarController.onNavigationBarAppearanceChanged( + 0, /* nbModeChanged = */ true, + MODE_TRANSPARENT, /* navbarColorManagedByIme = */ false); + verifyNavBarIconsUnchanged(); // no changes yet; not attached + + // Initial state is set when controller is set + mLightBarController.setNavigationBar(mNavBarController); + verifyNavBarIconsDarkSetTo(false); + + // Changing the color of the transparent scrim has no effect + mLightBarController.setScrimState(ScrimState.UNLOCKED, 0f, COLORS_LIGHT); + verifyNavBarIconsUnchanged(); // still light + + // Showing the notification shade with white scrim requires dark icons + mLightBarController.setScrimState(ScrimState.UNLOCKED, 1f, COLORS_LIGHT); + verifyNavBarIconsDarkSetTo(true); + + // Expanded QS always provides a black background, so icons become light again + mLightBarController.setQsExpanded(true); + verifyNavBarIconsDarkSetTo(false); + + // Tapping the QS tile to change to dark theme has no effect in this state + mLightBarController.setScrimState(ScrimState.UNLOCKED, 1f, COLORS_DARK); + verifyNavBarIconsUnchanged(); // still light + + // collapsing QS in dark mode doesn't affect button color + mLightBarController.setQsExpanded(false); + verifyNavBarIconsUnchanged(); // still light + + // Closing the shade has no affect + mLightBarController.setScrimState(ScrimState.UNLOCKED, 0f, COLORS_DARK); + verifyNavBarIconsUnchanged(); // still light + } + + private void verifyNavBarIconsUnchanged() { + verify(mNavBarController, never()).setIconsDark(anyBoolean(), anyBoolean()); + } + + private void verifyNavBarIconsDarkSetTo(boolean iconsDark) { + verify(mNavBarController).setIconsDark(eq(iconsDark), anyBoolean()); + verify(mNavBarController, never()).setIconsDark(eq(!iconsDark), anyBoolean()); + clearInvocations(mNavBarController); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerWithNewLogicTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerWithNewLogicTest.kt new file mode 100644 index 000000000000..d9c2cfa5ea7f --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerWithNewLogicTest.kt @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.statusbar.phone + +import androidx.test.filters.SmallTest +import com.android.systemui.flags.Flags.NEW_LIGHT_BAR_LOGIC + +/** + * This file only needs to live as long as [NEW_LIGHT_BAR_LOGIC] does. When we delete that flag, we + * can roll this back into the old test. + */ +@SmallTest +class LightBarControllerWithNewLogicTest : LightBarControllerTest() { + override fun testNewLightBarLogic(): Boolean = true +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CastControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CastControllerImplTest.java index db50163ce6a7..b8e4306a319d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CastControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CastControllerImplTest.java @@ -1,6 +1,7 @@ package com.android.systemui.statusbar.policy; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -125,4 +126,20 @@ public class CastControllerImplTest extends SysuiTestCase { fail("Concurrent modification exception"); } } + + @Test + public void hasConnectedCastDevice_connected() { + CastController.CastDevice castDevice = new CastController.CastDevice(); + castDevice.state = CastController.CastDevice.STATE_CONNECTED; + mController.startCasting(castDevice); + assertTrue(mController.hasConnectedCastDevice()); + } + + @Test + public void hasConnectedCastDevice_notConnected() { + CastController.CastDevice castDevice = new CastController.CastDevice(); + castDevice.state = CastController.CastDevice.STATE_CONNECTING; + mController.startCasting(castDevice); + assertTrue(mController.hasConnectedCastDevice()); + } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeCastController.java b/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeCastController.java index f6b24da9b821..84ace7cc9540 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeCastController.java +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeCastController.java @@ -51,4 +51,9 @@ public class FakeCastController extends BaseLeakChecker<Callback> implements Cas public void stopCasting(CastDevice device) { } + + @Override + public boolean hasConnectedCastDevice() { + return false; + } } diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index a3a067481022..d8fbd08a0e70 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -54,7 +54,6 @@ import android.app.ActivityManagerInternal; import android.app.AppOpsManager; import android.app.NotificationManager; import android.app.PendingIntent; -import android.bluetooth.BluetoothDevice; import android.companion.AssociationInfo; import android.companion.AssociationRequest; import android.companion.DeviceNotAssociatedException; @@ -229,7 +228,7 @@ public class CompanionDeviceManagerService extends SystemService { loadAssociationsFromDisk(); mAssociationStore.registerListener(mAssociationStoreChangeListener); - mDevicePresenceMonitor = new CompanionDevicePresenceMonitor(mUserManager, + mDevicePresenceMonitor = new CompanionDevicePresenceMonitor( mAssociationStore, mDevicePresenceCallback); mAssociationRequestsProcessor = new AssociationRequestsProcessor( @@ -315,21 +314,6 @@ public class CompanionDeviceManagerService extends SystemService { MINUTES.toMillis(10)); } - @Override - public void onUserUnlocked(@NonNull TargetUser user) { - // Notify and bind the app after the phone is unlocked. - final int userId = user.getUserIdentifier(); - final Set<BluetoothDevice> blueToothDevices = - mDevicePresenceMonitor.getPendingReportConnectedDevices().get(userId); - for (BluetoothDevice bluetoothDevice : blueToothDevices) { - for (AssociationInfo ai: - mAssociationStore.getAssociationsByAddress(bluetoothDevice.getAddress())) { - Slog.i(TAG, "onUserUnlocked, device id( " + ai.getId() + " ) is connected"); - mDevicePresenceMonitor.onBluetoothCompanionDeviceConnected(ai.getId()); - } - } - } - @NonNull AssociationInfo getAssociationWithCallerChecks( @UserIdInt int userId, @NonNull String packageName, @NonNull String macAddress) { diff --git a/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java b/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java index 82d0325cd749..f6b99b551ecb 100644 --- a/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java +++ b/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java @@ -27,23 +27,17 @@ import android.companion.AssociationInfo; import android.net.MacAddress; import android.os.Handler; import android.os.HandlerExecutor; -import android.os.UserHandle; -import android.os.UserManager; import android.util.Log; -import android.util.SparseArray; -import com.android.internal.annotations.GuardedBy; import com.android.server.companion.AssociationStore; import java.util.Arrays; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; @SuppressLint("LongLogTag") -public class BluetoothCompanionDeviceConnectionListener +class BluetoothCompanionDeviceConnectionListener extends BluetoothAdapter.BluetoothConnectionCallback implements AssociationStore.OnChangeListener { private static final String TAG = "CDM_BluetoothCompanionDeviceConnectionListener"; @@ -54,23 +48,15 @@ public class BluetoothCompanionDeviceConnectionListener void onBluetoothCompanionDeviceDisconnected(int associationId); } - private final UserManager mUserManager; private final @NonNull AssociationStore mAssociationStore; private final @NonNull Callback mCallback; /** A set of ALL connected BT device (not only companion.) */ private final @NonNull Map<MacAddress, BluetoothDevice> mAllConnectedDevices = new HashMap<>(); - - @GuardedBy("mPendingReportConnectedDevices") - @NonNull - final SparseArray<Set<BluetoothDevice>> mPendingReportConnectedDevices = - new SparseArray<>(); - - BluetoothCompanionDeviceConnectionListener(UserManager userManager, - @NonNull AssociationStore associationStore, @NonNull Callback callback) { + BluetoothCompanionDeviceConnectionListener(@NonNull AssociationStore associationStore, + @NonNull Callback callback) { mAssociationStore = associationStore; mCallback = callback; - mUserManager = userManager; } public void init(@NonNull BluetoothAdapter btAdapter) { @@ -90,32 +76,12 @@ public class BluetoothCompanionDeviceConnectionListener if (DEBUG) Log.i(TAG, "onDevice_Connected() " + btDeviceToString(device)); final MacAddress macAddress = MacAddress.fromString(device.getAddress()); - final int userId = UserHandle.myUserId(); - if (mAllConnectedDevices.put(macAddress, device) != null) { if (DEBUG) Log.w(TAG, "Device " + btDeviceToString(device) + " is already connected."); return; } - // Try to bind and notify the app after the phone is unlocked. - if (!mUserManager.isUserUnlockingOrUnlocked(UserHandle.myUserId())) { - if (DEBUG) { - Log.i(TAG, "Current user is not in unlocking or unlocked stage yet. Notify " - + "the application when the phone is unlocked"); - } - synchronized (mPendingReportConnectedDevices) { - Set<BluetoothDevice> bluetoothDevices = mPendingReportConnectedDevices.get(userId); - - if (bluetoothDevices == null) { - bluetoothDevices = new HashSet<>(); - mPendingReportConnectedDevices.put(userId, bluetoothDevices); - } - - bluetoothDevices.add(device); - } - } else { - onDeviceConnectivityChanged(device, true); - } + onDeviceConnectivityChanged(device, true); } /** @@ -132,8 +98,6 @@ public class BluetoothCompanionDeviceConnectionListener } final MacAddress macAddress = MacAddress.fromString(device.getAddress()); - final int userId = UserHandle.myUserId(); - if (mAllConnectedDevices.remove(macAddress) == null) { if (DEBUG) { Log.w(TAG, "The device wasn't tracked as connected " + btDeviceToString(device)); @@ -141,19 +105,6 @@ public class BluetoothCompanionDeviceConnectionListener return; } - // Do not need to report the connectivity since the user is not unlock the phone so - // that cdm is not bind with the app yet. - if (!mUserManager.isUserUnlockingOrUnlocked(userId)) { - synchronized (mPendingReportConnectedDevices) { - Set<BluetoothDevice> bluetoothDevices = mPendingReportConnectedDevices.get(userId); - if (bluetoothDevices != null) { - bluetoothDevices.remove(device); - } - } - - return; - } - onDeviceConnectivityChanged(device, false); } diff --git a/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java b/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java index 6c565004d948..4010be922b2c 100644 --- a/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java +++ b/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java @@ -23,16 +23,13 @@ import android.annotation.NonNull; import android.annotation.SuppressLint; import android.annotation.TestApi; import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothDevice; import android.companion.AssociationInfo; import android.content.Context; import android.os.Binder; import android.os.Handler; import android.os.Looper; import android.os.Message; -import android.os.UserManager; import android.util.Log; -import android.util.SparseArray; import com.android.server.companion.AssociationStore; @@ -89,12 +86,13 @@ public class CompanionDevicePresenceMonitor implements AssociationStore.OnChange private final SimulatedDevicePresenceSchedulerHelper mSchedulerHelper = new SimulatedDevicePresenceSchedulerHelper(); - public CompanionDevicePresenceMonitor(UserManager userManager, - @NonNull AssociationStore associationStore, @NonNull Callback callback) { + public CompanionDevicePresenceMonitor(@NonNull AssociationStore associationStore, + @NonNull Callback callback) { mAssociationStore = associationStore; mCallback = callback; - mBtConnectionListener = new BluetoothCompanionDeviceConnectionListener(userManager, - associationStore, /* BluetoothCompanionDeviceConnectionListener.Callback */ this); + + mBtConnectionListener = new BluetoothCompanionDeviceConnectionListener(associationStore, + /* BluetoothCompanionDeviceConnectionListener.Callback */ this); mBleScanner = new BleCompanionDeviceScanner(associationStore, /* BleCompanionDeviceScanner.Callback */ this); } @@ -300,15 +298,6 @@ public class CompanionDevicePresenceMonitor implements AssociationStore.OnChange // what's needed. } - /** - * Return a set of devices that pending to report connectivity - */ - public SparseArray<Set<BluetoothDevice>> getPendingReportConnectedDevices() { - synchronized (mBtConnectionListener.mPendingReportConnectedDevices) { - return mBtConnectionListener.mPendingReportConnectedDevices; - } - } - private static void enforceCallerShellOrRoot() { final int callingUid = Binder.getCallingUid(); if (callingUid == SHELL_UID || callingUid == ROOT_UID) return; diff --git a/services/core/java/com/android/server/audio/SoundDoseHelper.java b/services/core/java/com/android/server/audio/SoundDoseHelper.java index 7cdea8d08c58..9429b4c129f5 100644 --- a/services/core/java/com/android/server/audio/SoundDoseHelper.java +++ b/services/core/java/com/android/server/audio/SoundDoseHelper.java @@ -57,6 +57,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -168,7 +169,7 @@ public class SoundDoseHelper { @NonNull private final AudioHandler mAudioHandler; @NonNull private final ISafeHearingVolumeController mVolumeController; - private final boolean mEnableCsd; + private final AtomicBoolean mEnableCsd = new AtomicBoolean(false); private final Object mCsdStateLock = new Object(); @@ -195,7 +196,7 @@ public class SoundDoseHelper { private final ISoundDoseCallback.Stub mSoundDoseCallback = new ISoundDoseCallback.Stub() { public void onMomentaryExposure(float currentMel, int deviceId) { - if (!mEnableCsd) { + if (!mEnableCsd.get()) { Log.w(TAG, "onMomentaryExposure: csd not supported, ignoring callback"); return; } @@ -222,7 +223,7 @@ public class SoundDoseHelper { } public void onNewCsdValue(float currentCsd, SoundDoseRecord[] records) { - if (!mEnableCsd) { + if (!mEnableCsd.get()) { Log.w(TAG, "onNewCsdValue: csd not supported, ignoring value"); return; } @@ -272,8 +273,6 @@ public class SoundDoseHelper { mContext = context; - mEnableCsd = mContext.getResources().getBoolean(R.bool.config_audio_csd_enabled_default); - initCsd(); initSafeVolumes(); mSafeMediaVolumeState = mSettings.getGlobalInt(audioService.getContentResolver(), @@ -285,6 +284,10 @@ public class SoundDoseHelper { mSafeMediaVolumeIndex = mContext.getResources().getInteger( R.integer.config_safe_media_volume_index) * 10; + mSoundDose.set(AudioSystem.getSoundDoseInterface(mSoundDoseCallback)); + // Csd will be initially disabled until the mcc is read in onConfigureSafeMedia() + initCsd(); + mAlarmManager = (AlarmManager) mContext.getSystemService( Context.ALARM_SERVICE); } @@ -310,7 +313,7 @@ public class SoundDoseHelper { } float getOutputRs2UpperBound() { - if (!mEnableCsd) { + if (!mEnableCsd.get()) { return 0.f; } @@ -329,7 +332,7 @@ public class SoundDoseHelper { } void setOutputRs2UpperBound(float rs2Value) { - if (!mEnableCsd) { + if (!mEnableCsd.get()) { return; } @@ -347,7 +350,7 @@ public class SoundDoseHelper { } float getCsd() { - if (!mEnableCsd) { + if (!mEnableCsd.get()) { return -1.f; } @@ -366,7 +369,7 @@ public class SoundDoseHelper { } void setCsd(float csd) { - if (!mEnableCsd) { + if (!mEnableCsd.get()) { return; } @@ -400,7 +403,7 @@ public class SoundDoseHelper { } void resetCsdTimeouts() { - if (!mEnableCsd) { + if (!mEnableCsd.get()) { return; } @@ -416,7 +419,7 @@ public class SoundDoseHelper { } void forceUseFrameworkMel(boolean useFrameworkMel) { - if (!mEnableCsd) { + if (!mEnableCsd.get()) { return; } @@ -434,7 +437,7 @@ public class SoundDoseHelper { } void forceComputeCsdOnAllDevices(boolean computeCsdOnAllDevices) { - if (!mEnableCsd) { + if (!mEnableCsd.get()) { return; } @@ -454,7 +457,7 @@ public class SoundDoseHelper { } boolean isCsdEnabled() { - if (!mEnableCsd) { + if (!mEnableCsd.get()) { return false; } @@ -697,8 +700,8 @@ public class SoundDoseHelper { } /*package*/ void dump(PrintWriter pw) { - pw.print(" mEnableCsd="); pw.println(mEnableCsd); - if (mEnableCsd) { + pw.print(" mEnableCsd="); pw.println(mEnableCsd.get()); + if (mEnableCsd.get()) { synchronized (mCsdStateLock) { pw.print(" mCurrentCsd="); pw.println(mCurrentCsd); } @@ -719,9 +722,11 @@ public class SoundDoseHelper { pw.println(); } - /*package*/void reset() { + /*package*/void reset() { Log.d(TAG, "Reset the sound dose helper"); - mSoundDose.set(AudioSystem.getSoundDoseInterface(mSoundDoseCallback)); + + mSoundDose.compareAndExchange(/*expectedValue=*/null, + AudioSystem.getSoundDoseInterface(mSoundDoseCallback)); synchronized (mCsdStateLock) { try { @@ -743,7 +748,7 @@ public class SoundDoseHelper { private void updateDoseAttenuation(int newIndex, int device, int streamType, boolean isAbsoluteVolume) { - if (!mEnableCsd) { + if (!mEnableCsd.get()) { return; } @@ -775,17 +780,19 @@ public class SoundDoseHelper { } private void initCsd() { - if (!mEnableCsd) { - final ISoundDose soundDose = AudioSystem.getSoundDoseInterface(mSoundDoseCallback); - if (soundDose == null) { - Log.w(TAG, "ISoundDose instance is null."); - return; - } - try { - soundDose.disableCsd(); - } catch (RemoteException e) { - Log.e(TAG, "Cannot disable CSD", e); - } + ISoundDose soundDose = mSoundDose.get(); + if (soundDose == null) { + Log.w(TAG, "ISoundDose instance is null."); + return; + } + + try { + soundDose.setCsdEnabled(mEnableCsd.get()); + } catch (RemoteException e) { + Log.e(TAG, "Cannot disable CSD", e); + } + + if (!mEnableCsd.get()) { return; } @@ -829,7 +836,6 @@ public class SoundDoseHelper { SystemProperties.getBoolean("audio.safemedia.force", false) || mContext.getResources().getBoolean( com.android.internal.R.bool.config_safe_media_volume_enabled); - boolean safeMediaVolumeBypass = SystemProperties.getBoolean("audio.safemedia.bypass", false); @@ -860,6 +866,13 @@ public class SoundDoseHelper { mAudioHandler.obtainMessage(MSG_PERSIST_SAFE_VOLUME_STATE, persistedState, /*arg2=*/0, /*obj=*/null), /*delay=*/0); + + boolean newEnableCsd = SystemProperties.getBoolean("audio.safemedia.force", false) + || mContext.getResources().getBoolean( + R.bool.config_safe_sound_dosage_enabled); + if (mEnableCsd.compareAndSet(!newEnableCsd, newEnableCsd)) { + initCsd(); + } } } } @@ -913,7 +926,7 @@ public class SoundDoseHelper { // legacy implementation uses mSafeMediaVolumeIndex for wired HS/HP // instead of computing it from the volume curves if ((deviceType == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE - || deviceType == AudioSystem.DEVICE_OUT_WIRED_HEADSET) && !mEnableCsd) { + || deviceType == AudioSystem.DEVICE_OUT_WIRED_HEADSET) && !mEnableCsd.get()) { return mSafeMediaVolumeIndex; } diff --git a/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java b/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java index 92f0011339a5..9c3b38ab51a3 100644 --- a/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java +++ b/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java @@ -395,7 +395,7 @@ public final class SingleKeyGestureDetector { private class KeyHandler extends Handler { KeyHandler() { - super(Looper.getMainLooper()); + super(Looper.myLooper()); } @Override diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 1bb33c9a4e26..4f290ccc6ef1 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -874,7 +874,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // TODO(b/265683382) remove the flag after rollout. private static final String KEEP_PROFILES_RUNNING_FLAG = "enable_keep_profiles_running"; - private static final boolean DEFAULT_KEEP_PROFILES_RUNNING_FLAG = false; + private static final boolean DEFAULT_KEEP_PROFILES_RUNNING_FLAG = true; private static final String ENABLE_WORK_PROFILE_TELEPHONY_FLAG = "enable_work_profile_telephony"; diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java index 5636795520e9..3513557d8374 100644 --- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java @@ -202,9 +202,11 @@ class TestPhoneWindowManager { .canonicalToCurrentPackageNames(any()); } catch (PackageManager.NameNotFoundException ignored) { } - doReturn(mTelecomManager).when(mContext).getSystemService(eq(Context.TELECOM_SERVICE)); - doReturn(mNotificationManager).when(mContext) - .getSystemService(eq(NotificationManager.class)); + doReturn(false).when(mTelecomManager).isInCall(); + doReturn(false).when(mTelecomManager).isRinging(); + doReturn(mTelecomManager).when(mPhoneWindowManager).getTelecommService(); + doNothing().when(mNotificationManager).silenceNotificationSound(); + doReturn(mNotificationManager).when(mPhoneWindowManager).getNotificationService(); doReturn(mVibrator).when(mContext).getSystemService(eq(Context.VIBRATOR_SERVICE)); final PowerManager.WakeLock wakeLock = mock(PowerManager.WakeLock.class); @@ -235,6 +237,7 @@ class TestPhoneWindowManager { doNothing().when(mPhoneWindowManager).screenTurnedOn(anyInt()); doNothing().when(mPhoneWindowManager).startedWakingUp(anyInt(), anyInt()); doNothing().when(mPhoneWindowManager).finishedWakingUp(anyInt(), anyInt()); + doNothing().when(mPhoneWindowManager).lockNow(any()); mPhoneWindowManager.init(new TestInjector(mContext, mWindowManagerFuncsImpl)); mPhoneWindowManager.systemReady(); @@ -249,6 +252,7 @@ class TestPhoneWindowManager { void tearDown() { mHandlerThread.quitSafely(); LocalServices.removeServiceForTest(InputMethodManagerInternal.class); + Mockito.reset(mPhoneWindowManager); mMockitoSession.finishMocking(); } @@ -322,6 +326,7 @@ class TestPhoneWindowManager { void overrideDisplayState(int state) { doReturn(state).when(mDisplay).getState(); + doReturn(state == STATE_ON).when(mDisplayPolicy).isAwake(); Mockito.reset(mPowerManager); } @@ -388,6 +393,7 @@ class TestPhoneWindowManager { } void assertDreamRequest() { + waitForIdle(); verify(mDreamManagerInternal).requestDream(); } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java index b062e6b08e00..913535e06a21 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java @@ -296,7 +296,10 @@ public class SoundTriggerService extends SystemService { // Helper to add session logger to the capacity limited detached list. // If we are at capacity, remove the oldest, and retry - private void addDetachedSessionLogger(EventLogger logger) { + private void detachSessionLogger(EventLogger logger) { + if (!mSessionEventLoggers.remove(logger)) { + return; + } // Attempt to push to the top of the queue while (!mDetachedSessionEventLoggers.offerFirst(logger)) { // Remove the oldest element, if one still exists @@ -872,8 +875,7 @@ public class SoundTriggerService extends SystemService { private void detach() { mSoundTriggerHelper.detach(); - mSessionEventLoggers.remove(mEventLogger); - addDetachedSessionLogger(mEventLogger); + detachSessionLogger(mEventLogger); } private void enforceCallingPermission(String permission) { @@ -1659,8 +1661,7 @@ public class SoundTriggerService extends SystemService { private void detachInternal() { mEventLogger.enqueue(new SessionEvent(Type.DETACH, null)); - mSessionEventLoggers.remove(mEventLogger); - addDetachedSessionLogger(mEventLogger); + detachSessionLogger(mEventLogger); mSoundTriggerHelper.detach(); } } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewarePermission.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewarePermission.java index 13fe14caa1f9..00cedd77414e 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewarePermission.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewarePermission.java @@ -78,7 +78,7 @@ public class SoundTriggerMiddlewarePermission implements ISoundTriggerMiddleware public @NonNull SoundTriggerModuleDescriptor[] listModules() { Identity identity = getIdentity(); - enforcePermissionsForPreflight(identity); + enforcePermissionForPreflight(mContext, identity, CAPTURE_AUDIO_HOTWORD); return mDelegate.listModules(); } |