diff options
401 files changed, 5579 insertions, 5161 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/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 27f5545d8f03..e0364cbe1d69 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -13401,11 +13401,10 @@ public class DevicePolicyManager { /** * Called by a device admin or holder of the permission * {@link android.Manifest.permission#MANAGE_DEVICE_POLICY_SUPPORT_MESSAGE} to set the short - * support message. This will be displayed to the user - * in settings screens where funtionality has been disabled by the admin. The message should be - * limited to a short statement such as "This setting is disabled by your administrator. Contact - * someone@example.com for support." If the message is longer than 200 characters it may be - * truncated. + * support message. This will be displayed to the user in settings screens where functionality + * has been disabled by the admin. The message should be limited to a short statement such as + * "This setting is disabled by your administrator. Contact someone@example.com for support." + * If the message is longer than 200 characters it may be truncated. * <p> * If the short support message needs to be localized, it is the responsibility of the * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast @@ -13460,7 +13459,8 @@ public class DevicePolicyManager { /** * Called by a device admin to set the long support message. This will be displayed to the user - * in the device administators settings screen. + * in the device administrators settings screen. If the message is longer than 20000 characters + * it may be truncated. * <p> * If the long support message needs to be localized, it is the responsibility of the * {@link DeviceAdminReceiver} to listen to the {@link Intent#ACTION_LOCALE_CHANGED} broadcast diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 3487b013fa0b..79e7574647b3 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11496,6 +11496,8 @@ public final class Settings { public static final int DEVICE_STATE_ROTATION_KEY_HALF_FOLDED = 1; /** @hide */ public static final int DEVICE_STATE_ROTATION_KEY_UNFOLDED = 2; + /** @hide */ + public static final int DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY = 3; /** * The different postures that can be used as keys with @@ -11507,6 +11509,7 @@ public final class Settings { DEVICE_STATE_ROTATION_KEY_FOLDED, DEVICE_STATE_ROTATION_KEY_HALF_FOLDED, DEVICE_STATE_ROTATION_KEY_UNFOLDED, + DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY, }) @Retention(RetentionPolicy.SOURCE) public @interface DeviceStateRotationLockKey { diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java index 79a4f54bac0a..6061a0f93312 100644 --- a/core/java/android/service/voice/VoiceInteractionService.java +++ b/core/java/android/service/voice/VoiceInteractionService.java @@ -913,8 +913,6 @@ public class VoiceInteractionService extends Service { * sandboxed process. * @param callback The callback to notify of detection events. * @return An instanece of {@link VisualQueryDetector}. - * @throws UnsupportedOperationException if only single detector is supported. Multiple detector - * is only available for apps targeting {@link Build.VERSION_CODES#TIRAMISU} and above. * @throws IllegalStateException when there is an existing {@link VisualQueryDetector}, or when * there is a non-trusted hotword detector running. * @@ -935,21 +933,16 @@ public class VoiceInteractionService extends Service { throw new IllegalStateException("Not available until onReady() is called"); } synchronized (mLock) { - if (!CompatChanges.isChangeEnabled(MULTIPLE_ACTIVE_HOTWORD_DETECTORS)) { - throw new UnsupportedOperationException("VisualQueryDetector is only available if " - + "multiple detectors are allowed"); - } else { - if (mActiveVisualQueryDetector != null) { + if (mActiveVisualQueryDetector != null) { + throw new IllegalStateException( + "There is already an active VisualQueryDetector. " + + "It must be destroyed to create a new one."); + } + for (HotwordDetector detector : mActiveDetectors) { + if (!detector.isUsingSandboxedDetectionService()) { throw new IllegalStateException( - "There is already an active VisualQueryDetector. " - + "It must be destroyed to create a new one."); - } - for (HotwordDetector detector : mActiveDetectors) { - if (!detector.isUsingSandboxedDetectionService()) { - throw new IllegalStateException( - "It disallows to create trusted and non-trusted detectors " - + "at the same time."); - } + "It disallows to create trusted and non-trusted detectors " + + "at the same time."); } } diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java index f2373fbfa858..d8fa533dbef7 100644 --- a/core/java/android/view/DisplayInfo.java +++ b/core/java/android/view/DisplayInfo.java @@ -360,6 +360,14 @@ public final class DisplayInfo implements Parcelable { public SparseArray<SurfaceControl.RefreshRateRange> thermalRefreshRateThrottling = new SparseArray<>(); + /** + * The ID of the brightness throttling data that should be used. This can change e.g. in + * concurrent displays mode in which a stricter brightness throttling policy might need to be + * used. + */ + @Nullable + public String thermalBrightnessThrottlingDataId; + public static final @android.annotation.NonNull Creator<DisplayInfo> CREATOR = new Creator<DisplayInfo>() { @Override public DisplayInfo createFromParcel(Parcel source) { @@ -437,7 +445,9 @@ public final class DisplayInfo implements Parcelable { && Objects.equals(displayShape, other.displayShape) && Objects.equals(layoutLimitedRefreshRate, other.layoutLimitedRefreshRate) && BrightnessSynchronizer.floatEquals(hdrSdrRatio, other.hdrSdrRatio) - && thermalRefreshRateThrottling.contentEquals(other.thermalRefreshRateThrottling); + && thermalRefreshRateThrottling.contentEquals(other.thermalRefreshRateThrottling) + && Objects.equals( + thermalBrightnessThrottlingDataId, other.thermalBrightnessThrottlingDataId); } @Override @@ -495,6 +505,7 @@ public final class DisplayInfo implements Parcelable { layoutLimitedRefreshRate = other.layoutLimitedRefreshRate; hdrSdrRatio = other.hdrSdrRatio; thermalRefreshRateThrottling = other.thermalRefreshRateThrottling; + thermalBrightnessThrottlingDataId = other.thermalBrightnessThrottlingDataId; } public void readFromParcel(Parcel source) { @@ -559,6 +570,7 @@ public final class DisplayInfo implements Parcelable { hdrSdrRatio = source.readFloat(); thermalRefreshRateThrottling = source.readSparseArray(null, SurfaceControl.RefreshRateRange.class); + thermalBrightnessThrottlingDataId = source.readString8(); } @Override @@ -620,6 +632,7 @@ public final class DisplayInfo implements Parcelable { dest.writeTypedObject(layoutLimitedRefreshRate, flags); dest.writeFloat(hdrSdrRatio); dest.writeSparseArray(thermalRefreshRateThrottling); + dest.writeString8(thermalBrightnessThrottlingDataId); } @Override @@ -889,6 +902,8 @@ public final class DisplayInfo implements Parcelable { } sb.append(", thermalRefreshRateThrottling "); sb.append(thermalRefreshRateThrottling); + sb.append(", thermalBrightnessThrottlingDataId "); + sb.append(thermalBrightnessThrottlingDataId); sb.append("}"); return sb.toString(); } diff --git a/core/java/android/window/WindowOnBackInvokedDispatcher.java b/core/java/android/window/WindowOnBackInvokedDispatcher.java index 51382a4b265f..4d0132e46ba7 100644 --- a/core/java/android/window/WindowOnBackInvokedDispatcher.java +++ b/core/java/android/window/WindowOnBackInvokedDispatcher.java @@ -21,6 +21,8 @@ import android.annotation.Nullable; import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; import android.os.Handler; import android.os.RemoteException; import android.os.SystemProperties; @@ -421,36 +423,45 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher { return false; } - boolean requestsPredictiveBack; + boolean requestsPredictiveBack = false; // Check if the context is from an activity. while ((context instanceof ContextWrapper) && !(context instanceof Activity)) { context = ((ContextWrapper) context).getBaseContext(); } + boolean shouldCheckActivity = false; + if (context instanceof Activity) { final Activity activity = (Activity) context; - if (activity.getActivityInfo().hasOnBackInvokedCallbackEnabled()) { - requestsPredictiveBack = - activity.getActivityInfo().isOnBackInvokedCallbackEnabled(); + final ActivityInfo activityInfo = activity.getActivityInfo(); + if (activityInfo != null) { + if (activityInfo.hasOnBackInvokedCallbackEnabled()) { + shouldCheckActivity = true; + requestsPredictiveBack = activityInfo.isOnBackInvokedCallbackEnabled(); + + if (DEBUG) { + Log.d(TAG, TextUtils.formatSimple( + "Activity: %s isPredictiveBackEnabled=%s", + activity.getComponentName(), + requestsPredictiveBack)); + } + } } else { - requestsPredictiveBack = - context.getApplicationInfo().isOnBackInvokedCallbackEnabled(); + Log.w(TAG, "The ActivityInfo is null, so we cannot verify if this Activity" + + " has the 'android:enableOnBackInvokedCallback' attribute." + + " The application attribute will be used as a fallback."); } + } - if (DEBUG) { - Log.d(TAG, TextUtils.formatSimple("Activity: %s isPredictiveBackEnabled=%s", - activity.getComponentName(), - requestsPredictiveBack)); - } - } else { - requestsPredictiveBack = - context.getApplicationInfo().isOnBackInvokedCallbackEnabled(); + if (!shouldCheckActivity) { + final ApplicationInfo applicationInfo = context.getApplicationInfo(); + requestsPredictiveBack = applicationInfo.isOnBackInvokedCallbackEnabled(); if (DEBUG) { Log.d(TAG, TextUtils.formatSimple("App: %s requestsPredictiveBack=%s", - context.getApplicationInfo().packageName, + applicationInfo.packageName, requestsPredictiveBack)); } } 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/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java b/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java index 86c2893c9fab..853fe2f114f7 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java @@ -76,7 +76,7 @@ public class SystemUiSystemPropertiesFlags { /** Gating the removal of sorting-notifications-by-interruptiveness. */ public static final Flag NO_SORT_BY_INTERRUPTIVENESS = - releasedFlag("persist.sysui.notification.no_sort_by_interruptiveness"); + devFlag("persist.sysui.notification.no_sort_by_interruptiveness"); /** Gating the logging of DND state change events. */ public static final Flag LOG_DND_STATE_EVENTS = @@ -115,7 +115,7 @@ public class SystemUiSystemPropertiesFlags { } /** - * Creates a flag that is disabled by default in debuggable builds. + * Creates a flag that is enabled by default in debuggable builds. * It can be enabled by setting this flag's SystemProperty to 1. * * This flag is ALWAYS disabled in release builds. diff --git a/core/java/com/android/internal/util/TraceBuffer.java b/core/java/com/android/internal/util/TraceBuffer.java index bfcd65d4f277..fcc77bd4f043 100644 --- a/core/java/com/android/internal/util/TraceBuffer.java +++ b/core/java/com/android/internal/util/TraceBuffer.java @@ -103,6 +103,10 @@ public class TraceBuffer<P, S extends P, T extends P> { this(bufferCapacity, new ProtoOutputStreamProvider(), null); } + public TraceBuffer(int bufferCapacity, Consumer<T> protoDequeuedCallback) { + this(bufferCapacity, new ProtoOutputStreamProvider(), protoDequeuedCallback); + } + public TraceBuffer(int bufferCapacity, ProtoProvider protoProvider, Consumer<T> protoDequeuedCallback) { mBufferCapacity = bufferCapacity; 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/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/AidlTestUtils.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/AidlTestUtils.java index cce1b2bc3ece..6c701920bd51 100644 --- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/AidlTestUtils.java +++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/AidlTestUtils.java @@ -80,7 +80,7 @@ final class AidlTestUtils { /* vendorIds= */ null); } - static android.hardware.broadcastradio.ProgramSelector makeHalFmSelector(int freq) { + static android.hardware.broadcastradio.ProgramSelector makeHalFmSelector(long freq) { ProgramIdentifier halId = makeHalIdentifier(IdentifierType.AMFM_FREQUENCY_KHZ, freq); return makeHalSelector(halId, /* secondaryIds= */ new ProgramIdentifier[0]); } diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsResultTest.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsResultTest.java index df3ddfd6bb71..b54c156c820e 100644 --- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsResultTest.java +++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsResultTest.java @@ -52,6 +52,7 @@ public final class ConversionUtilsResultTest { {Result.INVALID_STATE, RadioTuner.TUNER_RESULT_INVALID_STATE}, {Result.NOT_SUPPORTED, RadioTuner.TUNER_RESULT_NOT_SUPPORTED}, {Result.TIMEOUT, RadioTuner.TUNER_RESULT_TIMEOUT}, + {Result.CANCELED, RadioTuner.TUNER_RESULT_CANCELED}, {Result.UNKNOWN_ERROR, RadioTuner.TUNER_RESULT_UNKNOWN_ERROR} }); } diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsTest.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsTest.java index aea01783ee68..2ef923d1339a 100644 --- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsTest.java +++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/ConversionUtilsTest.java @@ -27,11 +27,13 @@ import android.hardware.broadcastradio.ProgramIdentifier; import android.hardware.broadcastradio.ProgramInfo; import android.hardware.broadcastradio.ProgramListChunk; import android.hardware.broadcastradio.Properties; +import android.hardware.broadcastradio.Result; import android.hardware.broadcastradio.VendorKeyValue; import android.hardware.radio.Announcement; import android.hardware.radio.ProgramList; import android.hardware.radio.ProgramSelector; import android.hardware.radio.RadioManager; +import android.os.ServiceSpecificException; import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder; import com.android.server.broadcastradio.ExtendedRadioMockitoTestCase; @@ -153,6 +155,16 @@ public final class ConversionUtilsTest extends ExtendedRadioMockitoTestCase { } @Test + public void throwOnError_withCancelException() { + ServiceSpecificException halException = new ServiceSpecificException(Result.CANCELED); + + RuntimeException thrown = ConversionUtils.throwOnError(halException, "tune"); + + expect.withMessage("Exception thrown for canceling error").that(thrown) + .hasMessageThat().contains("tune: CANCELED"); + } + + @Test public void propertiesFromHalProperties_idsMatch() { expect.withMessage("Properties id") .that(MODULE_PROPERTIES.getId()).isEqualTo(TEST_ID); diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/TunerSessionTest.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/TunerSessionTest.java index f85748c93c57..84aa86472e81 100644 --- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/TunerSessionTest.java +++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/aidl/TunerSessionTest.java @@ -1168,13 +1168,29 @@ public final class TunerSessionTest extends ExtendedRadioMockitoTestCase { doReturn(USER_ID_2).when(() -> RadioServiceUserController.getCurrentUser()); mHalTunerCallback.onCurrentProgramInfoChanged(AidlTestUtils.makeHalProgramInfo( - AidlTestUtils.makeHalFmSelector(/* freq= */ 97300), SIGNAL_QUALITY)); + AidlTestUtils.makeHalFmSelector(AM_FM_FREQUENCY_LIST[1]), SIGNAL_QUALITY)); verify(mAidlTunerCallbackMocks[0], CALLBACK_TIMEOUT.times(0)) .onCurrentProgramInfoChanged(any()); } @Test + public void onTuneFailed_forTunerCallback() throws Exception { + int numSessions = 3; + openAidlClients(numSessions); + android.hardware.broadcastradio.ProgramSelector halSel = AidlTestUtils.makeHalFmSelector( + AM_FM_FREQUENCY_LIST[1]); + ProgramSelector sel = AidlTestUtils.makeFmSelector(AM_FM_FREQUENCY_LIST[1]); + + mHalTunerCallback.onTuneFailed(Result.CANCELED, halSel); + + for (int index = 0; index < numSessions; index++) { + verify(mAidlTunerCallbackMocks[index], CALLBACK_TIMEOUT) + .onTuneFailed(RadioTuner.TUNER_RESULT_CANCELED, sel); + } + } + + @Test public void onAntennaStateChange_forTunerCallback() throws Exception { int numSessions = 3; openAidlClients(numSessions); diff --git a/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java b/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java index bf8c7c63590f..72969f7d8b96 100644 --- a/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java +++ b/core/tests/bugreports/src/com/android/os/bugreports/tests/BugreportManagerTest.java @@ -112,6 +112,7 @@ public class BugreportManagerTest { Paths.get("/data/misc/wmtrace/layers_trace.winscope"), Paths.get("/data/misc/wmtrace/transactions_trace.winscope"), Paths.get("/data/misc/wmtrace/transition_trace.winscope"), + Paths.get("/data/misc/wmtrace/shell_transition_trace.winscope"), }; private static final Path[] UI_TRACES_GENERATED_DURING_BUGREPORT = { Paths.get("/data/misc/wmtrace/layers_trace_from_transactions.winscope"), diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp index 67842f05165c..ab500f730fc8 100644 --- a/core/tests/coretests/Android.bp +++ b/core/tests/coretests/Android.bp @@ -59,6 +59,7 @@ android_test { "print-test-util-lib", "testng", "servicestests-utils", + "device-time-shell-utils", ], libs: [ diff --git a/core/tests/coretests/src/android/app/time/TimeManagerTest.java b/core/tests/coretests/src/android/app/time/TimeManagerTest.java new file mode 100644 index 000000000000..6370f3bad082 --- /dev/null +++ b/core/tests/coretests/src/android/app/time/TimeManagerTest.java @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.time; + +import static android.app.time.Capabilities.CAPABILITY_NOT_ALLOWED; +import static android.app.time.Capabilities.CAPABILITY_POSSESSED; +import static android.app.time.cts.shell.DeviceConfigKeys.NAMESPACE_SYSTEM_TIME; +import static android.app.time.cts.shell.DeviceConfigKeys.TimeZoneDetector.KEY_TIME_ZONE_DETECTOR_AUTO_DETECTION_ENABLED_DEFAULT; +import static android.app.time.cts.shell.DeviceConfigShellHelper.SYNC_DISABLED_MODE_UNTIL_REBOOT; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assume.assumeTrue; + +import android.app.Instrumentation; +import android.app.time.cts.shell.DeviceConfigShellHelper; +import android.app.time.cts.shell.DeviceShellCommandExecutor; +import android.app.time.cts.shell.TimeZoneDetectorShellHelper; +import android.app.time.cts.shell.device.InstrumentationShellCommandExecutor; +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; + +import com.android.compatibility.common.util.AdoptShellPermissionsRule; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +/** + * Tests for non-SDK methods / internal behavior related to {@link TimeManager}. + * Also see {@link android.app.time.cts.TimeManagerTest} + */ +public class TimeManagerTest { + + /** + * This rule adopts the Shell process permissions, needed because MANAGE_TIME_AND_ZONE_DETECTION + * and SUGGEST_EXTERNAL_TIME required by {@link TimeManager} are privileged permissions. + */ + @Rule + public final AdoptShellPermissionsRule shellPermRule = new AdoptShellPermissionsRule(); + + private TimeZoneDetectorShellHelper mTimeZoneDetectorShellHelper; + private DeviceConfigShellHelper mDeviceConfigShellHelper; + private DeviceConfigShellHelper.PreTestState mDeviceConfigPreTestState; + + private Context mContext; + private TimeManager mTimeManager; + + @Before + public void before() throws Exception { + Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); + DeviceShellCommandExecutor shellCommandExecutor = new InstrumentationShellCommandExecutor( + instrumentation.getUiAutomation()); + mTimeZoneDetectorShellHelper = new TimeZoneDetectorShellHelper(shellCommandExecutor); + mDeviceConfigShellHelper = new DeviceConfigShellHelper(shellCommandExecutor); + + // This anticipates a future state where a generally applied target preparer may disable + // device_config sync for all CTS tests: only suspend syncing if it isn't already suspended, + // and only resume it if this test suspended it. + mDeviceConfigPreTestState = mDeviceConfigShellHelper.setSyncModeForTest( + SYNC_DISABLED_MODE_UNTIL_REBOOT, NAMESPACE_SYSTEM_TIME); + + mContext = InstrumentationRegistry.getInstrumentation().getContext(); + mTimeManager = mContext.getSystemService(TimeManager.class); + assertNotNull(mTimeManager); + + // Avoid running tests when device policy doesn't allow user configuration. If this needs to + // pass then tests will become more complicated or separate cases broken out. + int configureAutoDetectionEnabledCapability = mTimeManager.getTimeCapabilitiesAndConfig() + .getCapabilities().getConfigureAutoDetectionEnabledCapability(); + boolean userRestricted = configureAutoDetectionEnabledCapability == CAPABILITY_NOT_ALLOWED; + assertFalse(userRestricted); + } + + @After + public void after() throws Exception { + mDeviceConfigShellHelper.restoreDeviceConfigStateForTest(mDeviceConfigPreTestState); + } + + /** + * Tests a server flag that can be used to change the "automatic time zone enabled" value + * for devices where the user hasn't yet expressed a preference. The flag is only intended for + * use during internal testing and therefore has not been included in CTS; it could be removed + * in later releases. This test takes ~35s to run because the asynchronous operations involved + * require sleeps to allow them to complete. + */ + @Test + public void testTimeZoneEnabledDefaultFlagBehavior() throws Exception { + TimeZoneCapabilitiesAndConfig capabilitiesAndConfig = + mTimeManager.getTimeZoneCapabilitiesAndConfig(); + + TimeZoneCapabilities capabilities = capabilitiesAndConfig.getCapabilities(); + + // Skip this test if the current user is not allowed to alter time detection settings via + // the TimeManager APIs. + assumeTrue(capabilities.getConfigureAutoDetectionEnabledCapability() + == CAPABILITY_POSSESSED); + + // Start with the auto_time_zone_explicit setting empty, but record the value if there is + // one so that it can be restored. + boolean isAutoDetectionEnabledExplicit = + mTimeZoneDetectorShellHelper.isAutoTimeZoneEnabledExplicitly(); + + mTimeZoneDetectorShellHelper.clearAutoTimeZoneEnabledExplicitly(); + sleepForAsyncOperation(); + + // Record the current time zone and auto detection setting so that it can be restored by the + // test afterwards. + boolean initialAutoTzEnabled = + capabilitiesAndConfig.getConfiguration().isAutoDetectionEnabled(); + TimeZoneState initialTimeZoneState = mTimeManager.getTimeZoneState(); + + try { + // The server flag should be used to control the device's behavior initially because + // auto_time_zone_explicit is not set. + boolean newAutoTzEnabled = !initialAutoTzEnabled; + mDeviceConfigShellHelper.put(NAMESPACE_SYSTEM_TIME, + KEY_TIME_ZONE_DETECTOR_AUTO_DETECTION_ENABLED_DEFAULT, + Boolean.toString(newAutoTzEnabled)); + sleepForAsyncOperation(); + assertEquals(newAutoTzEnabled, mTimeZoneDetectorShellHelper.isAutoDetectionEnabled()); + + mDeviceConfigShellHelper.put(NAMESPACE_SYSTEM_TIME, + KEY_TIME_ZONE_DETECTOR_AUTO_DETECTION_ENABLED_DEFAULT, + Boolean.toString(initialAutoTzEnabled)); + sleepForAsyncOperation(); + assertEquals(initialAutoTzEnabled, + mTimeZoneDetectorShellHelper.isAutoDetectionEnabled()); + + // Now simulate the user toggling the auto tz setting twice, which should cause the + // system to recognize the user has expressed an explicit preference. + TimeZoneConfiguration config1 = new TimeZoneConfiguration.Builder() + .setAutoDetectionEnabled(newAutoTzEnabled) + .build(); + mTimeManager.updateTimeZoneConfiguration(config1); + sleepForAsyncOperation(); + assertEquals(newAutoTzEnabled, + mTimeZoneDetectorShellHelper.isAutoDetectionEnabled()); + + TimeZoneConfiguration config2 = new TimeZoneConfiguration.Builder() + .setAutoDetectionEnabled(initialAutoTzEnabled) + .build(); + mTimeManager.updateTimeZoneConfiguration(config2); + sleepForAsyncOperation(); + assertEquals(initialAutoTzEnabled, + mTimeZoneDetectorShellHelper.isAutoDetectionEnabled()); + + // Auto tz enabled is now back to initialAutoTzEnabled. + + // Repeat the flag check: Now the server flag should have no effect because they have + // expressed a preference. + mDeviceConfigShellHelper.put(NAMESPACE_SYSTEM_TIME, + KEY_TIME_ZONE_DETECTOR_AUTO_DETECTION_ENABLED_DEFAULT, + Boolean.toString(newAutoTzEnabled)); + sleepForAsyncOperation(); + assertEquals(initialAutoTzEnabled, + mTimeZoneDetectorShellHelper.isAutoDetectionEnabled()); + } finally { + // Restore the device's state (as much as possible). + if (isAutoDetectionEnabledExplicit) { + mTimeZoneDetectorShellHelper.setAutoTimeZoneEnabledExplicitly(); + } else { + mTimeZoneDetectorShellHelper.clearAutoTimeZoneEnabledExplicitly(); + } + + // Restore auto tz and the time zone (if the device started in manual). + mTimeZoneDetectorShellHelper.setAutoDetectionEnabled(initialAutoTzEnabled); + if (!initialAutoTzEnabled) { + // If the device started in "manual" we can restore the time zone to its original + // state, maybe not confidence exactly. + mTimeZoneDetectorShellHelper.setTimeZoneState( + initialTimeZoneState.getId(), + initialTimeZoneState.getUserShouldConfirmId()); + } + sleepForAsyncOperation(); + } + } + + /** + * Sleeps for a length of time sufficient to allow async operations to complete. Many time + * manager APIs are or could be asynchronous and deal with time, so there are no practical + * alternatives. + */ + private static void sleepForAsyncOperation() throws Exception { + Thread.sleep(5_000); + } +} diff --git a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java index a3eda8dfe8e0..f45db23ace76 100644 --- a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java +++ b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java @@ -39,7 +39,6 @@ import android.view.WindowManager.LayoutParams; import android.widget.TextView; import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.FlakyTest; import androidx.test.platform.app.InstrumentationRegistry; import org.junit.Before; @@ -55,7 +54,6 @@ import org.mockito.Spy; * atest FrameworksCoreTests:ImeInsetsSourceConsumerTest */ @Presubmit -@FlakyTest(detail = "Promote once confirmed non-flaky") @RunWith(AndroidJUnit4.class) public class ImeInsetsSourceConsumerTest { diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp index 54978bd4496d..6a79bc1f46c2 100644 --- a/libs/WindowManager/Shell/Android.bp +++ b/libs/WindowManager/Shell/Android.bp @@ -125,6 +125,34 @@ prebuilt_etc { // End ProtoLog +gensrcs { + name: "wm-shell-protos", + + tools: [ + "aprotoc", + "protoc-gen-javastream", + "soong_zip", + ], + + tool_files: [ + ":libprotobuf-internal-protos", + ], + + cmd: "mkdir -p $(genDir)/$(in) " + + "&& $(location aprotoc) " + + " --plugin=$(location protoc-gen-javastream) " + + " --javastream_out=$(genDir)/$(in) " + + " -Iexternal/protobuf/src " + + " -I . " + + " $(in) " + + "&& $(location soong_zip) -jar -o $(out) -C $(genDir)/$(in) -D $(genDir)/$(in)", + + srcs: [ + "proto/**/*.proto", + ], + output_extension: "srcjar", +} + java_library { name: "WindowManager-Shell-proto", @@ -142,6 +170,7 @@ android_library { // TODO(b/168581922) protologtool do not support kotlin(*.kt) ":wm_shell-sources-kt", ":wm_shell-aidls", + ":wm-shell-protos", ], resource_dirs: [ "res", diff --git a/libs/WindowManager/Shell/proto/wm_shell_transition_trace.proto b/libs/WindowManager/Shell/proto/wm_shell_transition_trace.proto new file mode 100644 index 000000000000..6e0110193a05 --- /dev/null +++ b/libs/WindowManager/Shell/proto/wm_shell_transition_trace.proto @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = "proto2"; + +package com.android.wm.shell; + +option java_multiple_files = true; + +/* Represents a file full of transition entries. + Encoded, it should start with 0x09 0x57 0x4D 0x53 0x54 0x52 0x41 0x43 0x45 (.WMSTRACE), such + that it can be easily identified. */ +message WmShellTransitionTraceProto { + /* constant; MAGIC_NUMBER = (long) MAGIC_NUMBER_H << 32 | MagicNumber.MAGIC_NUMBER_L + (this is needed because enums have to be 32 bits and there's no nice way to put 64bit + constants into .proto files. */ + enum MagicNumber { + INVALID = 0; + MAGIC_NUMBER_L = 0x54534D57; /* WMST (little-endian ASCII) */ + MAGIC_NUMBER_H = 0x45434152; /* RACE (little-endian ASCII) */ + } + + // Must be the first field, set to value in MagicNumber + required fixed64 magic_number = 1; + repeated Transition transitions = 2; + repeated HandlerMapping handlerMappings = 3; +} + +message Transition { + required int32 id = 1; + optional int64 dispatch_time_ns = 2; + optional int32 handler = 3; + optional int64 merge_time_ns = 4; + optional int64 merge_request_time_ns = 5; + optional int32 merged_into = 6; + optional int64 abort_time_ns = 7; +} + +message HandlerMapping { + required int32 id = 1; + required string name = 2; +} diff --git a/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml b/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml index 96d2d7c954d8..d2360e9b1ae0 100644 --- a/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml +++ b/libs/WindowManager/Shell/res/drawable/bubble_manage_btn_bg.xml @@ -16,9 +16,10 @@ --> <shape xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> <solid - android:color="@android:color/system_neutral1_800" + android:color="?androidprv:attr/materialColorSurfaceContainerHigh" /> <corners android:radius="20dp" /> diff --git a/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml b/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml index 4bd2f134d027..8fd2e68f6451 100644 --- a/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml +++ b/libs/WindowManager/Shell/res/drawable/bubble_manage_menu_bg.xml @@ -17,7 +17,7 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle"> - <solid android:color="?androidprv:attr/colorSurface" /> + <solid android:color="?androidprv:attr/materialColorSurfaceBright" /> <corners android:bottomLeftRadius="?android:attr/dialogCornerRadius" android:topLeftRadius="?android:attr/dialogCornerRadius" diff --git a/libs/WindowManager/Shell/res/layout/bubble_flyout.xml b/libs/WindowManager/Shell/res/layout/bubble_flyout.xml index 7fdf290efd09..65a07a718677 100644 --- a/libs/WindowManager/Shell/res/layout/bubble_flyout.xml +++ b/libs/WindowManager/Shell/res/layout/bubble_flyout.xml @@ -13,7 +13,8 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<merge xmlns:android="http://schemas.android.com/apk/res/android"> +<merge xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <LinearLayout android:id="@+id/bubble_flyout_text_container" @@ -48,6 +49,7 @@ android:fontFamily="@*android:string/config_bodyFontFamilyMedium" android:maxLines="1" android:ellipsize="end" + android:textColor="?androidprv:attr/materialColorOnSurface" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2"/> <TextView @@ -57,6 +59,7 @@ android:fontFamily="@*android:string/config_bodyFontFamily" android:maxLines="2" android:ellipsize="end" + android:textColor="?androidprv:attr/materialColorOnSurfaceVariant" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2"/> </LinearLayout> diff --git a/libs/WindowManager/Shell/res/layout/bubble_manage_button.xml b/libs/WindowManager/Shell/res/layout/bubble_manage_button.xml index 0cf6d73162d2..f88d63d796ea 100644 --- a/libs/WindowManager/Shell/res/layout/bubble_manage_button.xml +++ b/libs/WindowManager/Shell/res/layout/bubble_manage_button.xml @@ -16,6 +16,7 @@ --> <com.android.wm.shell.common.AlphaOptimizedButton xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" style="@android:style/Widget.DeviceDefault.Button.Borderless" android:id="@+id/manage_button" android:layout_gravity="start" @@ -27,6 +28,6 @@ android:focusable="true" android:text="@string/manage_bubbles_text" android:textSize="@*android:dimen/text_size_body_2_material" - android:textColor="@*android:color/system_neutral1_50" + android:textColor="?androidprv:attr/materialColorOnSurface" android:background="@drawable/bubble_manage_btn_bg" />
\ No newline at end of file diff --git a/libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml b/libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml index 298ad3025b00..10c9562cf651 100644 --- a/libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml +++ b/libs/WindowManager/Shell/res/layout/bubble_manage_menu.xml @@ -15,6 +15,7 @@ ~ limitations under the License --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/bubble_manage_menu_bg" @@ -41,6 +42,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" + android:textColor="?androidprv:attr/materialColorOnSurface" android:textAppearance="@*android:style/TextAppearance.DeviceDefault" android:text="@string/bubble_dismiss_text" /> @@ -66,6 +68,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" + android:textColor="?androidprv:attr/materialColorOnSurface" android:textAppearance="@*android:style/TextAppearance.DeviceDefault" android:text="@string/bubbles_dont_bubble_conversation" /> @@ -92,6 +95,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" + android:textColor="?androidprv:attr/materialColorOnSurface" android:textAppearance="@*android:style/TextAppearance.DeviceDefault" /> </LinearLayout> diff --git a/libs/WindowManager/Shell/res/layout/letterbox_restart_dialog_layout.xml b/libs/WindowManager/Shell/res/layout/letterbox_restart_dialog_layout.xml index 5aff4159e135..7f1aac3551b6 100644 --- a/libs/WindowManager/Shell/res/layout/letterbox_restart_dialog_layout.xml +++ b/libs/WindowManager/Shell/res/layout/letterbox_restart_dialog_layout.xml @@ -73,11 +73,13 @@ android:textAlignment="center"/> <LinearLayout + android:id="@+id/letterbox_restart_dialog_checkbox_container" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingVertical="14dp" android:orientation="horizontal" android:layout_gravity="center_vertical" - android:layout_marginVertical="32dp"> + android:layout_marginVertical="18dp"> <CheckBox android:id="@+id/letterbox_restart_dialog_checkbox" diff --git a/libs/WindowManager/Shell/res/values/config.xml b/libs/WindowManager/Shell/res/values/config.xml index 76eb0945d990..a3916b71592b 100644 --- a/libs/WindowManager/Shell/res/values/config.xml +++ b/libs/WindowManager/Shell/res/values/config.xml @@ -125,4 +125,7 @@ <!-- Whether the additional education about reachability is enabled --> <bool name="config_letterboxIsReachabilityEducationEnabled">false</bool> + + <!-- Whether DragAndDrop capability is enabled --> + <bool name="config_enableShellDragDrop">true</bool> </resources> 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/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index 21f02b10035b..3eb9fa2eef6b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -260,7 +260,7 @@ public class BubbleController implements ConfigurationChangeListener, /** One handed mode controller to register transition listener. */ private Optional<OneHandedController> mOneHandedOptional; /** Drag and drop controller to register listener for onDragStarted. */ - private DragAndDropController mDragAndDropController; + private Optional<DragAndDropController> mDragAndDropController; /** Used to send bubble events to launcher. */ private Bubbles.BubbleStateListener mBubbleStateListener; @@ -286,7 +286,7 @@ public class BubbleController implements ConfigurationChangeListener, BubblePositioner positioner, DisplayController displayController, Optional<OneHandedController> oneHandedOptional, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, @ShellBackgroundThread ShellExecutor bgExecutor, @@ -469,7 +469,7 @@ public class BubbleController implements ConfigurationChangeListener, }); mOneHandedOptional.ifPresent(this::registerOneHandedState); - mDragAndDropController.addListener(this::collapseStack); + mDragAndDropController.ifPresent(controller -> controller.addListener(this::collapseStack)); // Clear out any persisted bubbles on disk that no longer have a valid user. List<UserInfo> users = mUserManager.getAliveUsers(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java index f878a46d26f2..6a5f785504c0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java @@ -177,7 +177,7 @@ public class BubbleFlyoutView extends FrameLayout { final TypedArray ta = mContext.obtainStyledAttributes( new int[] { - com.android.internal.R.attr.colorSurface, + com.android.internal.R.attr.materialColorSurfaceContainer, android.R.attr.dialogCornerRadius}); mFloatingBackgroundColor = ta.getColor(0, Color.WHITE); mCornerRadius = ta.getDimensionPixelSize(1, 0); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt index c49451df31b4..df7f5b4f0150 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflow.kt @@ -19,23 +19,21 @@ package com.android.wm.shell.bubbles import android.app.ActivityTaskManager.INVALID_TASK_ID import android.content.Context import android.graphics.Bitmap +import android.graphics.Color import android.graphics.Matrix import android.graphics.Path import android.graphics.drawable.AdaptiveIconDrawable import android.graphics.drawable.ColorDrawable import android.graphics.drawable.InsetDrawable import android.util.PathParser -import android.util.TypedValue import android.view.LayoutInflater import android.widget.FrameLayout import com.android.launcher3.icons.BubbleIconFactory import com.android.wm.shell.R import com.android.wm.shell.bubbles.bar.BubbleBarExpandedView -class BubbleOverflow( - private val context: Context, - private val positioner: BubblePositioner -) : BubbleViewProvider { +class BubbleOverflow(private val context: Context, private val positioner: BubblePositioner) : + BubbleViewProvider { private lateinit var bitmap: Bitmap private lateinit var dotPath: Path @@ -54,7 +52,7 @@ class BubbleOverflow( overflowBtn = null } - /** Call before use and again if cleanUpExpandedState was called. */ + /** Call before use and again if cleanUpExpandedState was called. */ fun initialize(controller: BubbleController) { createExpandedView() getExpandedView()?.initialize(controller, controller.stackView, true /* isOverflow */) @@ -74,10 +72,10 @@ class BubbleOverflow( } fun updateResources() { - overflowIconInset = context.resources.getDimensionPixelSize( - R.dimen.bubble_overflow_icon_inset) - overflowBtn?.layoutParams = FrameLayout.LayoutParams(positioner.bubbleSize, - positioner.bubbleSize) + overflowIconInset = + context.resources.getDimensionPixelSize(R.dimen.bubble_overflow_icon_inset) + overflowBtn?.layoutParams = + FrameLayout.LayoutParams(positioner.bubbleSize, positioner.bubbleSize) expandedView?.updateDimensions() } @@ -85,36 +83,58 @@ class BubbleOverflow( val res = context.resources // Set overflow button accent color, dot color - val typedValue = TypedValue() - context.theme.resolveAttribute(com.android.internal.R.attr.colorAccentPrimary, - typedValue, true) - val colorAccent = res.getColor(typedValue.resourceId, null) - dotColor = colorAccent - val shapeColor = res.getColor(android.R.color.system_accent1_1000) + val typedArray = + context.obtainStyledAttributes( + intArrayOf( + com.android.internal.R.attr.materialColorPrimaryFixed, + com.android.internal.R.attr.materialColorOnPrimaryFixed + ) + ) + + val colorAccent = typedArray.getColor(0, Color.WHITE) + val shapeColor = typedArray.getColor(1, Color.BLACK) + typedArray.recycle() + + dotColor = colorAccent overflowBtn?.iconDrawable?.setTint(shapeColor) - val iconFactory = BubbleIconFactory(context, - context.getResources().getDimensionPixelSize(R.dimen.bubble_size), - context.getResources().getDimensionPixelSize(R.dimen.bubble_badge_size), - context.getResources().getColor(R.color.important_conversation), - context.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.importance_ring_stroke_width)) + val iconFactory = + BubbleIconFactory( + context, + res.getDimensionPixelSize(R.dimen.bubble_size), + res.getDimensionPixelSize(R.dimen.bubble_badge_size), + res.getColor(R.color.important_conversation), + res.getDimensionPixelSize(com.android.internal.R.dimen.importance_ring_stroke_width) + ) // Update bitmap val fg = InsetDrawable(overflowBtn?.iconDrawable, overflowIconInset) - bitmap = iconFactory.createBadgedIconBitmap( - AdaptiveIconDrawable(ColorDrawable(colorAccent), fg)).icon + bitmap = + iconFactory + .createBadgedIconBitmap(AdaptiveIconDrawable(ColorDrawable(colorAccent), fg)) + .icon // Update dot path - dotPath = PathParser.createPathFromPathData( - res.getString(com.android.internal.R.string.config_icon_mask)) - val scale = iconFactory.normalizer.getScale(iconView!!.iconDrawable, - null /* outBounds */, null /* path */, null /* outMaskShape */) + dotPath = + PathParser.createPathFromPathData( + res.getString(com.android.internal.R.string.config_icon_mask) + ) + val scale = + iconFactory.normalizer.getScale( + iconView!!.iconDrawable, + null /* outBounds */, + null /* path */, + null /* outMaskShape */ + ) val radius = BadgedImageView.DEFAULT_PATH_SIZE / 2f val matrix = Matrix() - matrix.setScale(scale /* x scale */, scale /* y scale */, radius /* pivot x */, - radius /* pivot y */) + matrix.setScale( + scale /* x scale */, + scale /* y scale */, + radius /* pivot x */, + radius /* pivot y */ + ) dotPath.transform(matrix) // Attach BubbleOverflow to BadgedImageView @@ -132,8 +152,12 @@ class BubbleOverflow( } fun createExpandedView(): BubbleExpandedView? { - expandedView = inflater.inflate(R.layout.bubble_expanded_view, - null /* root */, false /* attachToRoot */) as BubbleExpandedView + expandedView = + inflater.inflate( + R.layout.bubble_expanded_view, + null /* root */, + false /* attachToRoot */ + ) as BubbleExpandedView expandedView?.applyThemeAttrs() updateResources() return expandedView @@ -177,11 +201,15 @@ class BubbleOverflow( override fun getIconView(): BadgedImageView? { if (overflowBtn == null) { - overflowBtn = inflater.inflate(R.layout.bubble_overflow_button, - null /* root */, false /* attachToRoot */) as BadgedImageView + overflowBtn = + inflater.inflate( + R.layout.bubble_overflow_button, + null /* root */, + false /* attachToRoot */ + ) as BadgedImageView overflowBtn?.initialize(positioner) - overflowBtn?.contentDescription = context.resources.getString( - R.string.bubble_overflow_button_content_description) + overflowBtn?.contentDescription = + context.resources.getString(R.string.bubble_overflow_button_content_description) val bubbleSize = positioner.bubbleSize overflowBtn?.layoutParams = FrameLayout.LayoutParams(bubbleSize, bubbleSize) updateBtnTheme() @@ -200,4 +228,4 @@ class BubbleOverflow( companion object { const val KEY = "Overflow" } -}
\ No newline at end of file +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java index 9aa285fff19c..9655470ce914 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleOverflowContainerView.java @@ -220,8 +220,8 @@ public class BubbleOverflowContainerView extends LinearLayout { : res.getColor(R.color.bubbles_light)); final TypedArray typedArray = getContext().obtainStyledAttributes(new int[] { - android.R.attr.colorBackgroundFloating, - android.R.attr.textColorSecondary}); + com.android.internal.R.attr.materialColorSurfaceBright, + com.android.internal.R.attr.materialColorOnSurface}); int bgColor = typedArray.getColor(0, isNightMode ? Color.BLACK : Color.WHITE); int textColor = typedArray.getColor(1, isNightMode ? Color.WHITE : Color.BLACK); textColor = ContrastColorUtil.ensureTextContrast(textColor, bgColor, isNightMode); 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/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java index 9eba5ecd36f1..e7dede757578 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java @@ -738,10 +738,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange getRefBounds2(mTempRect); t.setPosition(leash2, mTempRect.left, mTempRect.top) .setWindowCrop(leash2, mTempRect.width(), mTempRect.height()); - // Make right or bottom side surface always higher than left or top side to avoid weird - // animation when dismiss split. e.g. App surface fling above on decor surface. - t.setLayer(leash1, 1); - t.setLayer(leash2, 2); if (mImePositionProcessor.adjustSurfaceLayoutForIme( t, dividerLeash, leash1, leash2, dimLayer1, dimLayer2)) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogLayout.java index c53e6389331a..05fd5f1172e1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/RestartDialogLayout.java @@ -95,6 +95,9 @@ public class RestartDialogLayout extends ConstraintLayout implements DialogConta @Override protected void onFinishInflate() { super.onFinishInflate(); + final View checkboxContainer = findViewById( + R.id.letterbox_restart_dialog_checkbox_container); + final CheckBox checkbox = findViewById(R.id.letterbox_restart_dialog_checkbox); mDialogContainer = findViewById(R.id.letterbox_restart_dialog_container); mDialogTitle = findViewById(R.id.letterbox_restart_dialog_title); mBackgroundDim = getBackground().mutate(); @@ -103,5 +106,6 @@ public class RestartDialogLayout extends ConstraintLayout implements DialogConta // We add a no-op on-click listener to the dialog container so that clicks on it won't // propagate to the listener of the layout (which represents the background dim). mDialogContainer.setOnClickListener(view -> {}); + checkboxContainer.setOnClickListener(view -> checkbox.performClick()); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java index e9957fd4f4f1..12d51f54a09c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvWMShellModule.java @@ -41,11 +41,11 @@ import com.android.wm.shell.sysui.ShellController; import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.transition.Transitions; -import java.util.Optional; - import dagger.Module; import dagger.Provides; +import java.util.Optional; + /** * Provides dependencies from {@link com.android.wm.shell}, these dependencies are only * accessible from components within the WM subcomponent (can be explicitly exposed to the @@ -81,7 +81,7 @@ public class TvWMShellModule { DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, Transitions transitions, TransactionPool transactionPool, IconProvider iconProvider, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java index 9808c591592f..80e920fefe5f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java @@ -186,15 +186,15 @@ public abstract class WMShellBaseModule { @WMSingleton @Provides - static DragAndDropController provideDragAndDropController(Context context, + static Optional<DragAndDropController> provideDragAndDropController(Context context, ShellInit shellInit, ShellController shellController, DisplayController displayController, UiEventLogger uiEventLogger, IconProvider iconProvider, @ShellMainThread ShellExecutor mainExecutor) { - return new DragAndDropController(context, shellInit, shellController, displayController, - uiEventLogger, iconProvider, mainExecutor); + return Optional.ofNullable(DragAndDropController.create(context, shellInit, shellController, + displayController, uiEventLogger, iconProvider, mainExecutor)); } @WMSingleton @@ -544,13 +544,14 @@ public abstract class WMShellBaseModule { DisplayController displayController, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, - @ShellAnimationThread ShellExecutor animExecutor) { + @ShellAnimationThread ShellExecutor animExecutor, + ShellCommandHandler shellCommandHandler) { if (!context.getResources().getBoolean(R.bool.config_registerShellTransitionsOnInit)) { // TODO(b/238217847): Force override shell init if registration is disabled shellInit = new ShellInit(mainExecutor); } return new Transitions(context, shellInit, shellController, organizer, pool, - displayController, mainExecutor, mainHandler, animExecutor); + displayController, mainExecutor, mainHandler, animExecutor, shellCommandHandler); } @WMSingleton @@ -796,7 +797,7 @@ public abstract class WMShellBaseModule { DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropControllerOptional, ShellTaskOrganizer shellTaskOrganizer, Optional<BubbleController> bubblesOptional, Optional<SplitScreenController> splitScreenOptional, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 2f0f56cfdfb0..f3130d358ec1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -171,7 +171,7 @@ public abstract class WMShellModule { BubblePositioner positioner, DisplayController displayController, @DynamicOverride Optional<OneHandedController> oneHandedOptional, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, @ShellBackgroundThread ShellExecutor bgExecutor, @@ -320,7 +320,7 @@ public abstract class WMShellModule { DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, Transitions transitions, TransactionPool transactionPool, IconProvider iconProvider, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java index 4cfaae6e51c7..091de3a86461 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java @@ -94,7 +94,24 @@ public class DragAndDropController implements DisplayController.OnDisplaysChange void onDragStarted(); } - public DragAndDropController(Context context, + /** + * Creates {@link DragAndDropController}. Returns {@code null} if the feature is disabled. + */ + public static DragAndDropController create(Context context, + ShellInit shellInit, + ShellController shellController, + DisplayController displayController, + UiEventLogger uiEventLogger, + IconProvider iconProvider, + ShellExecutor mainExecutor) { + if (!context.getResources().getBoolean(R.bool.config_enableShellDragDrop)) { + return null; + } + return new DragAndDropController(context, shellInit, shellController, displayController, + uiEventLogger, iconProvider, mainExecutor); + } + + DragAndDropController(Context context, ShellInit shellInit, ShellController shellController, DisplayController displayController, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java index eb4d2a16c522..bffc51c6b22f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java @@ -549,6 +549,14 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { // are in mOpening. for (int i = 0; i < closingTasks.size(); ++i) { final TransitionInfo.Change change = closingTasks.get(i); + final int pausingIdx = TaskState.indexOf(mPausingTasks, change); + if (pausingIdx >= 0) { + mPausingTasks.remove(pausingIdx); + didMergeThings = true; + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, + " closing pausing taskId=%d", change.getTaskInfo().taskId); + continue; + } int openingIdx = TaskState.indexOf(mOpeningTasks, change); if (openingIdx < 0) { Slog.w(TAG, "Closing a task that wasn't opening, this may be split or" @@ -601,6 +609,11 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { didMergeThings = true; mState = STATE_NEW_TASK; } + if (mPausingTasks.isEmpty()) { + // The pausing tasks may be removed by the incoming closing tasks. + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, + "[%d] RecentsController.merge: empty pausing tasks", mInstanceId); + } if (!hasTaskChange) { // Activity only transition, so consume the merge as it doesn't affect the rest of // recents. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 643245943916..af52350f5b48 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -165,7 +165,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, private final DisplayController mDisplayController; private final DisplayImeController mDisplayImeController; private final DisplayInsetsController mDisplayInsetsController; - private final DragAndDropController mDragAndDropController; + private final Optional<DragAndDropController> mDragAndDropController; private final Transitions mTransitions; private final TransactionPool mTransactionPool; private final IconProvider mIconProvider; @@ -191,7 +191,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, Transitions transitions, TransactionPool transactionPool, IconProvider iconProvider, @@ -253,7 +253,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, mDisplayController = displayController; mDisplayImeController = displayImeController; mDisplayInsetsController = displayInsetsController; - mDragAndDropController = dragAndDropController; + mDragAndDropController = Optional.of(dragAndDropController); mTransitions = transitions; mTransactionPool = transactionPool; mIconProvider = iconProvider; @@ -289,7 +289,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, // TODO: Multi-display mStageCoordinator = createStageCoordinator(); } - mDragAndDropController.setSplitScreenController(this); + mDragAndDropController.ifPresent(controller -> controller.setSplitScreenController(this)); } protected StageCoordinator createStageCoordinator() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java index 51b8000f14bb..a2af93fc42c6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java @@ -30,8 +30,6 @@ import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON import static com.android.wm.shell.splitscreen.SplitScreenController.exitReasonToString; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS; import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_DISMISS_SNAP; -import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE; -import static com.android.wm.shell.transition.Transitions.TRANSIT_SPLIT_SCREEN_PAIR_OPEN; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -165,7 +163,7 @@ class SplitScreenTransitions { t.setLayer(leash, Integer.MAX_VALUE); t.show(leash); } - boolean isOpening = isOpeningTransition(info); + boolean isOpening = TransitionUtil.isOpeningType(info.getType()); if (isOpening && (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT)) { // fade in startExampleAnimation(leash, true /* show */); @@ -295,14 +293,16 @@ class SplitScreenTransitions { @Nullable RemoteTransition remoteTransition, Transitions.TransitionHandler handler, @Nullable TransitionConsumedCallback consumedCallback, - @Nullable TransitionFinishedCallback finishedCallback) { + @Nullable TransitionFinishedCallback finishedCallback, + int extraTransitType) { if (mPendingEnter != null) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + " skip to start enter split transition since it already exist. "); return null; } final IBinder transition = mTransitions.startTransition(transitType, wct, handler); - setEnterTransition(transition, remoteTransition, consumedCallback, finishedCallback); + setEnterTransition(transition, remoteTransition, consumedCallback, finishedCallback, + extraTransitType); return transition; } @@ -310,9 +310,10 @@ class SplitScreenTransitions { void setEnterTransition(@NonNull IBinder transition, @Nullable RemoteTransition remoteTransition, @Nullable TransitionConsumedCallback consumedCallback, - @Nullable TransitionFinishedCallback finishedCallback) { + @Nullable TransitionFinishedCallback finishedCallback, + int extraTransitType) { mPendingEnter = new TransitSession( - transition, consumedCallback, finishedCallback, remoteTransition); + transition, consumedCallback, finishedCallback, remoteTransition, extraTransitType); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " splitTransition " + " deduced Enter split screen"); @@ -513,12 +514,6 @@ class SplitScreenTransitions { mTransitions.getAnimExecutor().execute(va::start); } - private boolean isOpeningTransition(TransitionInfo info) { - return TransitionUtil.isOpeningType(info.getType()) - || info.getType() == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE - || info.getType() == TRANSIT_SPLIT_SCREEN_PAIR_OPEN; - } - /** Calls when the transition got consumed. */ interface TransitionConsumedCallback { void onConsumed(boolean aborted); @@ -539,16 +534,19 @@ class SplitScreenTransitions { /** Whether the transition was canceled. */ boolean mCanceled; + /** A note for extra transit type, to help indicate custom transition. */ + final int mExtraTransitType; + TransitSession(IBinder transition, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback) { - this(transition, consumedCallback, finishedCallback, null /* remoteTransition */); + this(transition, consumedCallback, finishedCallback, null /* remoteTransition */, 0); } TransitSession(IBinder transition, @Nullable TransitionConsumedCallback consumedCallback, @Nullable TransitionFinishedCallback finishedCallback, - @Nullable RemoteTransition remoteTransition) { + @Nullable RemoteTransition remoteTransition, int extraTransitType) { mTransition = transition; mConsumedCallback = consumedCallback; mFinishedCallback = finishedCallback; @@ -560,6 +558,7 @@ class SplitScreenTransitions { mTransitions.getMainExecutor(), remoteTransition); mRemoteHandler.setTransition(transition); } + mExtraTransitType = extraTransitType; } /** Sets transition consumed callback. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 4c903f500651..0ef26fcff284 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -446,26 +446,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps, final IRemoteAnimationFinishedCallback finishedCallback) { - boolean openingToSide = false; - if (apps != null) { - for (int i = 0; i < apps.length; ++i) { - if (apps[i].mode == MODE_OPENING - && mSideStage.containsTask(apps[i].taskId)) { - openingToSide = true; - break; - } - } - } else if (mSideStage.getChildCount() != 0) { - // There are chances the entering app transition got canceled by performing - // rotation transition. Checks if there is any child task existed in split - // screen before fallback to cancel entering flow. - openingToSide = true; - } - - if (isEnteringSplit && !openingToSide) { + if (isEnteringSplit && mSideStage.getChildCount() == 0) { mMainExecutor.execute(() -> exitSplitScreen( - mSideStage.getChildCount() == 0 ? mMainStage : mSideStage, - EXIT_REASON_UNKNOWN)); + null /* childrenToTop */, EXIT_REASON_UNKNOWN)); + mSplitUnsupportedToast.show(); } if (finishedCallback != null) { @@ -526,17 +510,17 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.sendPendingIntent(intent, fillInIntent, options); // If split screen is not activated, we're expecting to open a pair of apps to split. - final int transitType = mMainStage.isActive() + final int extraTransitType = mMainStage.isActive() ? TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE : TRANSIT_SPLIT_SCREEN_PAIR_OPEN; prepareEnterSplitScreen(wct, null /* taskInfo */, position); - mSplitTransitions.startEnterTransition(transitType, wct, null, this, + mSplitTransitions.startEnterTransition(TRANSIT_TO_FRONT, wct, null, this, null /* consumedCallback */, (finishWct, finishT) -> { if (!evictWct.isEmpty()) { finishWct.merge(evictWct, true); } - } /* finishedCallback */); + } /* finishedCallback */, extraTransitType); } /** Launches an activity into split by legacy transition. */ @@ -550,26 +534,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps, IRemoteAnimationFinishedCallback finishedCallback, SurfaceControl.Transaction t) { - boolean openingToSide = false; - if (apps != null) { - for (int i = 0; i < apps.length; ++i) { - if (apps[i].mode == MODE_OPENING - && mSideStage.containsTask(apps[i].taskId)) { - openingToSide = true; - break; - } - } - } else if (mSideStage.getChildCount() != 0) { - // There are chances the entering app transition got canceled by performing - // rotation transition. Checks if there is any child task existed in split - // screen before fallback to cancel entering flow. - openingToSide = true; - } - - if (isEnteringSplit && !openingToSide && apps != null) { + if (isEnteringSplit && mSideStage.getChildCount() == 0) { mMainExecutor.execute(() -> exitSplitScreen( - mSideStage.getChildCount() == 0 ? mMainStage : mSideStage, - EXIT_REASON_UNKNOWN)); + null /* childrenToTop */, EXIT_REASON_UNKNOWN)); + mSplitUnsupportedToast.show(); } if (apps != null) { @@ -709,7 +677,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, wct.startTask(mainTaskId, mainOptions); mSplitTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, wct, remoteTransition, this, null, null); + TRANSIT_TO_FRONT, wct, remoteTransition, this, null, null, + TRANSIT_SPLIT_SCREEN_PAIR_OPEN); setEnterInstanceId(instanceId); } @@ -760,7 +729,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } mSplitTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, wct, remoteTransition, this, null, null); + TRANSIT_TO_FRONT, wct, remoteTransition, this, null, null, + TRANSIT_SPLIT_SCREEN_PAIR_OPEN); setEnterInstanceId(instanceId); } @@ -1088,7 +1058,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void onRemoteAnimationFinishedOrCancelled(WindowContainerTransaction evictWct) { mIsDividerRemoteAnimating = false; mShouldUpdateRecents = true; - mSplitRequest = null; + clearRequestIfPresented(); // If any stage has no child after animation finished, it means that split will display // nothing, such status will happen if task and intent is same app but not support // multi-instance, we should exit split and expand that app as full screen. @@ -1108,7 +1078,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private void onRemoteAnimationFinished(RemoteAnimationTarget[] apps) { mIsDividerRemoteAnimating = false; mShouldUpdateRecents = true; - mSplitRequest = null; + clearRequestIfPresented(); // If any stage has no child after finished animation, that side of the split will display // nothing. This might happen if starting the same app on the both sides while not // supporting multi-instance. Exit the split screen and expand that app to full screen. @@ -1381,6 +1351,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, }); mShouldUpdateRecents = false; mIsDividerRemoteAnimating = false; + mSplitRequest = null; mSplitLayout.getInvisibleBounds(mTempRect1); if (childrenToTop == null || childrenToTop.getTopVisibleChildTaskId() == INVALID_TASK_ID) { @@ -1473,6 +1444,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } + private void clearRequestIfPresented() { + if (mSideStageListener.mVisible && mSideStageListener.mHasChildren + && mMainStageListener.mVisible && mSideStageListener.mHasChildren) { + mSplitRequest = null; + } + } + /** * Returns whether the split pair in the recent tasks list should be broken. */ @@ -1851,6 +1829,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, true /* setReparentLeafTaskIfRelaunch */); setRootForceTranslucent(true, wct); } else { + clearRequestIfPresented(); wct.setReparentLeafTaskIfRelaunch(mRootTaskInfo.token, false /* setReparentLeafTaskIfRelaunch */); setRootForceTranslucent(false, wct); @@ -2010,7 +1989,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } if (mMainStageListener.mHasChildren && mSideStageListener.mHasChildren) { mShouldUpdateRecents = true; - mSplitRequest = null; + clearRequestIfPresented(); updateRecentTasksSplitPair(); if (!mLogger.hasStartedSession()) { @@ -2334,7 +2313,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, out = new WindowContainerTransaction(); prepareEnterSplitScreen(out); mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(), - null /* consumedCallback */, null /* finishedCallback */); + null /* consumedCallback */, null /* finishedCallback */, + 0 /* extraTransitType */); } } return out; @@ -2573,7 +2553,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } - if (info.getType() == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) { + if (mSplitTransitions.mPendingEnter.mExtraTransitType + == TRANSIT_SPLIT_SCREEN_OPEN_TO_SIDE) { if (mainChild == null && sideChild == null) { Log.w(TAG, "Launched a task in split, but didn't receive any task in transition."); mSplitTransitions.mPendingEnter.cancel(null /* finishedCb */); @@ -2716,6 +2697,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } }); mShouldUpdateRecents = false; + mSplitRequest = null; // Update local states. setSplitsVisible(false); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java index ead0bcd15c73..a841b7f96d3c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java @@ -220,20 +220,12 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { mCallbacks.onNoLongerSupportMultiWindow(); return; } - if (taskInfo.topActivity == null && mChildrenTaskInfo.contains(taskInfo.taskId) - && mChildrenTaskInfo.get(taskInfo.taskId).topActivity != null) { - // If top activity become null, it means the task is about to vanish, we use this - // signal to remove it from children list earlier for smooth dismiss transition. - mChildrenTaskInfo.remove(taskInfo.taskId); - mChildrenLeashes.remove(taskInfo.taskId); - } else { - mChildrenTaskInfo.put(taskInfo.taskId, taskInfo); - } + mChildrenTaskInfo.put(taskInfo.taskId, taskInfo); mCallbacks.onChildTaskStatusChanged(taskInfo.taskId, true /* present */, taskInfo.isVisible); - if (!ENABLE_SHELL_TRANSITIONS && mChildrenLeashes.contains(taskInfo.taskId)) { - updateChildTaskSurface(taskInfo, mChildrenLeashes.get(taskInfo.taskId), - false /* firstAppeared */); + if (!ENABLE_SHELL_TRANSITIONS) { + updateChildTaskSurface( + taskInfo, mChildrenLeashes.get(taskInfo.taskId), false /* firstAppeared */); } } else { throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo @@ -267,6 +259,9 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { return; } sendStatusChanged(); + } else { + throw new IllegalArgumentException(this + "\n Unknown task: " + taskInfo + + "\n mRootTaskInfo: " + mRootTaskInfo); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java index 46d2a5a11671..27d520d81c41 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/tv/TvSplitScreenController.java @@ -72,7 +72,7 @@ public class TvSplitScreenController extends SplitScreenController { DisplayController displayController, DisplayImeController displayImeController, DisplayInsetsController displayInsetsController, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, Transitions transitions, TransactionPool transactionPool, IconProvider iconProvider, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java index 7991c529aa49..2ab4c751d399 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java @@ -82,6 +82,10 @@ public class TaskViewTaskController implements ShellTaskOrganizer.TaskListener { mGuard.open("release"); } + SurfaceControl getSurfaceControl() { + return mSurfaceControl; + } + /** * Sets the provided {@link TaskViewBase}, which is used to notify the client part about the * task related changes and getting the current bounds. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTransitions.java index 81d69a4fa611..c7e534a2bcf5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTransitions.java @@ -336,6 +336,19 @@ public class TaskViewTransitions implements Transitions.TransitionHandler { tv.prepareOpenAnimation(taskIsNew, startTransaction, finishTransaction, chg.getTaskInfo(), chg.getLeash(), wct); changesHandled++; + } else if (chg.getMode() == TRANSIT_CHANGE) { + TaskViewTaskController tv = findTaskView(chg.getTaskInfo()); + if (tv == null) { + if (pending != null) { + Slog.w(TAG, "Found a non-TaskView task in a TaskView Transition. This " + + "shouldn't happen, so there may be a visual artifact: " + + chg.getTaskInfo().taskId); + } + continue; + } + startTransaction.reparent(chg.getLeash(), tv.getSurfaceControl()); + finishTransaction.reparent(chg.getLeash(), tv.getSurfaceControl()); + changesHandled++; } } if (stillNeedsMatchingLaunch) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Tracer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Tracer.java new file mode 100644 index 000000000000..9d7c39f1c90e --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Tracer.java @@ -0,0 +1,327 @@ +/* + * 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.wm.shell.transition; + +import static android.os.Build.IS_USER; + +import static com.android.wm.shell.WmShellTransitionTraceProto.MAGIC_NUMBER; +import static com.android.wm.shell.WmShellTransitionTraceProto.MAGIC_NUMBER_H; +import static com.android.wm.shell.WmShellTransitionTraceProto.MAGIC_NUMBER_L; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.os.SystemClock; +import android.os.Trace; +import android.util.Log; +import android.util.proto.ProtoOutputStream; + +import com.android.internal.util.TraceBuffer; +import com.android.wm.shell.sysui.ShellCommandHandler; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +/** + * Helper class to collect and dump transition traces. + */ +public class Tracer implements ShellCommandHandler.ShellCommandActionHandler { + private static final int ALWAYS_ON_TRACING_CAPACITY = 15 * 1024; // 15 KB + private static final int ACTIVE_TRACING_BUFFER_CAPACITY = 5000 * 1024; // 5 MB + + private static final long MAGIC_NUMBER_VALUE = ((long) MAGIC_NUMBER_H << 32) | MAGIC_NUMBER_L; + + static final String WINSCOPE_EXT = ".winscope"; + private static final String TRACE_FILE = + "/data/misc/wmtrace/shell_transition_trace" + WINSCOPE_EXT; + + private final Object mEnabledLock = new Object(); + private boolean mActiveTracingEnabled = false; + + private final TraceBuffer mTraceBuffer = new TraceBuffer(ALWAYS_ON_TRACING_CAPACITY, + (proto) -> handleOnEntryRemovedFromTrace(proto)); + private final Map<Object, Runnable> mRemovedFromTraceCallbacks = new HashMap<>(); + + private final Map<Transitions.TransitionHandler, Integer> mHandlerIds = new HashMap<>(); + private final Map<Transitions.TransitionHandler, Integer> mHandlerUseCountInTrace = + new HashMap<>(); + + /** + * Adds an entry in the trace to log that a transition has been dispatched to a handler. + * + * @param transitionId The id of the transition being dispatched. + * @param handler The handler the transition is being dispatched to. + */ + public void logDispatched(int transitionId, Transitions.TransitionHandler handler) { + final int handlerId; + if (mHandlerIds.containsKey(handler)) { + handlerId = mHandlerIds.get(handler); + } else { + handlerId = mHandlerIds.size(); + mHandlerIds.put(handler, handlerId); + } + + ProtoOutputStream outputStream = new ProtoOutputStream(); + final long protoToken = + outputStream.start(com.android.wm.shell.WmShellTransitionTraceProto.TRANSITIONS); + + outputStream.write(com.android.wm.shell.Transition.ID, transitionId); + outputStream.write(com.android.wm.shell.Transition.DISPATCH_TIME_NS, + SystemClock.elapsedRealtimeNanos()); + outputStream.write(com.android.wm.shell.Transition.HANDLER, handlerId); + + outputStream.end(protoToken); + + final int useCountAfterAdd = mHandlerUseCountInTrace.getOrDefault(handler, 0) + 1; + mHandlerUseCountInTrace.put(handler, useCountAfterAdd); + + mRemovedFromTraceCallbacks.put(outputStream, () -> { + final int useCountAfterRemove = mHandlerUseCountInTrace.get(handler) - 1; + mHandlerUseCountInTrace.put(handler, useCountAfterRemove); + }); + + mTraceBuffer.add(outputStream); + } + + /** + * Adds an entry in the trace to log that a request to merge a transition was made. + * + * @param mergeRequestedTransitionId The id of the transition we are requesting to be merged. + * @param playingTransitionId The id of the transition we was to merge the transition into. + */ + public void logMergeRequested(int mergeRequestedTransitionId, int playingTransitionId) { + ProtoOutputStream outputStream = new ProtoOutputStream(); + final long protoToken = + outputStream.start(com.android.wm.shell.WmShellTransitionTraceProto.TRANSITIONS); + + outputStream.write(com.android.wm.shell.Transition.ID, mergeRequestedTransitionId); + outputStream.write(com.android.wm.shell.Transition.MERGE_REQUEST_TIME_NS, + SystemClock.elapsedRealtimeNanos()); + outputStream.write(com.android.wm.shell.Transition.MERGED_INTO, playingTransitionId); + + outputStream.end(protoToken); + + mTraceBuffer.add(outputStream); + } + + /** + * Adds an entry in the trace to log that a transition was merged by the handler. + * + * @param mergedTransitionId The id of the transition that was merged. + * @param playingTransitionId The id of the transition the transition was merged into. + */ + public void logMerged(int mergedTransitionId, int playingTransitionId) { + ProtoOutputStream outputStream = new ProtoOutputStream(); + final long protoToken = + outputStream.start(com.android.wm.shell.WmShellTransitionTraceProto.TRANSITIONS); + + outputStream.write(com.android.wm.shell.Transition.ID, mergedTransitionId); + outputStream.write( + com.android.wm.shell.Transition.MERGE_TIME_NS, SystemClock.elapsedRealtimeNanos()); + outputStream.write(com.android.wm.shell.Transition.MERGED_INTO, playingTransitionId); + + outputStream.end(protoToken); + + mTraceBuffer.add(outputStream); + } + + /** + * Adds an entry in the trace to log that a transition was aborted. + * + * @param transitionId The id of the transition that was aborted. + */ + public void logAborted(int transitionId) { + ProtoOutputStream outputStream = new ProtoOutputStream(); + final long protoToken = + outputStream.start(com.android.wm.shell.WmShellTransitionTraceProto.TRANSITIONS); + + outputStream.write(com.android.wm.shell.Transition.ID, transitionId); + outputStream.write( + com.android.wm.shell.Transition.ABORT_TIME_NS, SystemClock.elapsedRealtimeNanos()); + + outputStream.end(protoToken); + + mTraceBuffer.add(outputStream); + } + + /** + * Starts collecting transitions for the trace. + * If called while a trace is already running, this will reset the trace. + */ + public void startTrace(@Nullable PrintWriter pw) { + if (IS_USER) { + LogAndPrintln.e(pw, "Tracing is not supported on user builds."); + return; + } + Trace.beginSection("Tracer#startTrace"); + LogAndPrintln.i(pw, "Starting shell transition trace."); + synchronized (mEnabledLock) { + mActiveTracingEnabled = true; + mTraceBuffer.resetBuffer(); + mTraceBuffer.setCapacity(ACTIVE_TRACING_BUFFER_CAPACITY); + } + Trace.endSection(); + } + + /** + * Stops collecting the transition trace and dump to trace to file. + * + * Dumps the trace to @link{TRACE_FILE}. + */ + public void stopTrace(@Nullable PrintWriter pw) { + stopTrace(pw, new File(TRACE_FILE)); + } + + /** + * Stops collecting the transition trace and dump to trace to file. + * @param outputFile The file to dump the transition trace to. + */ + public void stopTrace(@Nullable PrintWriter pw, File outputFile) { + if (IS_USER) { + LogAndPrintln.e(pw, "Tracing is not supported on user builds."); + return; + } + Trace.beginSection("Tracer#stopTrace"); + LogAndPrintln.i(pw, "Stopping shell transition trace."); + synchronized (mEnabledLock) { + mActiveTracingEnabled = false; + writeTraceToFileLocked(pw, outputFile); + mTraceBuffer.resetBuffer(); + mTraceBuffer.setCapacity(ALWAYS_ON_TRACING_CAPACITY); + } + Trace.endSection(); + } + + /** + * Being called while taking a bugreport so that tracing files can be included in the bugreport. + * + * @param pw Print writer + */ + public void saveForBugreport(@Nullable PrintWriter pw) { + if (IS_USER) { + LogAndPrintln.e(pw, "Tracing is not supported on user builds."); + return; + } + Trace.beginSection("TransitionTracer#saveForBugreport"); + synchronized (mEnabledLock) { + final File outputFile = new File(TRACE_FILE); + writeTraceToFileLocked(pw, outputFile); + } + Trace.endSection(); + } + + private void writeTraceToFileLocked(@Nullable PrintWriter pw, File file) { + Trace.beginSection("TransitionTracer#writeTraceToFileLocked"); + try { + ProtoOutputStream proto = new ProtoOutputStream(); + proto.write(MAGIC_NUMBER, MAGIC_NUMBER_VALUE); + writeHandlerMappingToProto(proto); + int pid = android.os.Process.myPid(); + LogAndPrintln.i(pw, "Writing file to " + file.getAbsolutePath() + + " from process " + pid); + mTraceBuffer.writeTraceToFile(file, proto); + } catch (IOException e) { + LogAndPrintln.e(pw, "Unable to write buffer to file", e); + } + Trace.endSection(); + } + + private void writeHandlerMappingToProto(ProtoOutputStream outputStream) { + for (Transitions.TransitionHandler handler : mHandlerUseCountInTrace.keySet()) { + final int count = mHandlerUseCountInTrace.get(handler); + if (count > 0) { + final long protoToken = outputStream.start( + com.android.wm.shell.WmShellTransitionTraceProto.HANDLER_MAPPINGS); + outputStream.write(com.android.wm.shell.HandlerMapping.ID, + mHandlerIds.get(handler)); + outputStream.write(com.android.wm.shell.HandlerMapping.NAME, + handler.getClass().getName()); + outputStream.end(protoToken); + } + } + } + + private void handleOnEntryRemovedFromTrace(Object proto) { + if (mRemovedFromTraceCallbacks.containsKey(proto)) { + mRemovedFromTraceCallbacks.get(proto).run(); + mRemovedFromTraceCallbacks.remove(proto); + } + } + + @Override + public boolean onShellCommand(String[] args, PrintWriter pw) { + switch (args[0]) { + case "start": { + startTrace(pw); + return true; + } + case "stop": { + stopTrace(pw); + return true; + } + case "save-for-bugreport": { + saveForBugreport(pw); + return true; + } + default: { + pw.println("Invalid command: " + args[0]); + printShellCommandHelp(pw, ""); + return false; + } + } + } + + @Override + public void printShellCommandHelp(PrintWriter pw, String prefix) { + pw.println(prefix + "start"); + pw.println(prefix + " Start tracing the transitions."); + pw.println(prefix + "stop"); + pw.println(prefix + " Stop tracing the transitions."); + pw.println(prefix + "save-for-bugreport"); + pw.println(prefix + " Flush in memory transition trace to file."); + } + + private static class LogAndPrintln { + private static final String LOG_TAG = "ShellTransitionTracer"; + + private static void i(@Nullable PrintWriter pw, String msg) { + Log.i(LOG_TAG, msg); + if (pw != null) { + pw.println(msg); + pw.flush(); + } + } + + private static void e(@Nullable PrintWriter pw, String msg) { + Log.e(LOG_TAG, msg); + if (pw != null) { + pw.println("ERROR: " + msg); + pw.flush(); + } + } + + private static void e(@Nullable PrintWriter pw, String msg, @NonNull Exception e) { + Log.e(LOG_TAG, msg, e); + if (pw != null) { + pw.println("ERROR: " + msg + " ::\n " + e); + pw.flush(); + } + } + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index a4057b1328f4..f79f1f7a27b1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -74,10 +74,12 @@ import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.common.annotations.ExternalThread; import com.android.wm.shell.protolog.ShellProtoLogGroup; +import com.android.wm.shell.sysui.ShellCommandHandler; import com.android.wm.shell.sysui.ShellController; import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.util.TransitionUtil; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; @@ -106,7 +108,8 @@ import java.util.Arrays; * track, it will be marked as SYNC. This means that all currently active tracks must be flushed * before the SYNC transition can play. */ -public class Transitions implements RemoteCallable<Transitions> { +public class Transitions implements RemoteCallable<Transitions>, + ShellCommandHandler.ShellCommandActionHandler { static final String TAG = "ShellTransitions"; /** Set to {@code true} to enable shell transitions. */ @@ -165,12 +168,15 @@ public class Transitions implements RemoteCallable<Transitions> { private final ShellController mShellController; private final ShellTransitionImpl mImpl = new ShellTransitionImpl(); private final SleepHandler mSleepHandler = new SleepHandler(); - + private final Tracer mTracer = new Tracer(); private boolean mIsRegistered = false; /** List of possible handlers. Ordered by specificity (eg. tapped back to front). */ private final ArrayList<TransitionHandler> mHandlers = new ArrayList<>(); + @Nullable + private final ShellCommandHandler mShellCommandHandler; + private final ArrayList<TransitionObserver> mObservers = new ArrayList<>(); /** List of {@link Runnable} instances to run when the last active transition has finished. */ @@ -246,8 +252,23 @@ public class Transitions implements RemoteCallable<Transitions> { @NonNull WindowOrganizer organizer, @NonNull TransactionPool pool, @NonNull DisplayController displayController, - @NonNull ShellExecutor mainExecutor, @NonNull Handler mainHandler, + @NonNull ShellExecutor mainExecutor, + @NonNull Handler mainHandler, @NonNull ShellExecutor animExecutor) { + this(context, shellInit, shellController, organizer, pool, displayController, mainExecutor, + mainHandler, animExecutor, null); + } + + public Transitions(@NonNull Context context, + @NonNull ShellInit shellInit, + @NonNull ShellController shellController, + @NonNull WindowOrganizer organizer, + @NonNull TransactionPool pool, + @NonNull DisplayController displayController, + @NonNull ShellExecutor mainExecutor, + @NonNull Handler mainHandler, + @NonNull ShellExecutor animExecutor, + @Nullable ShellCommandHandler shellCommandHandler) { mOrganizer = organizer; mContext = context; mMainExecutor = mainExecutor; @@ -263,6 +284,7 @@ public class Transitions implements RemoteCallable<Transitions> { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "addHandler: Default"); // Next lowest priority is remote transitions. mHandlers.add(mRemoteTransitionHandler); + mShellCommandHandler = shellCommandHandler; ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "addHandler: Remote"); shellInit.addInitCallback(this::onInit, this); } @@ -294,6 +316,10 @@ public class Transitions implements RemoteCallable<Transitions> { // Pre-load the instance. TransitionMetrics.getInstance(); } + + if (mShellCommandHandler != null) { + mShellCommandHandler.addCommandCallback("transitions", this, this); + } } public boolean isRegistered() { @@ -766,6 +792,7 @@ public class Transitions implements RemoteCallable<Transitions> { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition %s ready while" + " %s is still animating. Notify the animating transition" + " in case they can be merged", ready, playing); + mTracer.logMergeRequested(ready.mInfo.getDebugId(), playing.mInfo.getDebugId()); playing.mHandler.mergeAnimation(ready.mToken, ready.mInfo, ready.mStartT, playing.mToken, (wct, cb) -> onMerged(playing, ready)); } @@ -799,6 +826,7 @@ public class Transitions implements RemoteCallable<Transitions> { for (int i = 0; i < mObservers.size(); ++i) { mObservers.get(i).onTransitionMerged(merged.mToken, playing.mToken); } + mTracer.logMerged(merged.mInfo.getDebugId(), playing.mInfo.getDebugId()); // See if we should merge another transition. processReadyQueue(track); } @@ -825,6 +853,8 @@ public class Transitions implements RemoteCallable<Transitions> { // Otherwise give every other handler a chance active.mHandler = dispatchTransition(active.mToken, active.mInfo, active.mStartT, active.mFinishT, (wct, cb) -> onFinish(active, wct, cb), active.mHandler); + + mTracer.logDispatched(active.mInfo.getDebugId(), active.mHandler); } /** @@ -876,6 +906,8 @@ public class Transitions implements RemoteCallable<Transitions> { transition.mFinishT.apply(); transition.mAborted = true; + mTracer.logAborted(transition.mInfo.getDebugId()); + if (transition.mHandler != null) { // Notifies to clean-up the aborted transition. transition.mHandler.onTransitionConsumed( @@ -1350,4 +1382,26 @@ public class Transitions implements RemoteCallable<Transitions> { mMainExecutor.execute(() -> dispatchAnimScaleSetting(mTransitionAnimationScaleSetting)); } } + + + @Override + public boolean onShellCommand(String[] args, PrintWriter pw) { + switch (args[0]) { + case "tracing": { + mTracer.onShellCommand(Arrays.copyOfRange(args, 1, args.length), pw); + return true; + } + default: { + pw.println("Invalid command: " + args[0]); + printShellCommandHelp(pw, ""); + return false; + } + } + } + + @Override + public void printShellCommandHelp(PrintWriter pw, String prefix) { + pw.println(prefix + "tracing"); + mTracer.printShellCommandHelp(pw, prefix + " "); + } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java index 362d91ac5b5e..b1c3791ad15a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java @@ -74,14 +74,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin new WindowDecoration.RelayoutResult<>(); private final Point mPositionInParent = new Point(); - private final PointF mHandleMenuAppInfoPillPosition = new PointF(); - private final PointF mHandleMenuWindowingPillPosition = new PointF(); - private final PointF mHandleMenuMoreActionsPillPosition = new PointF(); - - // Collection of additional windows that comprise the handle menu. - private AdditionalWindow mHandleMenuAppInfoPill; - private AdditionalWindow mHandleMenuWindowingPill; - private AdditionalWindow mHandleMenuMoreActionsPill; private HandleMenu mHandleMenu; private ResizeVeil mResizeVeil; @@ -91,16 +83,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin private TaskCornersListener mCornersListener; - private int mMenuWidth; - private int mMarginMenuTop; - private int mMarginMenuStart; - private int mMarginMenuSpacing; - private int mAppInfoPillHeight; - private int mWindowingPillHeight; - private int mMoreActionsPillHeight; - private int mShadowRadius; - private int mMenuCornerRadius; - DesktopModeWindowDecoration( Context context, DisplayController displayController, 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/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java index a9f311f9e9eb..92cbf7f068b4 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java @@ -180,8 +180,9 @@ public class SplitTransitionTests extends ShellTestCase { TestRemoteTransition testRemote = new TestRemoteTransition(); IBinder transition = mSplitScreenTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), - new RemoteTransition(testRemote, "Test"), mStageCoordinator, null, null); + TRANSIT_OPEN, new WindowContainerTransaction(), + new RemoteTransition(testRemote, "Test"), mStageCoordinator, null, null, + TRANSIT_SPLIT_SCREEN_PAIR_OPEN); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); boolean accepted = mStageCoordinator.startAnimation(transition, info, @@ -397,7 +398,7 @@ public class SplitTransitionTests extends ShellTestCase { } private TransitionInfo createEnterPairInfo() { - return new TransitionInfoBuilder(TRANSIT_SPLIT_SCREEN_PAIR_OPEN, 0) + return new TransitionInfoBuilder(TRANSIT_OPEN, 0) .addChange(TRANSIT_OPEN, mMainChild) .addChange(TRANSIT_OPEN, mSideChild) .build(); @@ -406,9 +407,9 @@ public class SplitTransitionTests extends ShellTestCase { private void enterSplit() { TransitionInfo enterInfo = createEnterPairInfo(); IBinder enterTransit = mSplitScreenTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), + TRANSIT_OPEN, new WindowContainerTransaction(), new RemoteTransition(new TestRemoteTransition(), "Test"), - mStageCoordinator, null, null); + mStageCoordinator, null, null, TRANSIT_SPLIT_SCREEN_PAIR_OPEN); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); mStageCoordinator.startAnimation(enterTransit, enterInfo, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java index 784ad9b006b6..1a1bebd28aef 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java @@ -126,6 +126,12 @@ public final class StageTaskListenerTests extends ShellTestCase { verify(mCallbacks).onStatusChanged(eq(mRootTask.isVisible), eq(true)); } + @Test(expected = IllegalArgumentException.class) + public void testUnknownTaskVanished() { + final ActivityManager.RunningTaskInfo task = new TestRunningTaskInfoBuilder().build(); + mStageTaskListener.onTaskVanished(task); + } + @Test public void testTaskVanished() { // With shell transitions, the transition manages status changes, so skip this test. diff --git a/packages/SettingsLib/DeviceStateRotationLock/src/com.android.settingslib.devicestate/PosturesHelper.kt b/packages/SettingsLib/DeviceStateRotationLock/src/com.android.settingslib.devicestate/PosturesHelper.kt index 9c70be9c1f66..6a13eb8c3907 100644 --- a/packages/SettingsLib/DeviceStateRotationLock/src/com.android.settingslib.devicestate/PosturesHelper.kt +++ b/packages/SettingsLib/DeviceStateRotationLock/src/com.android.settingslib.devicestate/PosturesHelper.kt @@ -19,6 +19,7 @@ package com.android.settingslib.devicestate import android.content.Context import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_FOLDED import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_HALF_FOLDED +import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_UNFOLDED import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_UNKNOWN import android.provider.Settings.Secure.DeviceStateRotationLockKey @@ -33,6 +34,8 @@ class PosturesHelper(context: Context) { context.resources.getIntArray(R.array.config_halfFoldedDeviceStates) private val unfoldedDeviceStates = context.resources.getIntArray(R.array.config_openDeviceStates) + private val rearDisplayDeviceStates = + context.resources.getIntArray(R.array.config_rearDisplayDeviceStates) @DeviceStateRotationLockKey fun deviceStateToPosture(deviceState: Int): Int { @@ -40,6 +43,7 @@ class PosturesHelper(context: Context) { in foldedDeviceStates -> DEVICE_STATE_ROTATION_KEY_FOLDED in halfFoldedDeviceStates -> DEVICE_STATE_ROTATION_KEY_HALF_FOLDED in unfoldedDeviceStates -> DEVICE_STATE_ROTATION_KEY_UNFOLDED + in rearDisplayDeviceStates -> DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY else -> DEVICE_STATE_ROTATION_KEY_UNKNOWN } } @@ -49,6 +53,7 @@ class PosturesHelper(context: Context) { DEVICE_STATE_ROTATION_KEY_FOLDED -> foldedDeviceStates.firstOrNull() DEVICE_STATE_ROTATION_KEY_HALF_FOLDED -> halfFoldedDeviceStates.firstOrNull() DEVICE_STATE_ROTATION_KEY_UNFOLDED -> unfoldedDeviceStates.firstOrNull() + DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY -> rearDisplayDeviceStates.firstOrNull() else -> null } } diff --git a/packages/SettingsLib/MainSwitchPreference/res/drawable/settingslib_ic_info.xml b/packages/SettingsLib/MainSwitchPreference/res/drawable/settingslib_ic_info.xml deleted file mode 100644 index c8037c85c850..000000000000 --- a/packages/SettingsLib/MainSwitchPreference/res/drawable/settingslib_ic_info.xml +++ /dev/null @@ -1,26 +0,0 @@ -<!-- - Copyright (C) 2021 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<!-- copy from frameworks/base/core/res/res/drawable/ic_info.xml--> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/> -</vector>
\ No newline at end of file diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml index ca84db854bdd..b1c26e852cdc 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml @@ -46,16 +46,6 @@ android:textAppearance="?android:attr/textAppearanceListItem" style="@style/MainSwitchText.Settingslib" /> - <ImageView - android:id="@+id/restricted_icon" - android:layout_width="@dimen/settingslib_restricted_icon_size" - android:layout_height="@dimen/settingslib_restricted_icon_size" - android:tint="?android:attr/colorAccent" - android:layout_gravity="center_vertical" - android:layout_marginEnd="@dimen/settingslib_restricted_icon_margin_end" - android:src="@drawable/settingslib_ic_info" - android:visibility="gone" /> - <Switch android:id="@android:id/switch_widget" android:layout_width="wrap_content" diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml index 2c2ad92a7830..ab0cf3138d9c 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml @@ -49,16 +49,6 @@ android:lineBreakWordStyle="phrase" style="@style/MainSwitchText.Settingslib" /> - <ImageView - android:id="@+id/restricted_icon" - android:layout_width="@dimen/settingslib_restricted_icon_size" - android:layout_height="@dimen/settingslib_restricted_icon_size" - android:tint="@color/settingslib_accent_primary_variant" - android:layout_gravity="center_vertical" - android:layout_marginEnd="@dimen/settingslib_restricted_icon_margin_end" - android:src="@drawable/settingslib_ic_info" - android:visibility="gone" /> - <Switch android:id="@android:id/switch_widget" android:layout_width="wrap_content" diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml index b39d09f38b62..bf34db93298b 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml @@ -38,17 +38,6 @@ android:layout_marginStart="@dimen/settingslib_switchbar_subsettings_margin_start" android:textAlignment="viewStart"/> - <ImageView - android:id="@+id/restricted_icon" - android:layout_width="@dimen/settingslib_restricted_icon_size" - android:layout_height="@dimen/settingslib_restricted_icon_size" - android:tint="?android:attr/colorAccent" - android:theme="@android:style/Theme.Material" - android:layout_gravity="center_vertical" - android:layout_marginEnd="@dimen/settingslib_restricted_icon_margin_end" - android:src="@drawable/settingslib_ic_info" - android:visibility="gone"/> - <Switch android:id="@android:id/switch_widget" android:layout_width="wrap_content" diff --git a/packages/SettingsLib/MainSwitchPreference/res/values-v31/styles.xml b/packages/SettingsLib/MainSwitchPreference/res/values-v31/styles.xml index a50fc7cc0028..ad888e538ffe 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/values-v31/styles.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/values-v31/styles.xml @@ -17,9 +17,8 @@ <resources> - <style name="MainSwitchText.Settingslib" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"> + <style name="MainSwitchText.Settingslib" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse"> <item name="android:textSize">20sp</item> <item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item> - <item name="android:textColor">@android:color/black</item> </style> </resources> diff --git a/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml b/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml index 88b2c8728495..0d9ffff9c9e2 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml @@ -17,16 +17,9 @@ <resources> - <!-- Restricted icon size in switch bar --> - <dimen name="settingslib_restricted_icon_size">@android:dimen/config_restrictedIconSize</dimen> - - <!-- Restricted icon in switch bar --> - <dimen name="settingslib_restricted_icon_margin_end">16dp</dimen> - <!-- Size of title margin --> <dimen name="settingslib_switch_title_margin">24dp</dimen> - <!-- SwitchBar sub settings margin start / end --> + <!-- SwitchBar sub settings margin start --> <dimen name="settingslib_switchbar_subsettings_margin_start">56dp</dimen> - <dimen name="settingslib_switchbar_subsettings_margin_end">16dp</dimen> </resources> diff --git a/packages/SettingsLib/tests/integ/Android.bp b/packages/SettingsLib/tests/integ/Android.bp index d463170fae8c..ff3eeec4171f 100644 --- a/packages/SettingsLib/tests/integ/Android.bp +++ b/packages/SettingsLib/tests/integ/Android.bp @@ -30,7 +30,10 @@ android_test { certificate: "platform", - srcs: ["src/**/*.java"], + srcs: [ + "src/**/*.java", + "src/**/*.kt", + ], libs: [ "android.test.runner", diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/devicestate/PosturesHelperTest.kt b/packages/SettingsLib/tests/integ/src/com/android/settingslib/devicestate/PosturesHelperTest.kt new file mode 100644 index 000000000000..d91c2fa66ca8 --- /dev/null +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/devicestate/PosturesHelperTest.kt @@ -0,0 +1,108 @@ +/* + * 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.settingslib.devicestate + +import android.content.Context +import android.content.res.Resources +import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_FOLDED +import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_HALF_FOLDED +import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY +import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_UNFOLDED +import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_KEY_UNKNOWN +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.internal.R +import com.google.common.truth.Expect +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.`when` as whenever +import org.mockito.MockitoAnnotations + +private const val DEVICE_STATE_UNKNOWN = 0 +private const val DEVICE_STATE_CLOSED = 1 +private const val DEVICE_STATE_HALF_FOLDED = 2 +private const val DEVICE_STATE_OPEN = 3 +private const val DEVICE_STATE_REAR_DISPLAY = 4 + +@SmallTest +@RunWith(AndroidJUnit4::class) +class PosturesHelperTest { + + @get:Rule val expect: Expect = Expect.create() + + @Mock private lateinit var context: Context + + @Mock private lateinit var resources: Resources + + private lateinit var posturesHelper: PosturesHelper + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + + whenever(context.resources).thenReturn(resources) + whenever(resources.getIntArray(R.array.config_foldedDeviceStates)) + .thenReturn(intArrayOf(DEVICE_STATE_CLOSED)) + whenever(resources.getIntArray(R.array.config_halfFoldedDeviceStates)) + .thenReturn(intArrayOf(DEVICE_STATE_HALF_FOLDED)) + whenever(resources.getIntArray(R.array.config_openDeviceStates)) + .thenReturn(intArrayOf(DEVICE_STATE_OPEN)) + whenever(resources.getIntArray(R.array.config_rearDisplayDeviceStates)) + .thenReturn(intArrayOf(DEVICE_STATE_REAR_DISPLAY)) + + posturesHelper = PosturesHelper(context) + } + + @Test + fun deviceStateToPosture_mapsCorrectly() { + expect + .that(posturesHelper.deviceStateToPosture(DEVICE_STATE_CLOSED)) + .isEqualTo(DEVICE_STATE_ROTATION_KEY_FOLDED) + expect + .that(posturesHelper.deviceStateToPosture(DEVICE_STATE_HALF_FOLDED)) + .isEqualTo(DEVICE_STATE_ROTATION_KEY_HALF_FOLDED) + expect + .that(posturesHelper.deviceStateToPosture(DEVICE_STATE_OPEN)) + .isEqualTo(DEVICE_STATE_ROTATION_KEY_UNFOLDED) + expect + .that(posturesHelper.deviceStateToPosture(DEVICE_STATE_REAR_DISPLAY)) + .isEqualTo(DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY) + expect + .that(posturesHelper.deviceStateToPosture(DEVICE_STATE_UNKNOWN)) + .isEqualTo(DEVICE_STATE_ROTATION_KEY_UNKNOWN) + } + + @Test + fun postureToDeviceState_mapsCorrectly() { + expect + .that(posturesHelper.postureToDeviceState(DEVICE_STATE_ROTATION_KEY_FOLDED)) + .isEqualTo(DEVICE_STATE_CLOSED) + expect + .that(posturesHelper.postureToDeviceState(DEVICE_STATE_ROTATION_KEY_HALF_FOLDED)) + .isEqualTo(DEVICE_STATE_HALF_FOLDED) + expect + .that(posturesHelper.postureToDeviceState(DEVICE_STATE_ROTATION_KEY_UNFOLDED)) + .isEqualTo(DEVICE_STATE_OPEN) + expect + .that(posturesHelper.postureToDeviceState(DEVICE_STATE_ROTATION_KEY_REAR_DISPLAY)) + .isEqualTo(DEVICE_STATE_REAR_DISPLAY) + expect.that(posturesHelper.postureToDeviceState(DEVICE_STATE_ROTATION_KEY_UNKNOWN)).isNull() + } +} diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index e6bbf9759651..6a7b8cdfceec 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -158,6 +158,7 @@ android_library { "SystemUIAnimationLib", "SystemUICommon", "SystemUICustomizationLib", + "SystemUILogLib", "SystemUIPluginLib", "SystemUISharedLib", "SystemUI-statsd", diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 32d6b70f7f47..6e55000dfe8a 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -695,7 +695,9 @@ android:relinquishTaskIdentity="true" android:configChanges= "screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden" - android:visibleToInstantApps="true"/> + android:visibleToInstantApps="true" + android:exported="false" + android:permission="android.permission.MANAGE_MEDIA_PROJECTION"/> <!-- started from TvNotificationPanel --> <activity diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt index 3a19990f0627..941a925c9d10 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt @@ -33,8 +33,8 @@ import com.android.systemui.animation.GlyphCallback import com.android.systemui.animation.Interpolators import com.android.systemui.animation.TextAnimator import com.android.systemui.customization.R -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.DEBUG import java.io.PrintWriter import java.util.Calendar import java.util.Locale diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt index b0c02407873c..aa1bb3f640ee 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt @@ -23,6 +23,12 @@ import android.os.UserHandle import android.provider.Settings import android.util.Log import androidx.annotation.OpenForTesting +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel +import com.android.systemui.log.LogMessage +import com.android.systemui.log.LogMessageImpl +import com.android.systemui.log.MessageInitializer +import com.android.systemui.log.MessagePrinter import com.android.systemui.plugins.ClockController import com.android.systemui.plugins.ClockId import com.android.systemui.plugins.ClockMetadata @@ -32,12 +38,6 @@ import com.android.systemui.plugins.ClockSettings import com.android.systemui.plugins.PluginLifecycleManager import com.android.systemui.plugins.PluginListener import com.android.systemui.plugins.PluginManager -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.plugins.log.LogMessage -import com.android.systemui.plugins.log.LogMessageImpl -import com.android.systemui.plugins.log.MessageInitializer -import com.android.systemui.plugins.log.MessagePrinter import com.android.systemui.util.Assert import java.io.PrintWriter import java.util.concurrent.ConcurrentHashMap diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt index 2cc36008e4f8..6aa74fbf24e7 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt @@ -24,6 +24,7 @@ import android.view.View import android.widget.FrameLayout import androidx.annotation.VisibleForTesting import com.android.systemui.customization.R +import com.android.systemui.log.LogBuffer import com.android.systemui.plugins.ClockAnimations import com.android.systemui.plugins.ClockConfig import com.android.systemui.plugins.ClockController @@ -32,7 +33,6 @@ import com.android.systemui.plugins.ClockFaceConfig import com.android.systemui.plugins.ClockFaceController import com.android.systemui.plugins.ClockFaceEvents import com.android.systemui.plugins.ClockSettings -import com.android.systemui.plugins.log.LogBuffer import java.io.PrintWriter import java.util.Locale import java.util.TimeZone diff --git a/packages/SystemUI/log/.gitignore b/packages/SystemUI/log/.gitignore new file mode 100644 index 000000000000..f9a33dbbcc7e --- /dev/null +++ b/packages/SystemUI/log/.gitignore @@ -0,0 +1,9 @@ +.idea/ +.gradle/ +gradle/ +build/ +gradlew* +local.properties +*.iml +android.properties +buildSrc
\ No newline at end of file diff --git a/packages/SystemUI/log/Android.bp b/packages/SystemUI/log/Android.bp new file mode 100644 index 000000000000..627ac4b7c381 --- /dev/null +++ b/packages/SystemUI/log/Android.bp @@ -0,0 +1,38 @@ +// 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 { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_packages_SystemUI_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_packages_SystemUI_license"], +} + +android_library { + name: "SystemUILogLib", + srcs: [ + "src/**/*.java", + "src/**/*.kt", + ], + static_libs: [ + "androidx.core_core-ktx", + "androidx.annotation_annotation", + "error_prone_annotations", + "SystemUICommon", + ], + manifest: "AndroidManifest.xml", + kotlincflags: ["-Xjvm-default=all"], +} diff --git a/packages/SystemUI/log/AndroidManifest.xml b/packages/SystemUI/log/AndroidManifest.xml new file mode 100644 index 000000000000..4021e1a5f751 --- /dev/null +++ b/packages/SystemUI/log/AndroidManifest.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + 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. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.systemui.log"> + + +</manifest> diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/ConstantStringsLogger.kt b/packages/SystemUI/log/src/com/android/systemui/log/ConstantStringsLogger.kt index f95b1874da36..bc35095a3436 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/ConstantStringsLogger.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/ConstantStringsLogger.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.plugins.log +package com.android.systemui.log import com.google.errorprone.annotations.CompileTimeConstant diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/ConstantStringsLoggerImpl.kt b/packages/SystemUI/log/src/com/android/systemui/log/ConstantStringsLoggerImpl.kt index 91b39e6fcc13..6fc525369e8b 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/ConstantStringsLoggerImpl.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/ConstantStringsLoggerImpl.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.plugins.log +package com.android.systemui.log import com.google.errorprone.annotations.CompileTimeConstant diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogBuffer.kt b/packages/SystemUI/log/src/com/android/systemui/log/LogBuffer.kt index 0a7ccc525a73..af1a11f6597a 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogBuffer.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/LogBuffer.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.plugins.log +package com.android.systemui.log import android.os.Trace import android.util.Log diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogLevel.kt b/packages/SystemUI/log/src/com/android/systemui/log/LogLevel.kt index b036cf0be1d6..7d9647a13149 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogLevel.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/LogLevel.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.plugins.log +package com.android.systemui.log import android.util.Log diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogMessage.kt b/packages/SystemUI/log/src/com/android/systemui/log/LogMessage.kt index 9468681289bf..88c34f82a089 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogMessage.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/LogMessage.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.plugins.log +package com.android.systemui.log import java.io.PrintWriter import java.text.SimpleDateFormat diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogMessageImpl.kt b/packages/SystemUI/log/src/com/android/systemui/log/LogMessageImpl.kt index f2a6a91adcdf..5e10f783850f 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogMessageImpl.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/LogMessageImpl.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.plugins.log +package com.android.systemui.log /** Recyclable implementation of [LogMessage]. */ data class LogMessageImpl( diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogcatEchoTracker.kt b/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTracker.kt index cfe894f276a0..55f3a738e4f1 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogcatEchoTracker.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTracker.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.plugins.log +package com.android.systemui.log /** Keeps track of which [LogBuffer] messages should also appear in logcat. */ interface LogcatEchoTracker { diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogcatEchoTrackerDebug.kt b/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTrackerDebug.kt index 7a125ac14ea1..d0ad28f04670 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogcatEchoTrackerDebug.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTrackerDebug.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.plugins.log +package com.android.systemui.log import android.content.ContentResolver import android.database.ContentObserver diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogcatEchoTrackerProd.kt b/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTrackerProd.kt index 3c8bda4a44e0..56966773d1b0 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/log/LogcatEchoTrackerProd.kt +++ b/packages/SystemUI/log/src/com/android/systemui/log/LogcatEchoTrackerProd.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.plugins.log +package com.android.systemui.log /** Production version of [LogcatEchoTracker] that isn't configurable. */ class LogcatEchoTrackerProd : LogcatEchoTracker { diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java index e6b2c2f9c7ed..e839d9bc3c52 100644 --- a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java +++ b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -71,12 +71,11 @@ public final class DynamicColor { * The base constructor for DynamicColor. * * <p>Functional arguments allow overriding without risks that come with subclasses. _Strongly_ - * prefer using one of the static convenience constructors. This class is arguably too flexible - * to + * prefer using one of the static convenience constructors. This class is arguably too + * flexible to * ensure it can support any scenario. * - * <p>For example, the default behavior of adjust tone at max contrast to be at a 7.0 ratio - * with + * <p>For example, the default behavior of adjust tone at max contrast to be at a 7.0 ratio with * its background is principled and matches a11y guidance. That does not mean it's the desired * approach for _every_ design system, and every color pairing, always, in every case. * @@ -89,23 +88,23 @@ public final class DynamicColor { * lower and raise contrast are * made. * @param toneMinContrast given DynamicScheme, return tone in HCT/L* in L*a*b* this color - * should - * be at minimum contrast. See toneMinContrastDefault for the default - * behavior, and strongly + * should + * be at minimum contrast. See toneMinContrastDefault for the + * default behavior, and strongly * consider using it unless you have strong opinions on a11y. The * static constructors use it. * @param toneMaxContrast given DynamicScheme, return tone in HCT/L* in L*a*b* this color - * should - * be at maximum contrast. See toneMaxContrastDefault for the default - * behavior, and strongly + * should + * be at maximum contrast. See toneMaxContrastDefault for the + * default behavior, and strongly * consider using it unless you have strong opinions on a11y. The * static constructors use it. * @param toneDeltaConstraint given DynamicScheme, return a ToneDeltaConstraint instance that * describes a requirement that this DynamicColor must always have * some difference in tone/L* * from another DynamicColor.<br> - * Unlikely to be useful unless a design system has some distortions - * where colors that don't + * Unlikely to be useful unless a design system has some + * distortions where colors that don't * have a background/foreground relationship must have _some_ * difference in tone, yet, not * enough difference to create meaningful contrast. @@ -164,8 +163,8 @@ public final class DynamicColor { * <p>If the design system uses the same hex code on multiple backgrounds, define that in * multiple * DynamicColors so that the background is accurate for each one. If you define a DynamicColor - * with one background, and actually use it on another, DynamicColor can't guarantee contrast. - * For + * with one background, and actually use it on another, DynamicColor can't guarantee contrast + * . For * example, if you use a color on both black and white, increasing the contrast on one * necessarily * decreases contrast of the other. @@ -195,8 +194,8 @@ public final class DynamicColor { * for contrast, given a background, colors can adjust to * increase/decrease contrast. * @param toneDeltaConstraint Function that provides a ToneDeltaConstraint given DynamicScheme. - * Useful for ensuring lightness difference between colors that don't - * _require_ contrast or + * Useful for ensuring lightness difference between colors that + * don't _require_ contrast or * have a formal background/foreground relationship. */ public static DynamicColor fromArgb( @@ -212,17 +211,17 @@ public final class DynamicColor { * Create a DynamicColor. * * @param palette Function that provides a TonalPalette given DynamicScheme. A TonalPalette is - * defined by a hue and chroma, so this replaces the need to specify hue/chroma. - * By providing + * defined by a hue and chroma, so this replaces the need to specify + * hue/chroma. By providing * a tonal palette, when contrast adjustments are made, intended chroma can be * preserved. For * example, at T/L* 90, there is a significant limit to the amount of chroma. * There is no - * colorful red, a red that light is pink. By preserving the _intended_ chroma if - * lightness + * colorful red, a red that light is pink. By preserving the _intended_ chroma + * if lightness * lowers for contrast adjustments, the intended chroma is restored. - * @param tone Function that provides a tone given DynamicScheme. (useful for dark vs. light - * mode) + * @param tone Function that provides a tone given DynamicScheme. (useful for dark vs. + * light mode) */ public static DynamicColor fromPalette( Function<DynamicScheme, TonalPalette> palette, Function<DynamicScheme, Double> tone) { @@ -232,16 +231,16 @@ public final class DynamicColor { /** * Create a DynamicColor. * - * @param palette Function that provides a TonalPalette given DynamicScheme. A TonalPalette - * is + * @param palette Function that provides a TonalPalette given DynamicScheme. A + * TonalPalette is * defined by a hue and chroma, so this replaces the need to specify * hue/chroma. By providing - * a tonal palette, when contrast adjustments are made, intended chroma can be - * preserved. For - * example, at T/L* 90, there is a significant limit to the amount of chroma. - * There is no - * colorful red, a red that light is pink. By preserving the _intended_ chroma - * if lightness + * a tonal palette, when contrast adjustments are made, intended chroma can + * be preserved. For + * example, at T/L* 90, there is a significant limit to the amount of + * chroma. There is no + * colorful red, a red that light is pink. By preserving the _intended_ + * chroma if lightness * lowers for contrast adjustments, the intended chroma is restored. * @param tone Function that provides a tone given DynamicScheme. (useful for dark vs. * light mode) @@ -261,12 +260,12 @@ public final class DynamicColor { * * @param palette Function that provides a TonalPalette given DynamicScheme. A * TonalPalette is - * defined by a hue and chroma, so this replaces the need to specify - * hue/chroma. By providing + * defined by a hue and chroma, so this replaces the need to + * specify hue/chroma. By providing * a tonal palette, when contrast adjustments are made, intended * chroma can be preserved. For - * example, at T/L* 90, there is a significant limit to the amount of - * chroma. There is no + * example, at T/L* 90, there is a significant limit to the amount + * of chroma. There is no * colorful red, a red that light is pink. By preserving the * _intended_ chroma if lightness * lowers for contrast adjustments, the intended chroma is restored. @@ -277,8 +276,8 @@ public final class DynamicColor { * for contrast, given a background, colors can adjust to * increase/decrease contrast. * @param toneDeltaConstraint Function that provides a ToneDeltaConstraint given DynamicScheme. - * Useful for ensuring lightness difference between colors that don't - * _require_ contrast or + * Useful for ensuring lightness difference between colors that + * don't _require_ contrast or * have a formal background/foreground relationship. */ public static DynamicColor fromPalette( @@ -297,96 +296,6 @@ public final class DynamicColor { toneDeltaConstraint); } - /** Returns the ARGB (i.e. hex code) representation of the resolved color given scheme. */ - public int getArgb(DynamicScheme scheme) { - final int argb = getHct(scheme).toInt(); - if (opacity == null) { - return argb; - } - final double percentage = opacity.apply(scheme); - final int alpha = MathUtils.clampInt(0, 255, (int) Math.round(percentage * 255)); - return (argb & 0x00ffffff) | (alpha << 24); - } - - /** Returns the HCT representation of the resolved color given scheme. */ - public Hct getHct(DynamicScheme scheme) { - final Hct cachedAnswer = hctCache.get(scheme); - if (cachedAnswer != null) { - return cachedAnswer; - } - // This is crucial for aesthetics: we aren't simply the taking the standard color - // and changing its tone for contrast. Rather, we find the tone for contrast, then - // use the specified chroma from the palette to construct a new color. - // - // For example, this enables colors with standard tone of T90, which has limited chroma, to - // "recover" intended chroma as contrast increases. - final Hct answer = Hct.from(hue.apply(scheme), chroma.apply(scheme), getTone(scheme)); - // NOMUTANTS--trivial test with onerous dependency injection requirement. - if (hctCache.size() > 4) { - hctCache.clear(); - } - // NOMUTANTS--trivial test with onerous dependency injection requirement. - hctCache.put(scheme, answer); - return answer; - } - - /** Returns the tone in HCT, ranging from 0 to 100, of the resolved color given scheme. */ - public double getTone(DynamicScheme scheme) { - double answer = tone.apply(scheme); - - final boolean decreasingContrast = scheme.contrastLevel < 0.0; - if (scheme.contrastLevel != 0.0) { - final double startTone = tone.apply(scheme); - final double endTone = - decreasingContrast ? toneMinContrast.apply(scheme) : toneMaxContrast.apply( - scheme); - final double delta = (endTone - startTone) * Math.abs(scheme.contrastLevel); - answer = delta + startTone; - } - - final DynamicColor bgDynamicColor = background == null ? null : background.apply(scheme); - double minRatio = Contrast.RATIO_MIN; - double maxRatio = Contrast.RATIO_MAX; - if (bgDynamicColor != null) { - final boolean bgHasBg = - bgDynamicColor.background != null && bgDynamicColor.background.apply(scheme) - != null; - final double standardRatio = - Contrast.ratioOfTones(tone.apply(scheme), bgDynamicColor.tone.apply(scheme)); - if (decreasingContrast) { - final double minContrastRatio = - Contrast.ratioOfTones( - toneMinContrast.apply(scheme), - bgDynamicColor.toneMinContrast.apply(scheme)); - minRatio = bgHasBg ? minContrastRatio : 1.0; - maxRatio = standardRatio; - } else { - final double maxContrastRatio = - Contrast.ratioOfTones( - toneMaxContrast.apply(scheme), - bgDynamicColor.toneMaxContrast.apply(scheme)); - minRatio = bgHasBg ? min(maxContrastRatio, standardRatio) : 1.0; - maxRatio = bgHasBg ? max(maxContrastRatio, standardRatio) : 21.0; - } - } - - final double finalMinRatio = minRatio; - final double finalMaxRatio = maxRatio; - final double finalAnswer = answer; - answer = - calculateDynamicTone( - scheme, - this.tone, - (dynamicColor) -> dynamicColor.getTone(scheme), - (a, b) -> finalAnswer, - (s) -> bgDynamicColor, - toneDeltaConstraint, - (s) -> finalMinRatio, - (s) -> finalMaxRatio); - - return answer; - } - /** * The default algorithm for calculating the tone of a color at minimum contrast.<br> * If the original contrast ratio was >= 7.0, reach contrast 4.5.<br> @@ -475,8 +384,8 @@ public final class DynamicColor { * <p>It enforces important properties:<br> * #1. Desired contrast ratio is reached.<br> * As contrast increases from standard to max, the tones involved should always be at least the - * standard ratio. For example, if a button is T90, and button text is T0, and the button is T0 - * at + * standard ratio. For example, if a button is T90, and button text is T0, and the button is + * T0 at * max contrast, the button text cannot simply linearly interpolate from T0 to T100, or at some * point they'll both be at the same tone. * @@ -489,8 +398,7 @@ public final class DynamicColor { * * <p>#3. Ensure tone delta with another color.<br> * In design systems, there may be colors that don't have a pure background/foreground - * relationship, but, do require different tones for visual differentiation. - * ToneDeltaConstraint + * relationship, but, do require different tones for visual differentiation. ToneDeltaConstraint * models this requirement, and DynamicColor enforces it. */ public static double calculateDynamicTone( @@ -596,13 +504,16 @@ public final class DynamicColor { final boolean preferLighter = tonePrefersLightForeground(bgTone); if (preferLighter) { - // "Negligible difference" handles an edge case where the initial contrast ratio is high + // "Neglible difference" handles an edge case where the initial contrast ratio is high // (ex. 13.0), and the ratio passed to the function is that high ratio, and both the - // lighter and darker ratio fails to pass that ratio. + // lighter + // and darker ratio fails to pass that ratio. // // This was observed with Tonal Spot's On Primary Container turning black momentarily - // between high and max contrast in light mode. PC's standard tone was T90, OPC's was - // T10, it was light mode, and the contrast level was 0.6568521221032331. + // between + // high and max contrast in light mode. PC's standard tone was T90, OPC's was T10, it + // was + // light mode, and the contrast level was 0.6568521221032331. final boolean negligibleDifference = Math.abs(lighterRatio - darkerRatio) < 0.1 && lighterRatio < ratio && darkerRatio < ratio; @@ -634,13 +545,109 @@ public final class DynamicColor { * <p>T60 used as to create the smallest discontinuity possible when skipping down to T49 in * order * to ensure light foregrounds. + * + * <p>Since `tertiaryContainer` in dark monochrome scheme requires a tone of 60, it should + * not be + * adjusted. Therefore, 60 is excluded here. */ public static boolean tonePrefersLightForeground(double tone) { - return Math.round(tone) <= 60; + return Math.round(tone) < 60; } - /** Tones less than ~T50 always permit white at 4.5 contrast. */ + /** + * Tones less than ~T50 always permit white at 4.5 contrast. + */ public static boolean toneAllowsLightForeground(double tone) { return Math.round(tone) <= 49; } + + public int getArgb(DynamicScheme scheme) { + final int argb = getHct(scheme).toInt(); + if (opacity == null) { + return argb; + } + final double percentage = opacity.apply(scheme); + final int alpha = MathUtils.clampInt(0, 255, (int) Math.round(percentage * 255)); + return (argb & 0x00ffffff) | (alpha << 24); + } + + public Hct getHct(DynamicScheme scheme) { + final Hct cachedAnswer = hctCache.get(scheme); + if (cachedAnswer != null) { + return cachedAnswer; + } + // This is crucial for aesthetics: we aren't simply the taking the standard color + // and changing its tone for contrast. Rather, we find the tone for contrast, then + // use the specified chroma from the palette to construct a new color. + // + // For example, this enables colors with standard tone of T90, which has limited chroma, to + // "recover" intended chroma as contrast increases. + final Hct answer = Hct.from(hue.apply(scheme), chroma.apply(scheme), getTone(scheme)); + // NOMUTANTS--trivial test with onerous dependency injection requirement. + if (hctCache.size() > 4) { + hctCache.clear(); + } + // NOMUTANTS--trivial test with onerous dependency injection requirement. + hctCache.put(scheme, answer); + return answer; + } + + /** + * Returns the tone in HCT, ranging from 0 to 100, of the resolved color given scheme. + */ + public double getTone(DynamicScheme scheme) { + double answer = tone.apply(scheme); + + final boolean decreasingContrast = scheme.contrastLevel < 0.0; + if (scheme.contrastLevel != 0.0) { + final double startTone = tone.apply(scheme); + final double endTone = + decreasingContrast ? toneMinContrast.apply(scheme) : toneMaxContrast.apply( + scheme); + final double delta = (endTone - startTone) * Math.abs(scheme.contrastLevel); + answer = delta + startTone; + } + + final DynamicColor bgDynamicColor = background == null ? null : background.apply(scheme); + double minRatio = Contrast.RATIO_MIN; + double maxRatio = Contrast.RATIO_MAX; + if (bgDynamicColor != null) { + final boolean bgHasBg = + bgDynamicColor.background != null && bgDynamicColor.background.apply(scheme) + != null; + final double standardRatio = + Contrast.ratioOfTones(tone.apply(scheme), bgDynamicColor.tone.apply(scheme)); + if (decreasingContrast) { + final double minContrastRatio = + Contrast.ratioOfTones( + toneMinContrast.apply(scheme), + bgDynamicColor.toneMinContrast.apply(scheme)); + minRatio = bgHasBg ? minContrastRatio : 1.0; + maxRatio = standardRatio; + } else { + final double maxContrastRatio = + Contrast.ratioOfTones( + toneMaxContrast.apply(scheme), + bgDynamicColor.toneMaxContrast.apply(scheme)); + minRatio = bgHasBg ? min(maxContrastRatio, standardRatio) : 1.0; + maxRatio = bgHasBg ? max(maxContrastRatio, standardRatio) : 21.0; + } + } + + final double finalMinRatio = minRatio; + final double finalMaxRatio = maxRatio; + final double finalAnswer = answer; + answer = + calculateDynamicTone( + scheme, + this.tone, + (dynamicColor) -> dynamicColor.getTone(scheme), + (a, b) -> finalAnswer, + (s) -> bgDynamicColor, + toneDeltaConstraint, + (s) -> finalMinRatio, + (s) -> finalMaxRatio); + + return answer; + } } diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java index 5212e8ef1187..21218a2dc8e2 100644 --- a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java +++ b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/MaterialDynamicColors.java @@ -22,7 +22,7 @@ import com.android.systemui.monet.hct.ViewingConditions; import com.android.systemui.monet.scheme.DynamicScheme; import com.android.systemui.monet.scheme.Variant; -/** Named colors, otherwise known as tokens, or roles, in the Material Design system. */ +/** Named colors, otherwise known as tokens, or roles, in the Material Design system.*/ // Prevent lint for Function.apply not being available on Android before API level 14 (4.0.1). // "AndroidJdkLibsChecker" for Function, "NewApi" for Function.apply(). // A java_library Bazel rule with an Android constraint cannot skip these warnings without this @@ -33,341 +33,54 @@ public final class MaterialDynamicColors { private static final double CONTAINER_ACCENT_TONE_DELTA = 15.0; - private MaterialDynamicColors() { + public MaterialDynamicColors() { } - public static DynamicColor highestSurface(DynamicScheme s) { - return s.isDark ? surfaceBright : surfaceDim; - } - - public static final DynamicColor background = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 98.0); - - public static final DynamicColor onBackground = - DynamicColor.fromPalette( - (s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 10.0, (s) -> background); - - public static final DynamicColor surface = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 98.0); - - public static final DynamicColor surfaceInverse = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 30.0); - - public static final DynamicColor surfaceBright = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 24.0 : 98.0); - - public static final DynamicColor surfaceDim = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 87.0); - - public static final DynamicColor surfaceSub2 = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 4.0 : 100.0); - - public static final DynamicColor surfaceSub1 = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 96.0); - - public static final DynamicColor surfaceContainer = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 12.0 : 94.0); - - public static final DynamicColor surfaceAdd1 = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 17.0 : 92.0); - - public static final DynamicColor surfaceAdd2 = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 22.0 : 90.0); - - public static final DynamicColor onSurface = - DynamicColor.fromPalette( - (s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 10.0, - (s) -> highestSurface(s)); - - public static final DynamicColor onSurfaceInverse = - DynamicColor.fromPalette( - (s) -> s.neutralPalette, (s) -> s.isDark ? 20.0 : 95.0, (s) -> surfaceInverse); - - public static final DynamicColor surfaceVariant = - DynamicColor.fromPalette((s) -> s.neutralVariantPalette, (s) -> s.isDark ? 30.0 : 90.0); - - public static final DynamicColor onSurfaceVariant = - DynamicColor.fromPalette( - (s) -> s.neutralVariantPalette, (s) -> s.isDark ? 80.0 : 30.0, - (s) -> surfaceVariant); - - public static final DynamicColor outline = - DynamicColor.fromPalette( - (s) -> s.neutralVariantPalette, (s) -> 50.0, (s) -> highestSurface(s)); - - public static final DynamicColor outlineVariant = - DynamicColor.fromPalette( - (s) -> s.neutralVariantPalette, (s) -> s.isDark ? 30.0 : 80.0, - (s) -> highestSurface(s)); - - public static final DynamicColor primaryContainer = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, - (s) -> { - if (!isFidelity(s)) { - return s.isDark ? 30.0 : 90.0; - } - return performAlbers(s.sourceColorHct, s); - }, - (s) -> highestSurface(s)); - - public static final DynamicColor onPrimaryContainer = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, - (s) -> { - if (!isFidelity(s)) { - return s.isDark ? 90.0 : 10.0; - } - return DynamicColor.contrastingTone(primaryContainer.tone.apply(s), 4.5); - }, - (s) -> primaryContainer, - null); - - public static final DynamicColor primary = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, - (s) -> s.isDark ? 80.0 : 40.0, - (s) -> highestSurface(s), - (s) -> - new ToneDeltaConstraint( - CONTAINER_ACCENT_TONE_DELTA, - primaryContainer, - s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); - - public static final DynamicColor primaryInverse = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, (s) -> s.isDark ? 40.0 : 80.0, (s) -> surfaceInverse); - - public static final DynamicColor onPrimary = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, (s) -> s.isDark ? 20.0 : 100.0, (s) -> primary); - - public static final DynamicColor secondaryContainer = - DynamicColor.fromPalette( - (s) -> s.secondaryPalette, - (s) -> { - final double initialTone = s.isDark ? 30.0 : 90.0; - if (!isFidelity(s)) { - return initialTone; - } - double answer = - findDesiredChromaByTone( - s.secondaryPalette.getHue(), - s.secondaryPalette.getChroma(), - initialTone, - !s.isDark); - answer = performAlbers(s.secondaryPalette.getHct(answer), s); - return answer; - }, - (s) -> highestSurface(s)); - - public static final DynamicColor onSecondaryContainer = - DynamicColor.fromPalette( - (s) -> s.secondaryPalette, - (s) -> { - if (!isFidelity(s)) { - return s.isDark ? 90.0 : 10.0; - } - return DynamicColor.contrastingTone(secondaryContainer.tone.apply(s), 4.5); - }, - (s) -> secondaryContainer); - - public static final DynamicColor secondary = - DynamicColor.fromPalette( - (s) -> s.secondaryPalette, - (s) -> s.isDark ? 80.0 : 40.0, - (s) -> highestSurface(s), - (s) -> - new ToneDeltaConstraint( - CONTAINER_ACCENT_TONE_DELTA, - secondaryContainer, - s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); - - public static final DynamicColor onSecondary = - DynamicColor.fromPalette( - (s) -> s.secondaryPalette, (s) -> s.isDark ? 20.0 : 100.0, (s) -> secondary); - - public static final DynamicColor tertiaryContainer = - DynamicColor.fromPalette( - (s) -> s.tertiaryPalette, - (s) -> { - if (!isFidelity(s)) { - return s.isDark ? 30.0 : 90.0; - } - final double albersTone = - performAlbers(s.tertiaryPalette.getHct(s.sourceColorHct.getTone()), - s); - final Hct proposedHct = s.tertiaryPalette.getHct(albersTone); - return DislikeAnalyzer.fixIfDisliked(proposedHct).getTone(); - }, - (s) -> highestSurface(s)); - - public static final DynamicColor onTertiaryContainer = - DynamicColor.fromPalette( - (s) -> s.tertiaryPalette, - (s) -> { - if (!isFidelity(s)) { - return s.isDark ? 90.0 : 10.0; - } - return DynamicColor.contrastingTone(tertiaryContainer.tone.apply(s), 4.5); - }, - (s) -> tertiaryContainer); - - public static final DynamicColor tertiary = - DynamicColor.fromPalette( - (s) -> s.tertiaryPalette, - (s) -> s.isDark ? 80.0 : 40.0, - (s) -> highestSurface(s), - (s) -> - new ToneDeltaConstraint( - CONTAINER_ACCENT_TONE_DELTA, - tertiaryContainer, - s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); - - public static final DynamicColor onTertiary = - DynamicColor.fromPalette( - (s) -> s.tertiaryPalette, (s) -> s.isDark ? 20.0 : 100.0, (s) -> tertiary); - - public static final DynamicColor errorContainer = - DynamicColor.fromPalette( - (s) -> s.errorPalette, (s) -> s.isDark ? 30.0 : 90.0, (s) -> highestSurface(s)); - - public static final DynamicColor onErrorContainer = - DynamicColor.fromPalette( - (s) -> s.errorPalette, (s) -> s.isDark ? 90.0 : 10.0, (s) -> errorContainer); - - public static final DynamicColor error = - DynamicColor.fromPalette( - (s) -> s.errorPalette, - (s) -> s.isDark ? 80.0 : 40.0, - (s) -> highestSurface(s), - (s) -> - new ToneDeltaConstraint( - CONTAINER_ACCENT_TONE_DELTA, - errorContainer, - s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); - - public static final DynamicColor onError = - DynamicColor.fromPalette((s) -> s.errorPalette, (s) -> s.isDark ? 20.0 : 100.0, - (s) -> error); - - public static final DynamicColor primaryFixed = - DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> 90.0, - (s) -> highestSurface(s)); - - public static final DynamicColor primaryFixedDarker = - DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> 80.0, - (s) -> highestSurface(s)); - - public static final DynamicColor onPrimaryFixed = - DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> 10.0, - (s) -> primaryFixedDarker); - - public static final DynamicColor onPrimaryFixedVariant = - DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> 30.0, - (s) -> primaryFixedDarker); - - public static final DynamicColor secondaryFixed = - DynamicColor.fromPalette((s) -> s.secondaryPalette, (s) -> 90.0, - (s) -> highestSurface(s)); - - public static final DynamicColor secondaryFixedDarker = - DynamicColor.fromPalette((s) -> s.secondaryPalette, (s) -> 80.0, - (s) -> highestSurface(s)); - - public static final DynamicColor onSecondaryFixed = - DynamicColor.fromPalette((s) -> s.secondaryPalette, (s) -> 10.0, - (s) -> secondaryFixedDarker); - - public static final DynamicColor onSecondaryFixedVariant = - DynamicColor.fromPalette((s) -> s.secondaryPalette, (s) -> 30.0, - (s) -> secondaryFixedDarker); - - public static final DynamicColor tertiaryFixed = - DynamicColor.fromPalette((s) -> s.tertiaryPalette, (s) -> 90.0, - (s) -> highestSurface(s)); - - public static final DynamicColor tertiaryFixedDarker = - DynamicColor.fromPalette((s) -> s.tertiaryPalette, (s) -> 80.0, - (s) -> highestSurface(s)); - - public static final DynamicColor onTertiaryFixed = - DynamicColor.fromPalette((s) -> s.tertiaryPalette, (s) -> 10.0, - (s) -> tertiaryFixedDarker); - - public static final DynamicColor onTertiaryFixedVariant = - DynamicColor.fromPalette((s) -> s.tertiaryPalette, (s) -> 30.0, - (s) -> tertiaryFixedDarker); - /** * These colors were present in Android framework before Android U, and used by MDC controls. * They * should be avoided, if possible. It's unclear if they're used on multiple backgrounds, and if - * they are, they can't be adjusted for contrast.* For now, they will be set with no - * background, + * they are, they can't be adjusted for contrast.* For now, they will be set with no background, * and those won't adjust for contrast, avoiding issues. * - * <p>* For example, if the same color is on a white background _and_ black background, there's - * no + * <p>* For example, if the same color is on a white background _and_ black background, + * there's no * way to increase contrast with either without losing contrast with the other. */ // colorControlActivated documented as colorAccent in M3 & GM3. // colorAccent documented as colorSecondary in M3 and colorPrimary in GM3. // Android used Material's Container as Primary/Secondary/Tertiary at launch. // Therefore, this is a duplicated version of Primary Container. - public static final DynamicColor controlActivated = - DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> s.isDark ? 30.0 : 90.0, null); - - // colorControlNormal documented as textColorSecondary in M3 & GM3. - // In Material, textColorSecondary points to onSurfaceVariant in the non-disabled state, - // which is Neutral Variant T30/80 in light/dark. - public static final DynamicColor controlNormal = - DynamicColor.fromPalette((s) -> s.neutralVariantPalette, (s) -> s.isDark ? 80.0 : 30.0); - - // colorControlHighlight documented, in both M3 & GM3: - // Light mode: #1f000000 dark mode: #33ffffff. - // These are black and white with some alpha. - // 1F hex = 31 decimal; 31 / 255 = 12% alpha. - // 33 hex = 51 decimal; 51 / 255 = 20% alpha. - // DynamicColors do not support alpha currently, and _may_ not need it for this use case, - // depending on how MDC resolved alpha for the other cases. - // Returning black in dark mode, white in light mode. - public static final DynamicColor controlHighlight = - new DynamicColor( - s -> 0.0, - s -> 0.0, - s -> s.isDark ? 100.0 : 0.0, - s -> s.isDark ? 0.20 : 0.12, - null, - scheme -> - DynamicColor.toneMinContrastDefault( - (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null), - scheme -> - DynamicColor.toneMaxContrastDefault( - (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null), - null); + public static DynamicColor controlActivated() { + return DynamicColor.fromPalette((s) -> s.primaryPalette, (s) -> s.isDark ? 30.0 : 90.0, null); + } - // textColorPrimaryInverse documented, in both M3 & GM3, documented as N10/N90. - public static final DynamicColor textPrimaryInverse = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + // Compatibility Keys Colors for Android + public static DynamicColor primaryPaletteKeyColor() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, (s) -> s.primaryPalette.getKeyColor().getTone()); + } - // textColorSecondaryInverse and textColorTertiaryInverse both documented, in both M3 & GM3, as - // NV30/NV80 - public static final DynamicColor textSecondaryAndTertiaryInverse = - DynamicColor.fromPalette((s) -> s.neutralVariantPalette, (s) -> s.isDark ? 30.0 : 80.0); + public static DynamicColor secondaryPaletteKeyColor() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, (s) -> s.secondaryPalette.getKeyColor().getTone()); + } - // textColorPrimaryInverseDisableOnly documented, in both M3 & GM3, as N10/N90 - public static final DynamicColor textPrimaryInverseDisableOnly = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + public static DynamicColor tertiaryPaletteKeyColor() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, (s) -> s.tertiaryPalette.getKeyColor().getTone()); + } - // textColorSecondaryInverse and textColorTertiaryInverse in disabled state both documented, - // in both M3 & GM3, as N10/N90 - public static final DynamicColor textSecondaryAndTertiaryInverseDisabled = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + public static DynamicColor neutralPaletteKeyColor() { + return DynamicColor.fromPalette( + (s) -> s.neutralPalette, (s) -> s.neutralPalette.getKeyColor().getTone()); + } - // textColorHintInverse documented, in both M3 & GM3, as N10/N90 - public static final DynamicColor textHintInverse = - DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + public static DynamicColor neutralVariantPaletteKeyColor() { + return DynamicColor.fromPalette( + (s) -> s.neutralVariantPalette, + (s) -> s.neutralVariantPalette.getKeyColor().getTone()); + } private static ViewingConditions viewingConditionsForAlbers(DynamicScheme scheme) { return ViewingConditions.defaultWithBackgroundLstar(scheme.isDark ? 30.0 : 80.0); @@ -377,6 +90,10 @@ public final class MaterialDynamicColors { return scheme.variant == Variant.FIDELITY || scheme.variant == Variant.CONTENT; } + private static boolean isMonochrome(DynamicScheme scheme) { + return scheme.variant == Variant.MONOCHROME; + } + static double findDesiredChromaByTone( double hue, double chroma, double tone, boolean byDecreasingTone) { double answer = tone; @@ -416,34 +133,456 @@ public final class MaterialDynamicColors { } } - // Compatibility mappings for Android - public static final DynamicColor surfaceContainerLow = surfaceSub1; - public static final DynamicColor surfaceContainerLowest = surfaceSub2; - public static final DynamicColor surfaceContainerHigh = surfaceAdd1; - public static final DynamicColor surfaceContainerHighest = surfaceAdd2; - public static final DynamicColor primaryFixedDim = primaryFixedDarker; - public static final DynamicColor secondaryFixedDim = secondaryFixedDarker; - public static final DynamicColor tertiaryFixedDim = tertiaryFixedDarker; + public static DynamicColor highestSurface(DynamicScheme s) { + return s.isDark ? surfaceBright() : surfaceDim(); + } - // Compatibility Keys Colors for Android - public static final DynamicColor primaryPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.primaryPalette, (s) -> s.primaryPalette.getKeyColor().getTone()); - - public static final DynamicColor secondaryPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.secondaryPalette, (s) -> s.secondaryPalette.getKeyColor().getTone()); - - public static final DynamicColor tertiaryPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.tertiaryPalette, (s) -> s.tertiaryPalette.getKeyColor().getTone()); - - public static final DynamicColor neutralPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.neutralPalette, (s) -> s.neutralPalette.getKeyColor().getTone()); - - public static final DynamicColor neutralVariantPaletteKeyColor = - DynamicColor.fromPalette( - (s) -> s.neutralVariantPalette, - (s) -> s.neutralVariantPalette.getKeyColor().getTone()); + public static DynamicColor background() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 98.0); + } + + public static DynamicColor onBackground() { + return DynamicColor.fromPalette( + (s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 10.0, (s) -> background()); + } + + public static DynamicColor surface() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 98.0); + } + + public static DynamicColor inverseSurface() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 20.0); + } + + public static DynamicColor surfaceBright() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 24.0 : 98.0); + } + + public static DynamicColor surfaceDim() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 6.0 : 87.0); + } + + public static DynamicColor surfaceContainerLowest() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 4.0 : 100.0); + } + + public static DynamicColor surfaceContainerLow() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 96.0); + } + + public static DynamicColor surfaceContainer() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 12.0 : 94.0); + } + + public static DynamicColor surfaceContainerHigh() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 17.0 : 92.0); + } + + public static DynamicColor surfaceContainerHighest() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 22.0 : 90.0); + } + + public static DynamicColor onSurface() { + return DynamicColor.fromPalette( + (s) -> s.neutralPalette, (s) -> s.isDark ? 90.0 : 10.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor inverseOnSurface() { + return DynamicColor.fromPalette( + (s) -> s.neutralPalette, (s) -> s.isDark ? 20.0 : 95.0, (s) -> inverseSurface()); + } + + public static DynamicColor surfaceVariant() { + return DynamicColor.fromPalette((s) -> s.neutralVariantPalette, + (s) -> s.isDark ? 30.0 : 90.0); + } + + public static DynamicColor onSurfaceVariant() { + return DynamicColor.fromPalette( + (s) -> s.neutralVariantPalette, (s) -> s.isDark ? 80.0 : 30.0, + (s) -> surfaceVariant()); + } + + public static DynamicColor outline() { + return DynamicColor.fromPalette( + (s) -> s.neutralVariantPalette, (s) -> 50.0, MaterialDynamicColors::highestSurface); + } + + public static DynamicColor outlineVariant() { + return DynamicColor.fromPalette( + (s) -> s.neutralVariantPalette, (s) -> s.isDark ? 30.0 : 80.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor primaryContainer() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isFidelity(s)) { + return performAlbers(s.sourceColorHct, s); + } + if (isMonochrome(s)) { + return s.isDark ? 85.0 : 25.0; + } + return s.isDark ? 30.0 : 90.0; + }, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onPrimaryContainer() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isFidelity(s)) { + return DynamicColor.contrastingTone(primaryContainer().tone.apply(s), 4.5); + } + if (isMonochrome(s)) { + return s.isDark ? 0.0 : 100.0; + } + return s.isDark ? 90.0 : 10.0; + }, + (s) -> primaryContainer(), + null); + } + + public static DynamicColor primary() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 100.0 : 0.0; + } + return s.isDark ? 80.0 : 40.0; + }, + MaterialDynamicColors::highestSurface, + (s) -> + new ToneDeltaConstraint( + CONTAINER_ACCENT_TONE_DELTA, + primaryContainer(), + s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); + } + + public static DynamicColor inversePrimary() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, (s) -> s.isDark ? 40.0 : 80.0, (s) -> inverseSurface()); + } + + public static DynamicColor onPrimary() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 10.0 : 90.0; + } + return s.isDark ? 20.0 : 100.0; + }, + (s) -> primary()); + } + + public static DynamicColor secondaryContainer() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 30.0 : 85.0; + } + final double initialTone = s.isDark ? 30.0 : 90.0; + if (!isFidelity(s)) { + return initialTone; + } + double answer = + findDesiredChromaByTone( + s.secondaryPalette.getHue(), + s.secondaryPalette.getChroma(), + initialTone, + !s.isDark); + answer = performAlbers(s.secondaryPalette.getHct(answer), s); + return answer; + }, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onSecondaryContainer() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, + (s) -> { + if (!isFidelity(s)) { + return s.isDark ? 90.0 : 10.0; + } + return DynamicColor.contrastingTone(secondaryContainer().tone.apply(s), 4.5); + }, + (s) -> secondaryContainer()); + } + + public static DynamicColor secondary() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, + (s) -> s.isDark ? 80.0 : 40.0, + MaterialDynamicColors::highestSurface, + (s) -> + new ToneDeltaConstraint( + CONTAINER_ACCENT_TONE_DELTA, + secondaryContainer(), + s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); + } + + public static DynamicColor onSecondary() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 10.0 : 100.0; + } + return s.isDark ? 20.0 : 100.0; + }, + (s) -> secondary()); + } + + public static DynamicColor tertiaryContainer() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 60.0 : 49.0; + } + if (!isFidelity(s)) { + return s.isDark ? 30.0 : 90.0; + } + final double albersTone = + performAlbers(s.tertiaryPalette.getHct(s.sourceColorHct.getTone()), s); + final Hct proposedHct = s.tertiaryPalette.getHct(albersTone); + return DislikeAnalyzer.fixIfDisliked(proposedHct).getTone(); + }, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onTertiaryContainer() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 0.0 : 100.0; + } + if (!isFidelity(s)) { + return s.isDark ? 90.0 : 10.0; + } + return DynamicColor.contrastingTone(tertiaryContainer().tone.apply(s), 4.5); + }, + (s) -> tertiaryContainer()); + } + + public static DynamicColor tertiary() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 90.0 : 25.0; + } + return s.isDark ? 80.0 : 40.0; + }, + MaterialDynamicColors::highestSurface, + (s) -> + new ToneDeltaConstraint( + CONTAINER_ACCENT_TONE_DELTA, + tertiaryContainer(), + s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); + } + + public static DynamicColor onTertiary() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 10.0 : 90.0; + } + return s.isDark ? 20.0 : 100.0; + }, + (s) -> tertiary()); + } + + public static DynamicColor errorContainer() { + return DynamicColor.fromPalette( + (s) -> s.errorPalette, (s) -> s.isDark ? 30.0 : 90.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onErrorContainer() { + return DynamicColor.fromPalette( + (s) -> s.errorPalette, (s) -> s.isDark ? 90.0 : 10.0, (s) -> errorContainer()); + } + + public static DynamicColor error() { + return DynamicColor.fromPalette( + (s) -> s.errorPalette, + (s) -> s.isDark ? 80.0 : 40.0, + MaterialDynamicColors::highestSurface, + (s) -> + new ToneDeltaConstraint( + CONTAINER_ACCENT_TONE_DELTA, + errorContainer(), + s.isDark ? TonePolarity.DARKER : TonePolarity.LIGHTER)); + } + + public static DynamicColor onError() { + return DynamicColor.fromPalette( + (s) -> s.errorPalette, (s) -> s.isDark ? 20.0 : 100.0, (s) -> error()); + } + + public static DynamicColor primaryFixed() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 100.0 : 10.0; + } + return 90.0; + }, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor primaryFixedDim() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 90.0 : 20.0; + } + return 80.0; + }, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onPrimaryFixed() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 10.0 : 90.0; + } + return 10.0; + }, + (s) -> primaryFixedDim()); + } + + public static DynamicColor onPrimaryFixedVariant() { + return DynamicColor.fromPalette( + (s) -> s.primaryPalette, + (s) -> { + if (isMonochrome(s)) { + return s.isDark ? 30.0 : 70.0; + } + return 30.0; + }, + (s) -> primaryFixedDim()); + } + + public static DynamicColor secondaryFixed() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, (s) -> isMonochrome(s) ? 80.0 : 90.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor secondaryFixedDim() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, (s) -> isMonochrome(s) ? 70.0 : 80.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onSecondaryFixed() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, (s) -> 10.0, (s) -> secondaryFixedDim()); + } + + public static DynamicColor onSecondaryFixedVariant() { + return DynamicColor.fromPalette( + (s) -> s.secondaryPalette, + (s) -> isMonochrome(s) ? 25.0 : 30.0, + (s) -> secondaryFixedDim()); + } + + public static DynamicColor tertiaryFixed() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, (s) -> isMonochrome(s) ? 40.0 : 90.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor tertiaryFixedDim() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, (s) -> isMonochrome(s) ? 30.0 : 80.0, + MaterialDynamicColors::highestSurface); + } + + public static DynamicColor onTertiaryFixed() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, (s) -> isMonochrome(s) ? 90.0 : 10.0, + (s) -> tertiaryFixedDim()); + } + + public static DynamicColor onTertiaryFixedVariant() { + return DynamicColor.fromPalette( + (s) -> s.tertiaryPalette, (s) -> isMonochrome(s) ? 70.0 : 30.0, + (s) -> tertiaryFixedDim()); + } + + // colorControlNormal documented as textColorSecondary in M3 & GM3. + // In Material, textColorSecondary points to onSurfaceVariant in the non-disabled state, + // which is Neutral Variant T30/80 in light/dark. + public static DynamicColor controlNormal() { + return DynamicColor.fromPalette((s) -> s.neutralVariantPalette, + (s) -> s.isDark ? 80.0 : 30.0); + } + + // colorControlHighlight documented, in both M3 & GM3: + // Light mode: #1f000000 dark mode: #33ffffff. + // These are black and white with some alpha. + // 1F hex = 31 decimal; 31 / 255 = 12% alpha. + // 33 hex = 51 decimal; 51 / 255 = 20% alpha. + // DynamicColors do not support alpha currently, and _may_ not need it for this use case, + // depending on how MDC resolved alpha for the other cases. + // Returning black in dark mode, white in light mode. + public static DynamicColor controlHighlight() { + return new DynamicColor( + s -> 0.0, + s -> 0.0, + s -> s.isDark ? 100.0 : 0.0, + s -> s.isDark ? 0.20 : 0.12, + null, + scheme -> + + DynamicColor.toneMinContrastDefault((s) -> s.isDark ? 100.0 : 0.0, null, + scheme, null), + scheme -> + DynamicColor.toneMaxContrastDefault((s) -> s.isDark ? 100.0 : 0.0, null, + scheme, null), + null); + } + + // textColorPrimaryInverse documented, in both M3 & GM3, documented as N10/N90. + public static DynamicColor textPrimaryInverse() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + } + + // textColorSecondaryInverse and textColorTertiaryInverse both documented, in both M3 & GM3, as + // NV30/NV80 + public static DynamicColor textSecondaryAndTertiaryInverse() { + return DynamicColor.fromPalette((s) -> s.neutralVariantPalette, + (s) -> s.isDark ? 30.0 : 80.0); + } + + // textColorPrimaryInverseDisableOnly documented, in both M3 & GM3, as N10/N90 + public static DynamicColor textPrimaryInverseDisableOnly() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + } + + // textColorSecondaryInverse and textColorTertiaryInverse in disabled state both documented, + // in both M3 & GM3, as N10/N90 + public static DynamicColor textSecondaryAndTertiaryInverseDisabled() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + } + + // textColorHintInverse documented, in both M3 & GM3, as N10/N90 + public static DynamicColor textHintInverse() { + return DynamicColor.fromPalette((s) -> s.neutralPalette, (s) -> s.isDark ? 10.0 : 90.0); + } } diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeTonalSpot.java b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeTonalSpot.java index 8480684043dc..cc6b492dadc9 100644 --- a/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeTonalSpot.java +++ b/packages/SystemUI/monet/src/com/android/systemui/monet/scheme/SchemeTonalSpot.java @@ -32,7 +32,7 @@ public class SchemeTonalSpot extends DynamicScheme { TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 16.0), TonalPalette.fromHueAndChroma( MathUtils.sanitizeDegreesDouble(sourceColorHct.getHue() + 60.0), 24.0), - TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 4.0), + TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 6.0), TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 8.0)); } } diff --git a/packages/SystemUI/plugin/Android.bp b/packages/SystemUI/plugin/Android.bp index e306d4aac398..1008d37b6d2f 100644 --- a/packages/SystemUI/plugin/Android.bp +++ b/packages/SystemUI/plugin/Android.bp @@ -34,10 +34,10 @@ java_library { static_libs: [ "androidx.annotation_annotation", - "error_prone_annotations", "PluginCoreLib", "SystemUIAnimationLib", "SystemUICommon", + "SystemUILogLib", ], } diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt index ca3e710a4acb..7bf139e69f2e 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ClockProviderPlugin.kt @@ -18,8 +18,8 @@ import android.graphics.Rect import android.graphics.drawable.Drawable import android.view.View import com.android.internal.annotations.Keep +import com.android.systemui.log.LogBuffer import com.android.systemui.plugins.annotations.ProvidesInterface -import com.android.systemui.plugins.log.LogBuffer import java.io.PrintWriter import java.util.Locale import java.util.TimeZone 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/drawable/dream_overlay_assistant_attention_indicator.xml b/packages/SystemUI/res/drawable/dream_overlay_assistant_attention_indicator.xml index dad2cdf8ede1..54bdf18e3076 100644 --- a/packages/SystemUI/res/drawable/dream_overlay_assistant_attention_indicator.xml +++ b/packages/SystemUI/res/drawable/dream_overlay_assistant_attention_indicator.xml @@ -13,20 +13,30 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - -<vector - xmlns:android="http://schemas.android.com/apk/res/android" +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="56dp" android:height="24dp" android:viewportWidth="56" android:viewportHeight="24"> - <group> - <clip-path - android:pathData="M12 0H44C50.6274 0 56 5.37258 56 12C56 18.6274 50.6274 24 44 24H12C5.37258 24 0 18.6274 0 12C0 5.37258 5.37258 0 12 0Z" - /> + <path + android:pathData="M12,0L44,0A12,12 0,0 1,56 12L56,12A12,12 0,0 1,44 24L12,24A12,12 0,0 1,0 12L0,12A12,12 0,0 1,12 0z" + android:fillColor="#ffffff"/> + <group + android:scaleX="0.8" + android:scaleY="0.8" + android:translateY="2" + android:translateX="18"> <path - android:pathData="M0 0V24H56V0" - android:fillColor="#FFFFFF" - /> + android:pathData="M21.5,9C22.3284,9 23,8.3284 23,7.5C23,6.6716 22.3284,6 21.5,6C20.6716,6 20,6.6716 20,7.5C20,8.3284 20.6716,9 21.5,9Z" + android:fillColor="#000000"/> + <path + android:pathData="M17,14C18.6569,14 20,12.6569 20,11C20,9.3432 18.6569,8 17,8C15.3431,8 14,9.3432 14,11C14,12.6569 15.3431,14 17,14Z" + android:fillColor="#000000"/> + <path + android:pathData="M17,22C18.933,22 20.5,20.433 20.5,18.5C20.5,16.567 18.933,15 17,15C15.067,15 13.5,16.567 13.5,18.5C13.5,20.433 15.067,22 17,22Z" + android:fillColor="#000000"/> + <path + android:pathData="M7,14C10.3137,14 13,11.3137 13,8C13,4.6863 10.3137,2 7,2C3.6863,2 1,4.6863 1,8C1,11.3137 3.6863,14 7,14Z" + android:fillColor="#000000"/> </group> -</vector> +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/auth_credential_password_view.xml b/packages/SystemUI/res/layout/auth_credential_password_view.xml index 021ebe6e7bff..33f1b10b123b 100644 --- a/packages/SystemUI/res/layout/auth_credential_password_view.xml +++ b/packages/SystemUI/res/layout/auth_credential_password_view.xml @@ -23,40 +23,47 @@ android:orientation="vertical" android:theme="?app:attr/lockPinPasswordStyle"> - <RelativeLayout + <ScrollView android:id="@+id/auth_credential_header" - style="?headerStyle" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="wrap_content"> - <ImageView - android:id="@+id/icon" - style="?headerIconStyle" - android:layout_alignParentLeft="true" - android:layout_alignParentTop="true" - android:contentDescription="@null"/> - - <TextView - android:id="@+id/title" - style="?titleTextAppearance" - android:layout_below="@id/icon" + <RelativeLayout + style="?headerStyle" android:layout_width="match_parent" - android:layout_height="wrap_content"/> + android:layout_height="wrap_content"> - <TextView - android:id="@+id/subtitle" - style="?subTitleTextAppearance" - android:layout_below="@id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> + <ImageView + android:id="@+id/icon" + style="?headerIconStyle" + android:layout_alignParentLeft="true" + android:layout_alignParentTop="true" + android:contentDescription="@null" /> - <TextView - android:id="@+id/description" - style="?descriptionTextAppearance" - android:layout_below="@id/subtitle" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> - </RelativeLayout> + <TextView + android:id="@+id/title" + style="?titleTextAppearance" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/icon" /> + + <TextView + android:id="@+id/subtitle" + style="?subTitleTextAppearance" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/title" /> + + <TextView + android:id="@+id/description" + style="?descriptionTextAppearance" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/subtitle" /> + + </RelativeLayout> + + </ScrollView> <LinearLayout android:id="@+id/auth_credential_input" diff --git a/packages/SystemUI/res/layout/screen_share_dialog.xml b/packages/SystemUI/res/layout/screen_share_dialog.xml index 7dbe0598f3c8..0d86e0a40b6d 100644 --- a/packages/SystemUI/res/layout/screen_share_dialog.xml +++ b/packages/SystemUI/res/layout/screen_share_dialog.xml @@ -76,7 +76,7 @@ android:orientation="horizontal" android:layout_marginTop="@dimen/screenrecord_buttons_margin_top"> <TextView - android:id="@+id/button_cancel" + android:id="@android:id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" @@ -87,7 +87,7 @@ android:layout_height="match_parent" android:layout_weight="1"/> <TextView - android:id="@+id/button_start" + android:id="@android:id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" 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/shared/src/com/android/systemui/shared/condition/Monitor.java b/packages/SystemUI/shared/src/com/android/systemui/shared/condition/Monitor.java index 209d5e80e2d2..43df08df9f45 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/condition/Monitor.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/condition/Monitor.java @@ -32,8 +32,10 @@ import java.util.concurrent.Executor; import javax.inject.Inject; /** - * {@link Monitor} takes in a set of conditions, monitors whether all of them have - * been fulfilled, and informs any registered listeners. + * {@link Monitor} allows {@link Subscription}s to a set of conditions and monitors whether all of + * them have been fulfilled. + * <p> + * This class should be used as a singleton, to prevent duplicate monitoring of the same conditions. */ public class Monitor { private final String mTag = getClass().getSimpleName(); diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt index 8b87e2a538ca..4bf7be6df5be 100644 --- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt +++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt @@ -42,14 +42,14 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.lifecycle.repeatWhenAttached +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.DEBUG import com.android.systemui.log.dagger.KeyguardLargeClockLog import com.android.systemui.log.dagger.KeyguardSmallClockLog import com.android.systemui.plugins.ClockController import com.android.systemui.plugins.ClockFaceController import com.android.systemui.plugins.ClockTickRate import com.android.systemui.plugins.WeatherData -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG import com.android.systemui.shared.regionsampling.RegionSampler import com.android.systemui.statusbar.policy.BatteryController import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index a6c782d88e18..4629e8b19ae5 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -18,9 +18,9 @@ import androidx.annotation.VisibleForTesting; import com.android.keyguard.dagger.KeyguardStatusViewScope; import com.android.systemui.R; import com.android.systemui.animation.Interpolators; +import com.android.systemui.log.LogBuffer; +import com.android.systemui.log.LogLevel; import com.android.systemui.plugins.ClockController; -import com.android.systemui.plugins.log.LogBuffer; -import com.android.systemui.plugins.log.LogLevel; import java.io.PrintWriter; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java index a34c9fa5aced..50dac32d67d7 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java @@ -39,10 +39,10 @@ import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; +import com.android.systemui.log.LogBuffer; +import com.android.systemui.log.LogLevel; import com.android.systemui.log.dagger.KeyguardClockLog; import com.android.systemui.plugins.ClockController; -import com.android.systemui.plugins.log.LogBuffer; -import com.android.systemui.plugins.log.LogLevel; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.clocks.ClockRegistry; import com.android.systemui.shared.regionsampling.RegionSampler; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java index 651c9796140e..d8568ba56ebc 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java @@ -22,8 +22,8 @@ import android.util.Property; import android.view.View; import com.android.systemui.animation.Interpolators; -import com.android.systemui.plugins.log.LogBuffer; -import com.android.systemui.plugins.log.LogLevel; +import com.android.systemui.log.LogBuffer; +import com.android.systemui.log.LogLevel; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.PropertyAnimator; diff --git a/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java b/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java index 6740375c4329..2d0bf9cc2aba 100644 --- a/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java +++ b/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java @@ -27,9 +27,9 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; +import com.android.systemui.log.LogBuffer; import com.android.systemui.log.dagger.KeyguardClockLog; import com.android.systemui.plugins.PluginManager; -import com.android.systemui.plugins.log.LogBuffer; import com.android.systemui.shared.clocks.ClockRegistry; import com.android.systemui.shared.clocks.DefaultClockProvider; diff --git a/packages/SystemUI/src/com/android/keyguard/logging/BiometricMessageDeferralLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/BiometricMessageDeferralLogger.kt index 2bb75aa34c6a..e7295ef9052c 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/BiometricMessageDeferralLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/BiometricMessageDeferralLogger.kt @@ -17,9 +17,9 @@ package com.android.keyguard.logging import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.DEBUG import com.android.systemui.log.dagger.BiometricLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG import javax.inject.Inject /** Helper class for logging for [com.android.systemui.biometrics.FaceHelpMessageDeferral] */ diff --git a/packages/SystemUI/src/com/android/keyguard/logging/BiometricUnlockLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/BiometricUnlockLogger.kt index 20f90072161b..c00b2c612fa2 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/BiometricUnlockLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/BiometricUnlockLogger.kt @@ -18,11 +18,11 @@ package com.android.keyguard.logging import android.hardware.biometrics.BiometricSourceType import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogLevel.INFO import com.android.systemui.log.dagger.BiometricLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogLevel.INFO import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_DISMISS_BOUNCER import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_NONE import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_ONLY_WAKE diff --git a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardLogger.kt index 4d71a8952021..8b925b1bfb54 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardLogger.kt @@ -18,9 +18,9 @@ package com.android.keyguard.logging import com.android.systemui.biometrics.AuthRippleController import com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.log.dagger.KeyguardLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel import com.android.systemui.statusbar.KeyguardIndicationController import com.google.errorprone.annotations.CompileTimeConstant import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt index 16618064f249..90587546cc28 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardUpdateMonitorLogger.kt @@ -27,13 +27,13 @@ import com.android.keyguard.KeyguardListenModel import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.keyguard.TrustGrantFlags import com.android.systemui.log.dagger.KeyguardUpdateMonitorLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogLevel.ERROR -import com.android.systemui.plugins.log.LogLevel.INFO -import com.android.systemui.plugins.log.LogLevel.VERBOSE -import com.android.systemui.plugins.log.LogLevel.WARNING +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogLevel.ERROR +import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.LogLevel.VERBOSE +import com.android.systemui.log.LogLevel.WARNING import com.google.errorprone.annotations.CompileTimeConstant import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/keyguard/logging/TrustRepositoryLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/TrustRepositoryLogger.kt index 249b3fe97d81..daafea8b62c7 100644 --- a/packages/SystemUI/src/com/android/keyguard/logging/TrustRepositoryLogger.kt +++ b/packages/SystemUI/src/com/android/keyguard/logging/TrustRepositoryLogger.kt @@ -18,9 +18,9 @@ package com.android.keyguard.logging import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.shared.model.TrustModel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.log.dagger.KeyguardUpdateMonitorLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel import javax.inject.Inject /** Logging helper for trust repository. */ diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt index d0ac2968ae8e..55f6d072563b 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt @@ -37,7 +37,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.WakefulnessLifecycle -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogLevel import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.CircleReveal import com.android.systemui.statusbar.LiftReveal diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.kt index 3b50bbcd9251..935de0255c01 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.kt @@ -464,7 +464,12 @@ constructor( // Fade out the icon if we are animating an activity launch over the lockscreen and the // activity didn't request the UDFPS. if (isLaunchingActivity && !udfpsRequested) { - alpha = (alpha * (1.0f - activityLaunchProgress)).toInt() + val udfpsActivityLaunchAlphaMultiplier = + 1f - + (activityLaunchProgress * + (ActivityLaunchAnimator.TIMINGS.totalDuration / 83)) + .coerceIn(0f, 1f) + alpha = (alpha * udfpsActivityLaunchAlphaMultiplier).toInt() } // Fade out alpha when a dialog is shown diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsLogger.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsLogger.kt index 0d08b4307f12..39199d194cc9 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsLogger.kt @@ -16,12 +16,12 @@ package com.android.systemui.biometrics +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel +import com.android.systemui.log.LogLevel.ERROR +import com.android.systemui.log.LogLevel.VERBOSE +import com.android.systemui.log.LogLevel.WARNING import com.android.systemui.log.dagger.UdfpsLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.plugins.log.LogLevel.ERROR -import com.android.systemui.plugins.log.LogLevel.VERBOSE -import com.android.systemui.plugins.log.LogLevel.WARNING import com.google.errorprone.annotations.CompileTimeConstant import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt b/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt index 67d2f308d326..f0b9f670f1e0 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt @@ -17,6 +17,8 @@ package com.android.systemui.biometrics.dagger import com.android.settingslib.udfps.UdfpsUtils +import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository +import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepositoryImpl import com.android.systemui.biometrics.data.repository.PromptRepository import com.android.systemui.biometrics.data.repository.PromptRepositoryImpl import com.android.systemui.biometrics.domain.interactor.CredentialInteractor @@ -41,6 +43,11 @@ interface BiometricsModule { @Binds @SysUISingleton + fun fingerprintRepository(impl: FingerprintPropertyRepositoryImpl): + FingerprintPropertyRepository + + @Binds + @SysUISingleton fun providesCredentialInteractor(impl: CredentialInteractorImpl): CredentialInteractor @Binds diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FingerprintPropertyRepository.kt b/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FingerprintPropertyRepository.kt new file mode 100644 index 000000000000..33fb36c15c2d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/data/repository/FingerprintPropertyRepository.kt @@ -0,0 +1,142 @@ +/* + * 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.biometrics.data.repository + +import android.hardware.biometrics.SensorLocationInternal +import android.hardware.fingerprint.FingerprintManager +import android.hardware.fingerprint.FingerprintSensorPropertiesInternal +import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback +import com.android.systemui.biometrics.shared.model.FingerprintSensorType +import com.android.systemui.biometrics.shared.model.SensorStrength +import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging +import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.shareIn + +/** + * A repository for the global state of FingerprintProperty. + * + * There is never more than one instance of the FingerprintProperty at any given time. + */ +interface FingerprintPropertyRepository { + + /** + * If the repository is initialized or not. Other properties are defaults until this is true. + */ + val isInitialized: Flow<Boolean> + + /** The id of fingerprint sensor. */ + val sensorId: StateFlow<Int> + + /** The security strength of sensor (convenience, weak, strong). */ + val strength: StateFlow<SensorStrength> + + /** The types of fingerprint sensor (rear, ultrasonic, optical, etc.). */ + val sensorType: StateFlow<FingerprintSensorType> + + /** The primary sensor location relative to the default display. */ + val sensorLocation: StateFlow<SensorLocationInternal> + + // TODO(b/251476085): don't implement until we need it, but expose alternative locations as + // a map of display id -> location or similar. + /** The sensor location relative to each physical display. */ + // val sensorLocations<Map<String, SensorLocationInternal>> +} + +@SysUISingleton +class FingerprintPropertyRepositoryImpl +@Inject +constructor( + @Application private val applicationScope: CoroutineScope, + private val fingerprintManager: FingerprintManager +) : FingerprintPropertyRepository { + + override val isInitialized: Flow<Boolean> = + conflatedCallbackFlow { + val callback = + object : IFingerprintAuthenticatorsRegisteredCallback.Stub() { + override fun onAllAuthenticatorsRegistered( + sensors: List<FingerprintSensorPropertiesInternal> + ) { + if (sensors.isNotEmpty()) { + setProperties(sensors[0]) + trySendWithFailureLogging(true, TAG, "initialize properties") + } + } + } + fingerprintManager.addAuthenticatorsRegisteredCallback(callback) + trySendWithFailureLogging(false, TAG, "initial value defaulting to false") + awaitClose {} + } + .shareIn(scope = applicationScope, started = SharingStarted.Eagerly, replay = 1) + + private val _sensorId: MutableStateFlow<Int> = MutableStateFlow(-1) + override val sensorId: StateFlow<Int> = _sensorId.asStateFlow() + + private val _strength: MutableStateFlow<SensorStrength> = + MutableStateFlow(SensorStrength.CONVENIENCE) + override val strength = _strength.asStateFlow() + + private val _sensorType: MutableStateFlow<FingerprintSensorType> = + MutableStateFlow(FingerprintSensorType.UNKNOWN) + override val sensorType = _sensorType.asStateFlow() + + private val _sensorLocation: MutableStateFlow<SensorLocationInternal> = + MutableStateFlow(SensorLocationInternal.DEFAULT) + override val sensorLocation = _sensorLocation.asStateFlow() + + private fun setProperties(prop: FingerprintSensorPropertiesInternal) { + _sensorId.value = prop.sensorId + _strength.value = sensorStrengthIntToObject(prop.sensorStrength) + _sensorType.value = sensorTypeIntToObject(prop.sensorType) + _sensorLocation.value = prop.location + } + + companion object { + private const val TAG = "FingerprintPropertyRepositoryImpl" + } +} + +private fun sensorStrengthIntToObject(value: Int): SensorStrength { + return when (value) { + 0 -> SensorStrength.CONVENIENCE + 1 -> SensorStrength.WEAK + 2 -> SensorStrength.STRONG + else -> throw IllegalArgumentException("Invalid SensorStrength value: $value") + } +} + +private fun sensorTypeIntToObject(value: Int): FingerprintSensorType { + return when (value) { + 0 -> FingerprintSensorType.UNKNOWN + 1 -> FingerprintSensorType.REAR + 2 -> FingerprintSensorType.UDFPS_ULTRASONIC + 3 -> FingerprintSensorType.UDFPS_OPTICAL + 4 -> FingerprintSensorType.POWER_BUTTON + 5 -> FingerprintSensorType.HOME_BUTTON + else -> throw IllegalArgumentException("Invalid SensorType value: $value") + } +} diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/FingerprintSensorType.kt b/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/FingerprintSensorType.kt new file mode 100644 index 000000000000..df5cefdb876d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/FingerprintSensorType.kt @@ -0,0 +1,29 @@ +/* + * 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.biometrics.shared.model + +import android.hardware.fingerprint.FingerprintSensorProperties + +/** Fingerprint sensor types. Represents [FingerprintSensorProperties.SensorType]. */ +enum class FingerprintSensorType { + UNKNOWN, + REAR, + UDFPS_ULTRASONIC, + UDFPS_OPTICAL, + POWER_BUTTON, + HOME_BUTTON, +} diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/SensorStrength.kt b/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/SensorStrength.kt new file mode 100644 index 000000000000..2982d0be3764 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/shared/model/SensorStrength.kt @@ -0,0 +1,26 @@ +/* + * 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.biometrics.shared.model + +import android.hardware.biometrics.SensorProperties + +/** Fingerprint sensor security strength. Represents [SensorProperties.Strength]. */ +enum class SensorStrength { + CONVENIENCE, + WEAK, + STRONG, +} diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt index bcc0575651e4..ede62acb3255 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt @@ -65,7 +65,7 @@ class CredentialPasswordView(context: Context, attrs: AttributeSet?) : super.onLayout(changed, left, top, right, bottom) val inputLeftBound: Int - val inputTopBound: Int + var inputTopBound: Int var headerRightBound = right var headerTopBounds = top val subTitleBottom: Int = if (subtitleView.isGone) titleView.bottom else subtitleView.bottom @@ -75,14 +75,23 @@ class CredentialPasswordView(context: Context, attrs: AttributeSet?) : inputLeftBound = (right - left) / 2 headerRightBound = inputLeftBound headerTopBounds -= iconView.bottom.coerceAtMost(bottomInset) + + if (descriptionView.bottom > bottomInset) { + credentialHeader.layout(left, headerTopBounds, headerRightBound, bottom) + } } else { inputTopBound = descBottom + (bottom - descBottom - credentialInput.height) / 2 inputLeftBound = (right - left - credentialInput.width) / 2 - } - if (descriptionView.bottom > bottomInset) { - credentialHeader.layout(left, headerTopBounds, headerRightBound, bottom) + if (bottom - inputTopBound < credentialInput.height) { + inputTopBound = bottom - credentialInput.height + } + + if (descriptionView.bottom > inputTopBound) { + credentialHeader.layout(left, headerTopBounds, headerRightBound, inputTopBound) + } } + credentialInput.layout(inputLeftBound, inputTopBound, right, bottom) } diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/BluetoothLogger.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/BluetoothLogger.kt index d99625a9fbf2..96af42bfda22 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/BluetoothLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/BluetoothLogger.kt @@ -17,9 +17,9 @@ package com.android.systemui.bluetooth import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.log.dagger.BluetoothLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel import javax.inject.Inject /** Helper class for logging bluetooth events. */ diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt b/packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt index d27708fc04d7..5b3a982ab5e2 100644 --- a/packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt @@ -20,11 +20,11 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogLevel.INFO -import com.android.systemui.plugins.log.LogMessage +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.LogMessage import com.android.systemui.log.dagger.BroadcastDispatcherLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/complication/ComplicationTypesUpdater.java b/packages/SystemUI/src/com/android/systemui/complication/ComplicationTypesUpdater.java index 016891df4b3b..a334c1ed2338 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/ComplicationTypesUpdater.java +++ b/packages/SystemUI/src/com/android/systemui/complication/ComplicationTypesUpdater.java @@ -16,8 +16,6 @@ package com.android.systemui.complication; -import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR; - import android.database.ContentObserver; import android.os.UserHandle; import android.provider.Settings; @@ -25,6 +23,7 @@ import android.provider.Settings; import com.android.settingslib.dream.DreamBackend; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.shared.condition.Monitor; import com.android.systemui.util.condition.ConditionalCoreStartable; @@ -33,7 +32,6 @@ import com.android.systemui.util.settings.SecureSettings; import java.util.concurrent.Executor; import javax.inject.Inject; -import javax.inject.Named; /** * {@link ComplicationTypesUpdater} observes the state of available complication types set by the @@ -53,7 +51,7 @@ public class ComplicationTypesUpdater extends ConditionalCoreStartable { @Main Executor executor, SecureSettings secureSettings, DreamOverlayStateController dreamOverlayStateController, - @Named(DREAM_PRETEXT_MONITOR) Monitor monitor) { + @SystemUser Monitor monitor) { super(monitor); mDreamBackend = dreamBackend; mExecutor = executor; diff --git a/packages/SystemUI/src/com/android/systemui/complication/DreamClockTimeComplication.java b/packages/SystemUI/src/com/android/systemui/complication/DreamClockTimeComplication.java index 5020480f8d60..9c3448b91b39 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/DreamClockTimeComplication.java +++ b/packages/SystemUI/src/com/android/systemui/complication/DreamClockTimeComplication.java @@ -18,11 +18,11 @@ package com.android.systemui.complication; import static com.android.systemui.complication.dagger.DreamClockTimeComplicationModule.DREAM_CLOCK_TIME_COMPLICATION_VIEW; import static com.android.systemui.complication.dagger.RegisteredComplicationsModule.DREAM_CLOCK_TIME_COMPLICATION_LAYOUT_PARAMS; -import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR; import android.view.View; import com.android.systemui.CoreStartable; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.shared.condition.Monitor; import com.android.systemui.util.condition.ConditionalCoreStartable; @@ -74,7 +74,7 @@ public class DreamClockTimeComplication implements Complication { public Registrant( DreamOverlayStateController dreamOverlayStateController, DreamClockTimeComplication dreamClockTimeComplication, - @Named(DREAM_PRETEXT_MONITOR) Monitor monitor) { + @SystemUser Monitor monitor) { super(monitor); mDreamOverlayStateController = dreamOverlayStateController; mComplication = dreamClockTimeComplication; diff --git a/packages/SystemUI/src/com/android/systemui/complication/DreamHomeControlsComplication.java b/packages/SystemUI/src/com/android/systemui/complication/DreamHomeControlsComplication.java index 8f192de8c4a5..f973aeef0e6b 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/DreamHomeControlsComplication.java +++ b/packages/SystemUI/src/com/android/systemui/complication/DreamHomeControlsComplication.java @@ -21,7 +21,6 @@ import static com.android.systemui.complication.dagger.RegisteredComplicationsMo import static com.android.systemui.controls.dagger.ControlsComponent.Visibility.AVAILABLE; import static com.android.systemui.controls.dagger.ControlsComponent.Visibility.AVAILABLE_AFTER_UNLOCK; import static com.android.systemui.controls.dagger.ControlsComponent.Visibility.UNAVAILABLE; -import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR; import android.content.Context; import android.content.Intent; @@ -40,6 +39,7 @@ import com.android.systemui.controls.dagger.ControlsComponent; import com.android.systemui.controls.management.ControlsListingController; import com.android.systemui.controls.ui.ControlsActivity; import com.android.systemui.controls.ui.ControlsUiController; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.shared.condition.Monitor; @@ -108,7 +108,7 @@ public class DreamHomeControlsComplication implements Complication { public Registrant(DreamHomeControlsComplication complication, DreamOverlayStateController dreamOverlayStateController, ControlsComponent controlsComponent, - @Named(DREAM_PRETEXT_MONITOR) Monitor monitor) { + @SystemUser Monitor monitor) { super(monitor); mComplication = complication; mControlsComponent = controlsComponent; diff --git a/packages/SystemUI/src/com/android/systemui/complication/SmartSpaceComplication.java b/packages/SystemUI/src/com/android/systemui/complication/SmartSpaceComplication.java index 2f5ef6da6912..b98794ef8026 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/SmartSpaceComplication.java +++ b/packages/SystemUI/src/com/android/systemui/complication/SmartSpaceComplication.java @@ -17,7 +17,6 @@ package com.android.systemui.complication; import static com.android.systemui.complication.dagger.RegisteredComplicationsModule.DREAM_SMARTSPACE_LAYOUT_PARAMS; -import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR; import android.content.Context; import android.os.Parcelable; @@ -26,6 +25,7 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.systemui.CoreStartable; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.dreams.smartspace.DreamSmartspaceController; import com.android.systemui.flags.FeatureFlags; @@ -88,7 +88,7 @@ public class SmartSpaceComplication implements Complication { DreamOverlayStateController dreamOverlayStateController, SmartSpaceComplication smartSpaceComplication, DreamSmartspaceController smartSpaceController, - @Named(DREAM_PRETEXT_MONITOR) Monitor monitor, + @SystemUser Monitor monitor, FeatureFlags featureFlags) { super(monitor); mDreamOverlayStateController = dreamOverlayStateController; 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/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index dff2c0e91f1f..8e6e0dd37a90 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -42,6 +42,7 @@ import com.android.systemui.clipboardoverlay.dagger.ClipboardOverlayModule; import com.android.systemui.complication.dagger.ComplicationComponent; import com.android.systemui.controls.dagger.ControlsModule; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.demomode.dagger.DemoModeModule; import com.android.systemui.doze.dagger.DozeComponent; import com.android.systemui.dreams.dagger.DreamModule; @@ -60,6 +61,7 @@ import com.android.systemui.people.PeopleModule; import com.android.systemui.plugins.BcSmartspaceConfigPlugin; import com.android.systemui.plugins.BcSmartspaceDataPlugin; import com.android.systemui.privacy.PrivacyModule; +import com.android.systemui.process.condition.SystemProcessCondition; import com.android.systemui.qrcodescanner.dagger.QRCodeScannerModule; import com.android.systemui.qs.FgsManagerController; import com.android.systemui.qs.FgsManagerControllerImpl; @@ -74,6 +76,7 @@ import com.android.systemui.shade.ShadeController; import com.android.systemui.shade.ShadeModule; import com.android.systemui.shade.transition.LargeScreenShadeInterpolator; import com.android.systemui.shade.transition.LargeScreenShadeInterpolatorImpl; +import com.android.systemui.shared.condition.Monitor; import com.android.systemui.smartspace.dagger.SmartspaceModule; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationLockscreenUserManager; @@ -126,6 +129,7 @@ import dagger.BindsOptionalOf; import dagger.Module; import dagger.Provides; +import java.util.Collections; import java.util.Optional; import java.util.concurrent.Executor; @@ -232,6 +236,17 @@ public abstract class SystemUIModule { return state; } + /** + * Provides the monitor for SystemUI that requires the process running as the system user. + */ + @SysUISingleton + @Provides + @SystemUser + static Monitor provideSystemUserMonitor(@Main Executor executor, + SystemProcessCondition systemProcessCondition) { + return new Monitor(executor, Collections.singleton(systemProcessCondition)); + } + @BindsOptionalOf abstract CommandQueue optionalCommandQueue(); diff --git a/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/SystemUser.kt b/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/SystemUser.kt new file mode 100644 index 000000000000..6878a52b672d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/SystemUser.kt @@ -0,0 +1,20 @@ +/* + * 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.dagger.qualifiers + +import javax.inject.Qualifier + +@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class SystemUser diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt b/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt index d19c6ec01109..536978009f71 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLogger.kt @@ -19,10 +19,10 @@ package com.android.systemui.doze import android.view.Display import com.android.systemui.doze.DozeLog.Reason import com.android.systemui.doze.DozeLog.reasonToString -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogLevel.ERROR -import com.android.systemui.plugins.log.LogLevel.INFO +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogLevel.ERROR +import com.android.systemui.log.LogLevel.INFO import com.android.systemui.log.dagger.DozeLog import com.android.systemui.statusbar.policy.DevicePostureController import com.google.errorprone.annotations.CompileTimeConstant diff --git a/packages/SystemUI/src/com/android/systemui/dreams/AssistantAttentionMonitor.java b/packages/SystemUI/src/com/android/systemui/dreams/AssistantAttentionMonitor.java index 49d7f7810740..822cfb89e706 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/AssistantAttentionMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/AssistantAttentionMonitor.java @@ -19,6 +19,7 @@ package com.android.systemui.dreams; import android.util.Log; import com.android.systemui.CoreStartable; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.dreams.callbacks.AssistantAttentionCallback; import com.android.systemui.dreams.conditions.AssistantAttentionCondition; import com.android.systemui.shared.condition.Monitor; @@ -38,7 +39,7 @@ public class AssistantAttentionMonitor implements CoreStartable { @Inject public AssistantAttentionMonitor( - Monitor monitor, + @SystemUser Monitor monitor, AssistantAttentionCondition assistantAttentionCondition, AssistantAttentionCallback callback) { mConditionMonitor = monitor; diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamLogger.kt b/packages/SystemUI/src/com/android/systemui/dreams/DreamLogger.kt index eb7929095a4b..fdb765130157 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamLogger.kt @@ -16,9 +16,9 @@ package com.android.systemui.dreams +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.log.dagger.DreamLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel import javax.inject.Inject /** Logs dream-related stuff to a {@link LogBuffer}. */ diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamMonitor.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamMonitor.java index 7f567aa334a6..e9ebd3b9c91d 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamMonitor.java @@ -16,11 +16,10 @@ package com.android.systemui.dreams; -import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR; - import android.util.Log; import com.android.systemui.CoreStartable; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.dreams.callbacks.DreamStatusBarStateCallback; import com.android.systemui.dreams.conditions.DreamCondition; import com.android.systemui.flags.RestartDozeListener; @@ -28,7 +27,6 @@ import com.android.systemui.shared.condition.Monitor; import com.android.systemui.util.condition.ConditionalCoreStartable; import javax.inject.Inject; -import javax.inject.Named; /** * A {@link CoreStartable} to retain a monitor for tracking dreaming. @@ -42,13 +40,11 @@ public class DreamMonitor extends ConditionalCoreStartable { private final DreamStatusBarStateCallback mCallback; private RestartDozeListener mRestartDozeListener; - @Inject - public DreamMonitor(Monitor monitor, DreamCondition dreamCondition, - @Named(DREAM_PRETEXT_MONITOR) Monitor pretextMonitor, + public DreamMonitor(@SystemUser Monitor monitor, DreamCondition dreamCondition, DreamStatusBarStateCallback callback, RestartDozeListener restartDozeListener) { - super(pretextMonitor); + super(monitor); mConditionMonitor = monitor; mDreamCondition = dreamCondition; mCallback = callback; diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java index a2dcdf52ad3c..80e68cfbff21 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayRegistrant.java @@ -17,7 +17,6 @@ package com.android.systemui.dreams; import static com.android.systemui.dreams.dagger.DreamModule.DREAM_OVERLAY_SERVICE_COMPONENT; -import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -35,6 +34,7 @@ import android.service.dreams.IDreamManager; import android.util.Log; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.dagger.qualifiers.SystemUser; import com.android.systemui.shared.condition.Monitor; import com.android.systemui.util.condition.ConditionalCoreStartable; @@ -105,7 +105,7 @@ public class DreamOverlayRegistrant extends ConditionalCoreStartable { @Inject public DreamOverlayRegistrant(Context context, @Main Resources resources, @Named(DREAM_OVERLAY_SERVICE_COMPONENT) ComponentName dreamOverlayServiceComponent, - @Named(DREAM_PRETEXT_MONITOR) Monitor monitor) { + @SystemUser Monitor monitor) { super(monitor); mContext = context; mResources = resources; diff --git a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java index 1271645dac4e..c61b47758ab7 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java @@ -31,22 +31,14 @@ import com.android.systemui.dreams.DreamOverlayNotificationCountProvider; import com.android.systemui.dreams.DreamOverlayService; import com.android.systemui.dreams.complication.dagger.ComplicationComponent; import com.android.systemui.dreams.touch.scrim.dagger.ScrimModule; -import com.android.systemui.process.condition.SystemProcessCondition; -import com.android.systemui.shared.condition.Condition; -import com.android.systemui.shared.condition.Monitor; -import dagger.Binds; import dagger.Module; import dagger.Provides; -import dagger.multibindings.IntoSet; import java.util.Optional; -import java.util.Set; -import java.util.concurrent.Executor; import javax.inject.Named; - /** * Dagger Module providing Dream-related functionality. */ @@ -65,11 +57,8 @@ public interface DreamModule { String DREAM_OVERLAY_ENABLED = "dream_overlay_enabled"; String DREAM_SUPPORTED = "dream_supported"; - String DREAM_PRETEXT_CONDITIONS = "dream_pretext_conditions"; - String DREAM_PRETEXT_MONITOR = "dream_prtext_monitor"; String DREAM_OVERLAY_WINDOW_TITLE = "dream_overlay_window_title"; - /** * Provides the dream component */ @@ -129,21 +118,6 @@ public interface DreamModule { } /** */ - @Binds - @IntoSet - @Named(DREAM_PRETEXT_CONDITIONS) - Condition bindSystemProcessCondition(SystemProcessCondition condition); - - /** */ - @Provides - @Named(DREAM_PRETEXT_MONITOR) - static Monitor providesDockerPretextMonitor( - @Main Executor executor, - @Named(DREAM_PRETEXT_CONDITIONS) Set<Condition> pretextConditions) { - return new Monitor(executor, pretextConditions); - } - - /** */ @Provides @Named(DREAM_OVERLAY_WINDOW_TITLE) static String providesDreamOverlayWindowTitle(@Main Resources resources) { diff --git a/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt b/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt index a2f65ba747ab..4b03fd334cb5 100644 --- a/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/dump/DumpHandler.kt @@ -24,7 +24,7 @@ import com.android.systemui.R import com.android.systemui.dump.DumpHandler.Companion.PRIORITY_ARG_CRITICAL import com.android.systemui.dump.DumpHandler.Companion.PRIORITY_ARG_NORMAL import com.android.systemui.dump.nano.SystemUIProtoDump -import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.log.LogBuffer import com.android.systemui.shared.system.UncaughtExceptionPreHandlerManager import com.google.protobuf.nano.MessageNano import java.io.BufferedOutputStream diff --git a/packages/SystemUI/src/com/android/systemui/dump/DumpManager.kt b/packages/SystemUI/src/com/android/systemui/dump/DumpManager.kt index 7d1ffca88d9f..1e01c9cfd6a5 100644 --- a/packages/SystemUI/src/com/android/systemui/dump/DumpManager.kt +++ b/packages/SystemUI/src/com/android/systemui/dump/DumpManager.kt @@ -20,7 +20,7 @@ import android.util.ArrayMap import com.android.systemui.Dumpable import com.android.systemui.ProtoDumpable import com.android.systemui.dump.nano.SystemUIProtoDump -import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.log.LogBuffer import java.io.PrintWriter import javax.inject.Inject import javax.inject.Singleton diff --git a/packages/SystemUI/src/com/android/systemui/dump/LogBufferEulogizer.kt b/packages/SystemUI/src/com/android/systemui/dump/LogBufferEulogizer.kt index 8299b13d305f..0eab1afc4119 100644 --- a/packages/SystemUI/src/com/android/systemui/dump/LogBufferEulogizer.kt +++ b/packages/SystemUI/src/com/android/systemui/dump/LogBufferEulogizer.kt @@ -19,7 +19,7 @@ package com.android.systemui.dump import android.content.Context import android.util.Log import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.log.LogBuffer import com.android.systemui.util.io.Files import com.android.systemui.util.time.SystemClock import java.io.IOException diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index 78994c45a194..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. @@ -222,6 +225,11 @@ object Flags { val LOCK_SCREEN_LONG_PRESS_DIRECT_TO_WPP = unreleasedFlag(232, "lock_screen_long_press_directly_opens_wallpaper_picker") + /** Whether to run the new udfps keyguard refactor code. */ + // TODO(b/279440316): Tracking bug. + @JvmField + val REFACTOR_UDFPS_KEYGUARD_VIEWS = unreleasedFlag(233, "refactor_udfps_keyguard_views") + /** Provide new auth messages on the bouncer. */ // TODO(b/277961132): Tracking bug. @JvmField @@ -617,10 +625,12 @@ object Flags { val APP_PANELS_REMOVE_APPS_ALLOWED = unreleasedFlag(2003, "app_panels_remove_apps_allowed", teamfood = true) - // 2200 - udfps + // 2200 - biometrics (udfps, sfps, BiometricPrompt, etc.) // TODO(b/259264861): Tracking Bug @JvmField val UDFPS_NEW_TOUCH_DETECTION = releasedFlag(2200, "udfps_new_touch_detection") @JvmField val UDFPS_ELLIPSE_DETECTION = releasedFlag(2201, "udfps_ellipse_detection") + // TODO(b/278622168): Tracking Bug + @JvmField val BIOMETRIC_BP_STRONG = unreleasedFlag(2202, "biometric_bp_strong") // 2300 - stylus @JvmField val TRACK_STYLUS_EVER_USED = releasedFlag(2300, "track_stylus_ever_used") 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/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt index e650b9fc0e47..7c5641fcda9c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt @@ -19,7 +19,7 @@ package com.android.systemui.keyguard.domain.interactor import com.android.keyguard.logging.KeyguardLogger import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application -import com.android.systemui.plugins.log.LogLevel.VERBOSE +import com.android.systemui.log.LogLevel.VERBOSE import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch diff --git a/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt b/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt index efd3ad620de0..62e420759186 100644 --- a/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt @@ -6,9 +6,8 @@ import com.android.keyguard.FaceAuthUiEvent import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.shared.model.ErrorAuthenticationStatus import com.android.systemui.keyguard.shared.model.TransitionStep +import com.android.systemui.log.LogLevel.DEBUG import com.android.systemui.log.dagger.FaceAuthLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG import javax.inject.Inject private const val TAG = "DeviceEntryFaceAuthRepositoryLog" diff --git a/packages/SystemUI/src/com/android/systemui/log/LogBufferFactory.kt b/packages/SystemUI/src/com/android/systemui/log/LogBufferFactory.kt index d6e29e0f2067..e4465acb14ab 100644 --- a/packages/SystemUI/src/com/android/systemui/log/LogBufferFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/log/LogBufferFactory.kt @@ -19,9 +19,6 @@ package com.android.systemui.log import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.log.LogBufferHelper.Companion.adjustMaxSize -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogcatEchoTracker - import javax.inject.Inject @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt b/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt index edc278d1ae4f..af248269c77e 100644 --- a/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt @@ -21,10 +21,9 @@ import android.graphics.Rect import android.graphics.RectF import androidx.core.graphics.toRectF import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogLevel.ERROR import com.android.systemui.log.dagger.ScreenDecorationsLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogLevel.ERROR import javax.inject.Inject private const val TAG = "ScreenDecorationsLog" diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/BiometricLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/BiometricLog.java index 4b774d3b2192..233f7a123ff4 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/BiometricLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/BiometricLog.java @@ -23,7 +23,7 @@ import java.lang.annotation.RetentionPolicy; import javax.inject.Qualifier; /** - * A {@link com.android.systemui.plugins.log.LogBuffer} for BiometricMessages processing such as + * A {@link com.android.systemui.log.LogBuffer} for BiometricMessages processing such as * {@link com.android.systemui.biometrics.FaceHelpMessageDeferral} */ @Qualifier diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/BroadcastDispatcherLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/BroadcastDispatcherLog.java index 5cca1ab2abe7..7d1f1c2709fa 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/BroadcastDispatcherLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/BroadcastDispatcherLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/CollapsedSbFragmentLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/CollapsedSbFragmentLog.java index 1d016d837b02..9ca0293fbd86 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/CollapsedSbFragmentLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/CollapsedSbFragmentLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/DozeLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/DozeLog.java index c9f78bcdeef8..7c5f4025117f 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/DozeLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/DozeLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/KeyguardClockLog.kt b/packages/SystemUI/src/com/android/systemui/log/dagger/KeyguardClockLog.kt index 9f563fe4eae5..8732ef576335 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/KeyguardClockLog.kt +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/KeyguardClockLog.kt @@ -18,19 +18,19 @@ package com.android.systemui.log.dagger import javax.inject.Qualifier -/** A [com.android.systemui.plugins.log.LogBuffer] for keyguard clock logs. */ +/** A [com.android.systemui.log.LogBuffer] for keyguard clock logs. */ @Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class KeyguardClockLog -/** A [com.android.systemui.plugins.log.LogBuffer] for small keyguard clock logs. */ +/** A [com.android.systemui.log.LogBuffer] for small keyguard clock logs. */ @Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class KeyguardSmallClockLog -/** A [com.android.systemui.plugins.log.LogBuffer] for large keyguard clock logs. */ +/** A [com.android.systemui.log.LogBuffer] for large keyguard clock logs. */ @Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LSShadeTransitionLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LSShadeTransitionLog.java index 76d20bea4bdf..08d969b5eb77 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/LSShadeTransitionLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LSShadeTransitionLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java index 658f6a087854..90ef8a787a10 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java @@ -22,13 +22,13 @@ import android.os.Looper; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.log.LogBuffer; import com.android.systemui.log.LogBufferFactory; +import com.android.systemui.log.LogcatEchoTracker; +import com.android.systemui.log.LogcatEchoTrackerDebug; +import com.android.systemui.log.LogcatEchoTrackerProd; import com.android.systemui.log.table.TableLogBuffer; import com.android.systemui.log.table.TableLogBufferFactory; -import com.android.systemui.plugins.log.LogBuffer; -import com.android.systemui.plugins.log.LogcatEchoTracker; -import com.android.systemui.plugins.log.LogcatEchoTrackerDebug; -import com.android.systemui.plugins.log.LogcatEchoTrackerProd; import com.android.systemui.statusbar.notification.NotifPipelineFlags; import com.android.systemui.util.Compile; import com.android.systemui.util.wakelock.WakeLockLog; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaBrowserLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaBrowserLog.java index af433476b38c..1c00c93f4e38 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaBrowserLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaBrowserLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaCarouselControllerLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaCarouselControllerLog.java index f4dac6efe371..86a916ef6541 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaCarouselControllerLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaCarouselControllerLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaMuteAwaitLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaMuteAwaitLog.java index 73690ab6c24d..c67d8bebe313 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaMuteAwaitLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaMuteAwaitLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaTimeoutListenerLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaTimeoutListenerLog.java index 0c2cd92d1bb0..98e6556d7f53 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaTimeoutListenerLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaTimeoutListenerLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaViewLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaViewLog.java index 5b7f4bb103b4..dde0ee0796d4 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/MediaViewLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/MediaViewLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/NearbyMediaDevicesLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/NearbyMediaDevicesLog.java index 6d91f0c97c8a..b1c6dcfcb13b 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/NearbyMediaDevicesLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/NearbyMediaDevicesLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/NotifInteractionLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/NotifInteractionLog.java index 26af4964f7b8..20fc6ff445a6 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/NotifInteractionLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/NotifInteractionLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationHeadsUpLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationHeadsUpLog.java index 61daf9c8d71c..fcc184a317b8 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationHeadsUpLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationHeadsUpLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationInterruptLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationInterruptLog.java index a59afa0fed1b..760fbf3928b6 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationInterruptLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationInterruptLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationLockscreenLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationLockscreenLog.java index a2d381ec90f0..f1646a837132 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationLockscreenLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationLockscreenLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationLog.java index 6f8ea7ff2e9b..a0b686487bec 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationRenderLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationRenderLog.java index 835d3490293c..8c8753a07339 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationRenderLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationRenderLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationSectionLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationSectionLog.java index 6e2bd7b2e1b5..7259eebf19b6 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationSectionLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/NotificationSectionLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/PrivacyLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/PrivacyLog.java index 77b1bf5fd630..e96e532f94bf 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/PrivacyLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/PrivacyLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/QSConfigLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/QSConfigLog.java index 295bf88d498f..973f6501bbfd 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/QSConfigLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/QSConfigLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/QSFragmentDisableLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/QSFragmentDisableLog.java index 9fd166b759d2..557a254e5c09 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/QSFragmentDisableLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/QSFragmentDisableLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/QSLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/QSLog.java index dd168bac5654..dd5010cf39a8 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/QSLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/QSLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeLog.java index d24bfcb88188..bd0d298ebdee 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeWindowLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeWindowLog.java index 1d2b68c3bf46..4aa2b1d84b21 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeWindowLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeWindowLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/StatusBarNetworkControllerLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/StatusBarNetworkControllerLog.java index af0f7c518e64..f26b3164f488 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/StatusBarNetworkControllerLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/StatusBarNetworkControllerLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/SwipeUpLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/SwipeUpLog.java index d58b538f2047..4d797c1a88cd 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/SwipeUpLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/SwipeUpLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/ToastLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/ToastLog.java index ba8b27c23ec1..8671dbfdf1fe 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/ToastLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/ToastLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/UnseenNotificationLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/UnseenNotificationLog.java index 5c2321be4388..dbb6e8cbcc07 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/UnseenNotificationLog.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/UnseenNotificationLog.java @@ -18,7 +18,7 @@ package com.android.systemui.log.dagger; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt b/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt index 9d883cc10d6c..b936e833a56a 100644 --- a/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt +++ b/packages/SystemUI/src/com/android/systemui/log/table/TableLogBuffer.kt @@ -20,8 +20,8 @@ import android.os.Trace import com.android.systemui.Dumpable import com.android.systemui.common.buffer.RingBuffer import com.android.systemui.dagger.qualifiers.Background -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.plugins.log.LogcatEchoTracker +import com.android.systemui.log.LogLevel +import com.android.systemui.log.LogcatEchoTracker import com.android.systemui.util.time.SystemClock import java.io.PrintWriter import java.text.SimpleDateFormat @@ -35,7 +35,7 @@ import kotlinx.coroutines.launch * A logger that logs changes in table format. * * Some parts of System UI maintain a lot of pieces of state at once. - * [com.android.systemui.plugins.log.LogBuffer] allows us to easily log change events: + * [com.android.systemui.log.LogBuffer] allows us to easily log change events: * - 10-10 10:10:10.456: state2 updated to newVal2 * - 10-10 10:11:00.000: stateN updated to StateN(val1=true, val2=1) * - 10-10 10:11:02.123: stateN updated to StateN(val1=true, val2=2) diff --git a/packages/SystemUI/src/com/android/systemui/log/table/TableLogBufferFactory.kt b/packages/SystemUI/src/com/android/systemui/log/table/TableLogBufferFactory.kt index 42e742db2842..19e112487c46 100644 --- a/packages/SystemUI/src/com/android/systemui/log/table/TableLogBufferFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/log/table/TableLogBufferFactory.kt @@ -21,7 +21,7 @@ import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dump.DumpManager import com.android.systemui.log.LogBufferHelper.Companion.adjustMaxSize -import com.android.systemui.plugins.log.LogcatEchoTracker +import com.android.systemui.log.LogcatEchoTracker import com.android.systemui.util.time.SystemClock import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaTimeoutLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaTimeoutLogger.kt index f731dc064355..e2e269de71a0 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaTimeoutLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaTimeoutLogger.kt @@ -18,9 +18,9 @@ package com.android.systemui.media.controls.pipeline import android.media.session.PlaybackState import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.log.dagger.MediaTimeoutListenerLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel import javax.inject.Inject private const val TAG = "MediaTimeout" diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserLogger.kt index 095cf09a6c2c..9e53d77dec99 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/resume/ResumeMediaBrowserLogger.kt @@ -18,9 +18,9 @@ package com.android.systemui.media.controls.resume import android.content.ComponentName import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.log.dagger.MediaBrowserLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel import javax.inject.Inject /** A logger for events in [ResumeMediaBrowser]. */ diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselControllerLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselControllerLogger.kt index 9af11b924ec8..0ed24349bdf4 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselControllerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselControllerLogger.kt @@ -17,9 +17,9 @@ package com.android.systemui.media.controls.ui import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.log.dagger.MediaCarouselControllerLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel import javax.inject.Inject /** A debug logger for [MediaCarouselController]. */ diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewLogger.kt index fdac33ac20b0..c781b7699b26 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewLogger.kt @@ -17,9 +17,9 @@ package com.android.systemui.media.controls.ui import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.log.dagger.MediaViewLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel import javax.inject.Inject private const val TAG = "MediaView" diff --git a/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java b/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java index 9ae4577b0394..46efac56ab9d 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java +++ b/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java @@ -17,6 +17,7 @@ package com.android.systemui.media.dagger; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.log.LogBuffer; import com.android.systemui.log.LogBufferFactory; import com.android.systemui.media.controls.pipeline.MediaDataManager; import com.android.systemui.media.controls.ui.MediaHierarchyManager; @@ -30,16 +31,15 @@ import com.android.systemui.media.taptotransfer.MediaTttCommandLineHelper; import com.android.systemui.media.taptotransfer.MediaTttFlags; import com.android.systemui.media.taptotransfer.receiver.MediaTttReceiverLogBuffer; import com.android.systemui.media.taptotransfer.sender.MediaTttSenderLogBuffer; -import com.android.systemui.plugins.log.LogBuffer; - -import java.util.Optional; - -import javax.inject.Named; import dagger.Lazy; import dagger.Module; import dagger.Provides; +import java.util.Optional; + +import javax.inject.Named; + /** Dagger module for the media package. */ @Module(subcomponents = { MediaComplicationComponent.class, diff --git a/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitLogger.kt b/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitLogger.kt index 5ace3ea8a05b..bbcf259418c8 100644 --- a/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitLogger.kt @@ -2,8 +2,8 @@ package com.android.systemui.media.muteawait import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.dagger.MediaMuteAwaitLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import javax.inject.Inject /** Log messages for [MediaMuteAwaitConnectionManager]. */ diff --git a/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesLogger.kt b/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesLogger.kt index 78408fce5a36..66399d580582 100644 --- a/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/nearby/NearbyMediaDevicesLogger.kt @@ -2,8 +2,8 @@ package com.android.systemui.media.nearby import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.dagger.NearbyMediaDevicesLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import javax.inject.Inject /** Log messages for [NearbyMediaDevicesManager]. */ diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtils.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtils.kt index 0e839c6dbc7a..eeda102702d2 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtils.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtils.kt @@ -16,8 +16,8 @@ package com.android.systemui.media.taptotransfer.common -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel /** A helper for logging media tap-to-transfer events. */ object MediaTttLoggerUtils { diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogBuffer.java b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogBuffer.java index 67e464c344c5..31ccb9afac9f 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogBuffer.java +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogBuffer.java @@ -18,7 +18,7 @@ package com.android.systemui.media.taptotransfer.receiver; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt index b0c6257df96c..1502df725a9c 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLogger.kt @@ -18,8 +18,8 @@ package com.android.systemui.media.taptotransfer.receiver import android.app.StatusBarManager import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer import com.android.systemui.media.taptotransfer.common.MediaTttLoggerUtils -import com.android.systemui.plugins.log.LogBuffer import com.android.systemui.temporarydisplay.TemporaryViewLogger import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogBuffer.java b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogBuffer.java index a262e97864f3..edee4a808968 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogBuffer.java +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogBuffer.java @@ -18,7 +18,7 @@ package com.android.systemui.media.taptotransfer.sender; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt index 964a95b9be9a..03bcfc8113e3 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLogger.kt @@ -18,9 +18,9 @@ package com.android.systemui.media.taptotransfer.sender import android.app.StatusBarManager import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.media.taptotransfer.common.MediaTttLoggerUtils -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel import javax.inject.Inject /** A logger for all events related to the media tap-to-transfer sender experience. */ diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt index 96e97565d585..91bb7898494f 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt @@ -60,15 +60,21 @@ private const val MIN_DURATION_CANCELLED_ANIMATION = 200L private const val MIN_DURATION_COMMITTED_ANIMATION = 80L private const val MIN_DURATION_COMMITTED_AFTER_FLING_ANIMATION = 120L private const val MIN_DURATION_INACTIVE_BEFORE_FLUNG_ANIMATION = 50L -private const val MIN_DURATION_INACTIVE_BEFORE_ACTIVE_ANIMATION = 80L +private const val MIN_DURATION_INACTIVE_BEFORE_ACTIVE_ANIMATION = 160F +private const val MIN_DURATION_ENTRY_BEFORE_ACTIVE_ANIMATION = 10F +internal const val MAX_DURATION_ENTRY_BEFORE_ACTIVE_ANIMATION = 100F private const val MIN_DURATION_FLING_ANIMATION = 160L private const val MIN_DURATION_ENTRY_TO_ACTIVE_CONSIDERED_AS_FLING = 100L private const val MIN_DURATION_INACTIVE_TO_ACTIVE_CONSIDERED_AS_FLING = 400L private const val POP_ON_FLING_DELAY = 60L -private const val POP_ON_FLING_SCALE = 2f -private const val POP_ON_COMMITTED_SCALE = 3f +private const val POP_ON_FLING_VELOCITY = 2f +private const val POP_ON_COMMITTED_VELOCITY = 3f +private const val POP_ON_ACTIVE_MAX_VELOCITY = 2.5f +private const val POP_ON_ACTIVE_MIN_VELOCITY = 4.5f +private const val POP_ON_INACTIVE_MAX_VELOCITY = -1.05f +private const val POP_ON_INACTIVE_MIN_VELOCITY = -1.5f internal val VIBRATE_ACTIVATED_EFFECT = VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK) @@ -156,13 +162,22 @@ class BackPanelController internal constructor( private var gestureEntryTime = 0L private var gestureInactiveTime = 0L - private var gesturePastActiveThresholdWhileInactiveTime = 0L private val elapsedTimeSinceInactive get() = SystemClock.uptimeMillis() - gestureInactiveTime private val elapsedTimeSinceEntry get() = SystemClock.uptimeMillis() - gestureEntryTime + + private var pastThresholdWhileEntryOrInactiveTime = 0L + private var entryToActiveDelay = 0F + private val entryToActiveDelayCalculation = { + convertVelocityToAnimationFactor( + valueOnFastVelocity = MIN_DURATION_ENTRY_BEFORE_ACTIVE_ANIMATION, + valueOnSlowVelocity = MAX_DURATION_ENTRY_BEFORE_ACTIVE_ANIMATION, + ) + } + // Whether the current gesture has moved a sufficiently large amount, // so that we can unambiguously start showing the ENTRY animation private var hasPassedDragSlop = false @@ -306,7 +321,9 @@ class BackPanelController internal constructor( MotionEvent.ACTION_UP -> { when (currentState) { GestureState.ENTRY -> { - if (isFlungAwayFromEdge(endX = event.x)) { + if (isFlungAwayFromEdge(endX = event.x) || + previousXTranslation > params.staticTriggerThreshold + ) { updateArrowState(GestureState.ACTIVE) updateArrowState(GestureState.FLUNG) } else { @@ -394,12 +411,29 @@ class BackPanelController internal constructor( } private fun updateArrowStateOnMove(yTranslation: Float, xTranslation: Float) { - val isWithinYActivationThreshold = xTranslation * 2 >= yTranslation - + val isPastStaticThreshold = xTranslation > params.staticTriggerThreshold when (currentState) { GestureState.ENTRY -> { - if (xTranslation > params.staticTriggerThreshold) { + if (isPastThresholdToActive( + isPastThreshold = isPastStaticThreshold, + dynamicDelay = entryToActiveDelayCalculation + ) + ) { + updateArrowState(GestureState.ACTIVE) + } + } + GestureState.INACTIVE -> { + val isPastDynamicReactivationThreshold = + totalTouchDeltaInactive >= params.reactivationTriggerThreshold + + if (isPastThresholdToActive( + isPastThreshold = isPastStaticThreshold && + isPastDynamicReactivationThreshold && + isWithinYActivationThreshold, + delay = MIN_DURATION_INACTIVE_BEFORE_ACTIVE_ANIMATION + ) + ) { updateArrowState(GestureState.ACTIVE) } } @@ -408,43 +442,12 @@ class BackPanelController internal constructor( totalTouchDeltaActive <= params.deactivationTriggerThreshold val isMinDurationElapsed = elapsedTimeSinceEntry > MIN_DURATION_ACTIVE_BEFORE_INACTIVE_ANIMATION - - if (isMinDurationElapsed && (!isWithinYActivationThreshold || - isPastDynamicDeactivationThreshold) - ) { + val isPastAllThresholds = + !isWithinYActivationThreshold || isPastDynamicDeactivationThreshold + if (isPastAllThresholds && isMinDurationElapsed) { updateArrowState(GestureState.INACTIVE) } } - GestureState.INACTIVE -> { - val isPastStaticThreshold = - xTranslation > params.staticTriggerThreshold - val isPastDynamicReactivationThreshold = - totalTouchDeltaInactive >= params.reactivationTriggerThreshold - val isPastAllThresholds = isPastStaticThreshold && - isPastDynamicReactivationThreshold && - isWithinYActivationThreshold - val isPastAllThresholdsForFirstTime = isPastAllThresholds && - gesturePastActiveThresholdWhileInactiveTime == 0L - - gesturePastActiveThresholdWhileInactiveTime = when { - isPastAllThresholdsForFirstTime -> SystemClock.uptimeMillis() - isPastAllThresholds -> gesturePastActiveThresholdWhileInactiveTime - else -> 0L - } - - val elapsedTimePastAllThresholds = - SystemClock.uptimeMillis() - gesturePastActiveThresholdWhileInactiveTime - - val isPastMinimumInactiveToActiveDuration = - elapsedTimePastAllThresholds > MIN_DURATION_INACTIVE_BEFORE_ACTIVE_ANIMATION - - if (isPastAllThresholds && isPastMinimumInactiveToActiveDuration) { - // The minimum duration adds the 'edge stickiness' - // factor before pulling it off edge - updateArrowState(GestureState.ACTIVE) - } - } - else -> {} } } @@ -672,6 +675,28 @@ class BackPanelController internal constructor( return flingDistance > minFlingDistance && isPastFlingVelocityThreshold } + private fun isPastThresholdToActive( + isPastThreshold: Boolean, + delay: Float? = null, + dynamicDelay: () -> Float = { delay ?: 0F } + ): Boolean { + val resetValue = 0L + val isPastThresholdForFirstTime = pastThresholdWhileEntryOrInactiveTime == resetValue + + if (!isPastThreshold) { + pastThresholdWhileEntryOrInactiveTime = resetValue + return false + } + + if (isPastThresholdForFirstTime) { + pastThresholdWhileEntryOrInactiveTime = SystemClock.uptimeMillis() + entryToActiveDelay = dynamicDelay() + } + val timePastThreshold = SystemClock.uptimeMillis() - pastThresholdWhileEntryOrInactiveTime + + return timePastThreshold > entryToActiveDelay + } + private fun playWithBackgroundWidthAnimation( onEnd: DelayedOnAnimationEndListener, delay: Long = 0L @@ -886,33 +911,16 @@ class BackPanelController internal constructor( } GestureState.ACTIVE -> { previousXTranslationOnActiveOffset = previousXTranslation - updateRestingArrowDimens() - vibratorHelper.cancel() mainHandler.postDelayed(10L) { vibratorHelper.vibrate(VIBRATE_ACTIVATED_EFFECT) } - - val minimumPop = 2f - val maximumPop = 4.5f - - when (previousState) { - GestureState.ENTRY -> { - val startingVelocity = convertVelocityToSpringStartingVelocity( - valueOnFastVelocity = minimumPop, - valueOnSlowVelocity = maximumPop, - fastVelocityBound = 1f, - slowVelocityBound = 0.5f, - ) - mView.popOffEdge(startingVelocity) - } - GestureState.INACTIVE -> { - mView.popOffEdge(maximumPop) - } - - else -> {} - } + val startingVelocity = convertVelocityToAnimationFactor( + valueOnFastVelocity = POP_ON_ACTIVE_MAX_VELOCITY, + valueOnSlowVelocity = POP_ON_ACTIVE_MIN_VELOCITY, + ) + mView.popOffEdge(startingVelocity) } GestureState.INACTIVE -> { @@ -925,9 +933,9 @@ class BackPanelController internal constructor( // so that gesture progress in this state is consistent regardless of entry totalTouchDeltaInactive = params.deactivationTriggerThreshold - val startingVelocity = convertVelocityToSpringStartingVelocity( - valueOnFastVelocity = -1.05f, - valueOnSlowVelocity = -1.50f + val startingVelocity = convertVelocityToAnimationFactor( + valueOnFastVelocity = POP_ON_INACTIVE_MAX_VELOCITY, + valueOnSlowVelocity = POP_ON_INACTIVE_MIN_VELOCITY ) mView.popOffEdge(startingVelocity) @@ -935,7 +943,9 @@ class BackPanelController internal constructor( updateRestingArrowDimens() } GestureState.FLUNG -> { - mainHandler.postDelayed(POP_ON_FLING_DELAY) { mView.popScale(POP_ON_FLING_SCALE) } + mainHandler.postDelayed(POP_ON_FLING_DELAY) { + mView.popScale(POP_ON_FLING_VELOCITY) + } updateRestingArrowDimens() mainHandler.postDelayed(onEndSetCommittedStateListener.runnable, MIN_DURATION_FLING_ANIMATION) @@ -951,7 +961,7 @@ class BackPanelController internal constructor( mainHandler.postDelayed(onEndSetGoneStateListener.runnable, MIN_DURATION_COMMITTED_AFTER_FLING_ANIMATION) } else { - mView.popScale(POP_ON_COMMITTED_SCALE) + mView.popScale(POP_ON_COMMITTED_VELOCITY) mainHandler.postDelayed(onAlphaEndSetGoneStateListener.runnable, MIN_DURATION_COMMITTED_ANIMATION) } @@ -968,11 +978,11 @@ class BackPanelController internal constructor( } } - private fun convertVelocityToSpringStartingVelocity( + private fun convertVelocityToAnimationFactor( valueOnFastVelocity: Float, valueOnSlowVelocity: Float, - fastVelocityBound: Float = 3f, - slowVelocityBound: Float = 0f, + fastVelocityBound: Float = 1f, + slowVelocityBound: Float = 0.5f, ): Float { val factor = velocityTracker?.run { computeCurrentVelocity(PX_PER_MS) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java index 41e3e6d83eea..9a1efc3d6456 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java @@ -15,6 +15,8 @@ */ package com.android.systemui.navigationbar.gestural; +import static android.view.InputDevice.SOURCE_MOUSE; +import static android.view.InputDevice.SOURCE_TOUCHPAD; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_EXCLUDE_FROM_SCREEN_MAGNIFICATION; import static com.android.systemui.classifier.Classifier.BACK_GESTURE; @@ -937,10 +939,12 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack mMLResults = 0; mLogGesture = false; mInRejectedExclusion = false; - boolean isWithinInsets = isWithinInsets((int) ev.getX(), (int) ev.getY()); // Trackpad back gestures don't have zones, so we don't need to check if the down event - // is within insets. + // is within insets. Also we don't allow back for button press from the trackpad, and + // yet we do with a mouse. + boolean isWithinInsets = isWithinInsets((int) ev.getX(), (int) ev.getY()); mAllowGesture = !mDisabledForQuickstep && mIsBackGestureAllowed + && !isButtonPressFromTrackpad(ev) && (isTrackpadMultiFingerSwipe || isWithinInsets) && !mGestureBlockingActivityRunning && !QuickStepContract.isBackGestureDisabled(mSysUiFlags) @@ -1047,6 +1051,11 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack mProtoTracer.scheduleFrameUpdate(); } + private boolean isButtonPressFromTrackpad(MotionEvent ev) { + int sources = InputManager.getInstance().getInputDevice(ev.getDeviceId()).getSources(); + return (sources & (SOURCE_MOUSE | SOURCE_TOUCHPAD)) == sources && ev.getButtonState() != 0; + } + private void dispatchToBackAnimation(MotionEvent event) { if (mBackAnimation != null) { mVelocityTracker.addMovement(event); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt index 876c74a9f3e3..182ece7cd328 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt @@ -153,7 +153,7 @@ data class EdgePanelParams(private var resources: Resources) { horizontalTranslation = getDimen(R.dimen.navigation_edge_entry_margin), scale = getDimenFloat(R.dimen.navigation_edge_entry_scale), scalePivotX = getDimen(R.dimen.navigation_edge_pre_threshold_background_width), - horizontalTranslationSpring = createSpring(500f, 0.76f), + horizontalTranslationSpring = createSpring(800f, 0.76f), verticalTranslationSpring = createSpring(30000f, 1f), scaleSpring = createSpring(120f, 0.8f), arrowDimens = ArrowDimens( @@ -205,8 +205,8 @@ data class EdgePanelParams(private var resources: Resources) { activeIndicator = BackIndicatorDimens( horizontalTranslation = getDimen(R.dimen.navigation_edge_active_margin), scale = getDimenFloat(R.dimen.navigation_edge_active_scale), - horizontalTranslationSpring = createSpring(1000f, 0.7f), - scaleSpring = createSpring(450f, 0.39f), + horizontalTranslationSpring = createSpring(1000f, 0.8f), + scaleSpring = createSpring(325f, 0.55f), scalePivotX = getDimen(R.dimen.navigation_edge_active_background_width), arrowDimens = ArrowDimens( length = getDimen(R.dimen.navigation_edge_active_arrow_length), @@ -253,7 +253,7 @@ data class EdgePanelParams(private var resources: Resources) { getDimen(R.dimen.navigation_edge_pre_threshold_edge_corners), farCornerRadius = getDimen(R.dimen.navigation_edge_pre_threshold_far_corners), - widthSpring = createSpring(400f, 0.65f), + widthSpring = createSpring(650f, 1f), heightSpring = createSpring(1500f, 0.45f), farCornerRadiusSpring = createSpring(300f, 1f), edgeCornerRadiusSpring = createSpring(250f, 0.5f), diff --git a/packages/SystemUI/src/com/android/systemui/privacy/logging/PrivacyLogger.kt b/packages/SystemUI/src/com/android/systemui/privacy/logging/PrivacyLogger.kt index 03503fd1ff61..f9e1adff012b 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/logging/PrivacyLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/logging/PrivacyLogger.kt @@ -18,9 +18,9 @@ package com.android.systemui.privacy.logging import android.permission.PermissionGroupUsage import com.android.systemui.log.dagger.PrivacyLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.plugins.log.LogMessage +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel +import com.android.systemui.log.LogMessage import com.android.systemui.privacy.PrivacyDialog import com.android.systemui.privacy.PrivacyItem import java.text.SimpleDateFormat diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragmentDisableFlagsLogger.kt b/packages/SystemUI/src/com/android/systemui/qs/QSFragmentDisableFlagsLogger.kt index 025fb228b829..cd52ec29177d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragmentDisableFlagsLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragmentDisableFlagsLogger.kt @@ -1,8 +1,8 @@ package com.android.systemui.qs import com.android.systemui.log.dagger.QSFragmentDisableLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.disableflags.DisableFlagsLogger import javax.inject.Inject 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/logging/QSLogger.kt b/packages/SystemUI/src/com/android/systemui/qs/logging/QSLogger.kt index 5b461a6d8bad..c00a81cbf12b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/logging/QSLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/logging/QSLogger.kt @@ -21,14 +21,14 @@ import android.content.res.Configuration.ORIENTATION_PORTRAIT import android.content.res.Configuration.Orientation import android.service.quicksettings.Tile import android.view.View +import com.android.systemui.log.ConstantStringsLogger +import com.android.systemui.log.ConstantStringsLoggerImpl +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogLevel.ERROR +import com.android.systemui.log.LogLevel.VERBOSE import com.android.systemui.log.dagger.QSConfigLog import com.android.systemui.log.dagger.QSLog -import com.android.systemui.plugins.log.ConstantStringsLogger -import com.android.systemui.plugins.log.ConstantStringsLoggerImpl -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogLevel.ERROR -import com.android.systemui.plugins.log.LogLevel.VERBOSE import com.android.systemui.plugins.qs.QSTile import com.android.systemui.statusbar.StatusBarState import com.google.errorprone.annotations.CompileTimeConstant diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt index e85440cad6b0..a066242fd96b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt @@ -18,8 +18,8 @@ package com.android.systemui.qs.pipeline.dagger import com.android.systemui.CoreStartable import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogBufferFactory -import com.android.systemui.plugins.log.LogBuffer import com.android.systemui.qs.pipeline.data.repository.TileSpecRepository import com.android.systemui.qs.pipeline.data.repository.TileSpecSettingsRepository import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt index 767ce919d027..b564334b5c52 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/shared/logging/QSPipelineLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.qs.pipeline.shared.logging import android.annotation.UserIdInt -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.qs.pipeline.dagger.QSTileListLog import com.android.systemui.qs.pipeline.shared.TileSpec import javax.inject.Inject 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/screenrecord/BaseScreenSharePermissionDialog.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/BaseScreenSharePermissionDialog.kt index f63bf07a5a3f..b34004397520 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/BaseScreenSharePermissionDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/BaseScreenSharePermissionDialog.kt @@ -57,8 +57,8 @@ open class BaseScreenSharePermissionDialog( setContentView(R.layout.screen_share_dialog) dialogTitle = findViewById(R.id.screen_share_dialog_title) warning = findViewById(R.id.text_warning) - startButton = findViewById(R.id.button_start) - cancelButton = findViewById(R.id.button_cancel) + startButton = findViewById(android.R.id.button1) + cancelButton = findViewById(android.R.id.button2) updateIcon() initScreenShareOptions() createOptionsView(getOptionsViewLayoutId()) 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/shade/ShadeLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt index 1839e13dcdec..25073c1b64db 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt @@ -18,8 +18,8 @@ package com.android.systemui.shade import android.view.MotionEvent import com.android.systemui.log.dagger.ShadeLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.shade.ShadeViewController.Companion.FLING_COLLAPSE import com.android.systemui.shade.ShadeViewController.Companion.FLING_EXPAND import com.android.systemui.shade.ShadeViewController.Companion.FLING_HIDE diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeWindowLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeWindowLogger.kt index 9851625b6152..d8d42795be58 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeWindowLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeWindowLogger.kt @@ -18,12 +18,12 @@ package com.android.systemui.shade import android.view.WindowManager import com.android.systemui.log.dagger.ShadeWindowLog -import com.android.systemui.plugins.log.ConstantStringsLogger -import com.android.systemui.plugins.log.ConstantStringsLoggerImpl -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogMessage +import com.android.systemui.log.ConstantStringsLogger +import com.android.systemui.log.ConstantStringsLoggerImpl +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogMessage import javax.inject.Inject private const val TAG = "systemui.shadewindow" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActionClickLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/ActionClickLogger.kt index 90c52bd8c9f4..e008ec0dc75c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ActionClickLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActionClickLogger.kt @@ -18,8 +18,8 @@ package com.android.systemui.statusbar import android.app.PendingIntent import com.android.systemui.log.dagger.NotifInteractionLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.notification.collection.NotificationEntry import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index ea5a1c0fbe70..0ea257010751 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -41,8 +41,8 @@ import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewCont import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_TRUST; import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_USER_LOCKED; import static com.android.systemui.keyguard.ScreenLifecycle.SCREEN_ON; +import static com.android.systemui.log.LogLevel.ERROR; import static com.android.systemui.plugins.FalsingManager.LOW_PENALTY; -import static com.android.systemui.plugins.log.LogLevel.ERROR; import android.app.AlarmManager; import android.app.admin.DevicePolicyManager; @@ -95,8 +95,8 @@ import com.android.systemui.keyguard.KeyguardIndication; import com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor; +import com.android.systemui.log.LogLevel; import com.android.systemui.plugins.FalsingManager; -import com.android.systemui.plugins.log.LogLevel; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.KeyguardBypassController; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LegacyNotificationShelfControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/LegacyNotificationShelfControllerImpl.java index 505f45d021b8..dcd9dc3e7fa3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LegacyNotificationShelfControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LegacyNotificationShelfControllerImpl.java @@ -52,7 +52,6 @@ public class LegacyNotificationShelfControllerImpl implements NotificationShelfC mActivatableNotificationViewController = activatableNotificationViewController; mKeyguardBypassController = keyguardBypassController; mStatusBarStateController = statusBarStateController; - mView.useRoundnessSourceTypes(true); mView.setSensitiveRevealAnimEndabled(featureFlags.isEnabled(Flags.SENSITIVE_REVEAL_ANIM)); mOnAttachStateChangeListener = new View.OnAttachStateChangeListener() { @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 7eb63da38028..49c7950fd923 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -44,7 +44,6 @@ import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.shade.transition.LargeScreenShadeInterpolator; -import com.android.systemui.statusbar.notification.LegacySourceType; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.SourceType; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; @@ -128,13 +127,6 @@ public class NotificationShelf extends ActivatableNotificationView implements St setClipToPadding(false); mShelfIcons.setIsStaticLayout(false); requestRoundness(/* top = */ 1f, /* bottom = */ 1f, BASE_VALUE, /* animate = */ false); - - if (!mUseRoundnessSourceTypes) { - // Setting this to first in section to get the clipping to the top roundness correct. - // This value determines the way we are clipping to the top roundness of the overall - // shade - setFirstInSection(true); - } updateResources(); } @@ -569,17 +561,8 @@ public class NotificationShelf extends ActivatableNotificationView implements St * mAmbientState.getExpansionFraction(); final float cornerAnimationTop = shelfStart - cornerAnimationDistance; - final SourceType sourceType; - if (mUseRoundnessSourceTypes) { - sourceType = SHELF_SCROLL; - } else { - sourceType = LegacySourceType.OnScroll; - } - final float topValue; - if (!mUseRoundnessSourceTypes && anv.isFirstInSection()) { - topValue = 1f; - } else if (viewStart >= cornerAnimationTop) { + if (viewStart >= cornerAnimationTop) { // Round top corners within animation bounds topValue = MathUtils.saturate( (viewStart - cornerAnimationTop) / cornerAnimationDistance); @@ -588,12 +571,10 @@ public class NotificationShelf extends ActivatableNotificationView implements St // Reset top and bottom corners outside of animation bounds. topValue = 0f; } - anv.requestTopRoundness(topValue, sourceType, /* animate = */ false); + anv.requestTopRoundness(topValue, SHELF_SCROLL, /* animate = */ false); final float bottomValue; - if (!mUseRoundnessSourceTypes && anv.isLastInSection()) { - bottomValue = 1f; - } else if (viewEnd >= cornerAnimationTop) { + if (viewEnd >= cornerAnimationTop) { // Round bottom corners within animation bounds bottomValue = MathUtils.saturate( (viewEnd - cornerAnimationTop) / cornerAnimationDistance); @@ -602,7 +583,7 @@ public class NotificationShelf extends ActivatableNotificationView implements St // Reset top and bottom corners outside of animation bounds. bottomValue = 0f; } - anv.requestBottomRoundness(bottomValue, sourceType, /* animate = */ false); + anv.requestBottomRoundness(bottomValue, SHELF_SCROLL, /* animate = */ false); } private boolean isViewAffectedBySwipe(ExpandableView expandableView) { @@ -1100,15 +1081,6 @@ public class NotificationShelf extends ActivatableNotificationView implements St child.requestRoundnessReset(SHELF_SCROLL); } - /** - * This method resets the OnScroll roundness of a view to 0f - * <p> - * Note: This should be the only class that handles roundness {@code SourceType.OnScroll} - */ - public static void resetLegacyOnScrollRoundness(ExpandableView expandableView) { - expandableView.requestRoundnessReset(LegacySourceType.OnScroll); - } - @Override public void dump(PrintWriter pwOriginal, String[] args) { IndentingPrintWriter pw = DumpUtilsKt.asIndenting(pwOriginal); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt index 976924a2159d..821a17279cb3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt @@ -87,13 +87,8 @@ constructor( bypassController.isPulseExpanding = value if (changed) { if (value) { - val topEntry = headsUpManager.topEntry - topEntry?.let { - roundnessManager.setTrackingHeadsUp(it.row) - } lockscreenShadeTransitionController.onPulseExpansionStarted() } else { - roundnessManager.setTrackingHeadsUp(null) if (!leavingLockscreen) { bypassController.maybePerformPendingUnlock() pulseExpandAbortListener?.run() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java index 6e74542691a5..2465c21c956f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java @@ -73,9 +73,9 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.demomode.DemoMode; import com.android.systemui.demomode.DemoModeController; import com.android.systemui.dump.DumpManager; +import com.android.systemui.log.LogBuffer; +import com.android.systemui.log.LogLevel; import com.android.systemui.log.dagger.StatusBarNetworkControllerLog; -import com.android.systemui.plugins.log.LogBuffer; -import com.android.systemui.plugins.log.LogLevel; import com.android.systemui.qs.tiles.dialog.InternetDialogFactory; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags; @@ -87,6 +87,8 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceP import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.util.CarrierConfigTracker; +import kotlin.Unit; + import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -101,8 +103,6 @@ import java.util.stream.Collectors; import javax.inject.Inject; -import kotlin.Unit; - /** Platform implementation of the network controller. **/ @SysUISingleton public class NetworkControllerImpl extends BroadcastReceiver diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeUpGestureLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeUpGestureLogger.kt index 9ce6b02e55d9..a67c26c06cb9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeUpGestureLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/gesture/SwipeUpGestureLogger.kt @@ -18,8 +18,8 @@ package com.android.systemui.statusbar.gesture import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.dagger.SwipeUpLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import javax.inject.Inject /** Log messages for [SwipeUpGestureHandler]. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt index 3058fbbc1031..a3a72d92c2e4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.statusbar.notification import com.android.systemui.log.dagger.NotifInteractionLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.notification.collection.NotificationEntry import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt index dd3c2a9df3e5..f7679ed058c6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLogger.kt @@ -13,9 +13,9 @@ package com.android.systemui.statusbar.notification +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.DEBUG import com.android.systemui.log.dagger.NotificationLockscreenLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG import com.android.systemui.statusbar.StatusBarState import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/RemoteInputControllerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/RemoteInputControllerLogger.kt index 9582dfad35cd..487a5f87d0bd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/RemoteInputControllerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/RemoteInputControllerLogger.kt @@ -17,9 +17,9 @@ package com.android.systemui.statusbar.notification import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.DEBUG import com.android.systemui.log.dagger.NotificationRemoteInputLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG import javax.inject.Inject /** Logger class for [RemoteInputController]. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt index 76ff97ddb61b..212f2c215989 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt @@ -448,10 +448,3 @@ interface SourceType { } } } - -@Deprecated("Use SourceType.from() instead", ReplaceWith("SourceType.from()")) -enum class LegacySourceType : SourceType { - DefaultValue, - OnDismissAnimation, - OnScroll, -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescerLogger.kt index 68d1319699d4..39d0833c57d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coalescer/GroupCoalescerLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.statusbar.notification.collection.coalescer import com.android.systemui.log.dagger.NotificationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import javax.inject.Inject class GroupCoalescerLogger @Inject constructor( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinatorLogger.kt index 2919def16304..79c63e6b0db1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/GutsCoordinatorLogger.kt @@ -1,8 +1,8 @@ package com.android.systemui.statusbar.notification.collection.coordinator import com.android.systemui.log.dagger.NotificationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.notification.row.NotificationGuts import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt index 32c3c6665b6f..e17ce5cff37d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt @@ -3,8 +3,8 @@ package com.android.systemui.statusbar.notification.collection.coordinator import android.util.Log import com.android.systemui.log.dagger.NotificationHeadsUpLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import javax.inject.Inject private const val TAG = "HeadsUpCoordinator" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorLogger.kt index 6503a6403eaa..1f8ec3411bcd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorLogger.kt @@ -16,9 +16,9 @@ package com.android.systemui.statusbar.notification.collection.coordinator +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.log.dagger.UnseenNotificationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel import javax.inject.Inject private const val TAG = "KeyguardCoordinator" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorLogger.kt index 9558f47af795..6271d38f1efa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.statusbar.notification.collection.coordinator import com.android.systemui.log.dagger.NotificationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinatorLogger.kt index d80445491bda..1f4861a10e75 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinatorLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.statusbar.notification.collection.coordinator import com.android.systemui.log.dagger.NotificationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import javax.inject.Inject private const val TAG = "ShadeEventCoordinator" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/listbuilder/ShadeListBuilderLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/listbuilder/ShadeListBuilderLogger.kt index 4adc90aec0fb..f13ff6814df8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/listbuilder/ShadeListBuilderLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/listbuilder/ShadeListBuilderLogger.kt @@ -17,10 +17,10 @@ package com.android.systemui.statusbar.notification.collection.listbuilder import com.android.systemui.log.dagger.NotificationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogLevel.INFO -import com.android.systemui.plugins.log.LogLevel.WARNING +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.LogLevel.WARNING import com.android.systemui.statusbar.notification.NotifPipelineFlags import com.android.systemui.statusbar.notification.collection.GroupEntry import com.android.systemui.statusbar.notification.collection.ListEntry diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionLogger.kt index 911a2d0c2b36..20de785bc9bd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifCollectionLogger.kt @@ -21,12 +21,12 @@ import android.service.notification.NotificationListenerService import android.service.notification.NotificationListenerService.RankingMap import android.service.notification.StatusBarNotification import com.android.systemui.log.dagger.NotificationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogLevel.ERROR -import com.android.systemui.plugins.log.LogLevel.INFO -import com.android.systemui.plugins.log.LogLevel.WARNING -import com.android.systemui.plugins.log.LogLevel.WTF +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogLevel.ERROR +import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.LogLevel.WARNING +import com.android.systemui.log.LogLevel.WTF import com.android.systemui.statusbar.notification.collection.NotifCollection import com.android.systemui.statusbar.notification.collection.NotifCollection.CancellationReason import com.android.systemui.statusbar.notification.collection.NotifCollection.FutureDismissal diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderLogger.kt index 9c71e5c1054c..07fd349d3786 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.statusbar.notification.collection.render import com.android.systemui.log.dagger.NotificationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.notification.NotifPipelineFlags import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection import com.android.systemui.util.Compile diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewDifferLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewDifferLogger.kt index 1e22c2cd7c0e..a880b7157708 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewDifferLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewDifferLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.statusbar.notification.collection.render import com.android.systemui.log.dagger.NotificationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import java.lang.RuntimeException import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt index d4f11fc141f0..0b31265963ed 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/HeadsUpViewBinderLogger.kt @@ -1,8 +1,8 @@ package com.android.systemui.statusbar.notification.interruption import com.android.systemui.log.dagger.NotificationHeadsUpLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.INFO +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.INFO import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt index 115e050258c3..5bac2a9350a5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptLogger.kt @@ -19,10 +19,10 @@ package com.android.systemui.statusbar.notification.interruption import android.util.Log import com.android.systemui.log.dagger.NotificationInterruptLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogLevel.INFO -import com.android.systemui.plugins.log.LogLevel.WARNING +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.LogLevel.WARNING import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import com.android.systemui.util.Compile diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationRoundnessLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationRoundnessLogger.kt index 10197a38527e..fe03b2ad6a32 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationRoundnessLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationRoundnessLogger.kt @@ -16,9 +16,9 @@ package com.android.systemui.statusbar.notification.logging +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.INFO import com.android.systemui.log.dagger.NotificationRenderLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.INFO import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView import com.android.systemui.statusbar.notification.stack.NotificationSection diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java index 766ad88f8a55..66d4c3a97773 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java @@ -110,7 +110,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView protected Point mTargetPoint; private boolean mDismissed; private boolean mRefocusOnDismiss; - protected boolean mUseRoundnessSourceTypes; public ActivatableNotificationView(Context context, AttributeSet attrs) { super(context, attrs); @@ -709,18 +708,10 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView mTouchHandler = touchHandler; } - /** - * Enable the support for rounded corner based on the SourceType - * @param enabled true if is supported - */ - public void useRoundnessSourceTypes(boolean enabled) { - mUseRoundnessSourceTypes = enabled; - } - @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - if (mUseRoundnessSourceTypes && !mOnDetachResetRoundness.isEmpty()) { + if (!mOnDetachResetRoundness.isEmpty()) { for (SourceType sourceType : mOnDetachResetRoundness) { requestRoundnessReset(sourceType); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index e468a59d4eb1..597813344d6e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -87,7 +87,6 @@ import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.notification.AboveShelfChangedListener; import com.android.systemui.statusbar.notification.FeedbackIcon; import com.android.systemui.statusbar.notification.LaunchAnimationParameters; -import com.android.systemui.statusbar.notification.LegacySourceType; import com.android.systemui.statusbar.notification.NotificationFadeAware; import com.android.systemui.statusbar.notification.NotificationLaunchAnimatorController; import com.android.systemui.statusbar.notification.NotificationUtils; @@ -866,9 +865,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } onAttachedChildrenCountChanged(); row.setIsChildInGroup(false, null); - if (!mUseRoundnessSourceTypes) { - row.requestBottomRoundness(0.0f, LegacySourceType.DefaultValue, /* animate = */ false); - } } /** @@ -884,10 +880,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (child.keepInParentForDismissAnimation()) { mChildrenContainer.removeNotification(child); child.setIsChildInGroup(false, null); - if (!mUseRoundnessSourceTypes) { - LegacySourceType sourceType = LegacySourceType.DefaultValue; - child.requestBottomRoundness(0f, sourceType, /* animate = */ false); - } child.setKeepInParentForDismissAnimation(false); logKeepInParentChildDetached(child); childCountChanged = true; @@ -942,9 +934,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mNotificationParent.updateBackgroundForGroupState(); } updateBackgroundClipping(); - if (mUseRoundnessSourceTypes) { - updateBaseRoundness(); - } + updateBaseRoundness(); } @Override @@ -1054,15 +1044,13 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (isAboveShelf() != wasAboveShelf) { mAboveShelfChangedListener.onAboveShelfStateChanged(!wasAboveShelf); } - if (mUseRoundnessSourceTypes) { - if (pinned) { - // Should be animated if someone explicitly set it to 0 and the row is shown. - boolean animated = mAnimatePinnedRoundness && isShown(); - requestRoundness(/* top = */ 1f, /* bottom = */ 1f, PINNED, animated); - } else { - requestRoundnessReset(PINNED); - mAnimatePinnedRoundness = true; - } + if (pinned) { + // Should be animated if someone explicitly set it to 0 and the row is shown. + boolean animated = mAnimatePinnedRoundness && isShown(); + requestRoundness(/* top = */ 1f, /* bottom = */ 1f, PINNED, animated); + } else { + requestRoundnessReset(PINNED); + mAnimatePinnedRoundness = true; } } @@ -1879,7 +1867,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mChildrenContainer.setIsLowPriority(mIsLowPriority); mChildrenContainer.setContainingNotification(ExpandableNotificationRow.this); mChildrenContainer.onNotificationUpdated(); - mChildrenContainer.useRoundnessSourceTypes(mUseRoundnessSourceTypes); mTranslateableViews.add(mChildrenContainer); }); @@ -2308,24 +2295,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mBackgroundNormal.setExpandAnimationSize(params.getWidth(), actualHeight); } - @Override - public float getTopRoundness() { - if (!mUseRoundnessSourceTypes && mExpandAnimationRunning) { - return mTopRoundnessDuringLaunchAnimation; - } - - return super.getTopRoundness(); - } - - @Override - public float getBottomRoundness() { - if (!mUseRoundnessSourceTypes && mExpandAnimationRunning) { - return mBottomRoundnessDuringLaunchAnimation; - } - - return super.getBottomRoundness(); - } - public void setExpandAnimationRunning(boolean expandAnimationRunning) { if (expandAnimationRunning) { setAboveShelf(true); @@ -3481,18 +3450,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private void applyChildrenRoundness() { if (mIsSummaryWithChildren) { - if (mUseRoundnessSourceTypes) { - mChildrenContainer.requestRoundness( - /* top = */ getTopRoundness(), - /* bottom = */ getBottomRoundness(), - /* sourceType = */ FROM_PARENT, - /* animate = */ false); - } else { - mChildrenContainer.requestBottomRoundness( - getBottomRoundness(), - LegacySourceType.DefaultValue, - /* animate = */ false); - } + mChildrenContainer.requestRoundness( + /* top = */ getTopRoundness(), + /* bottom = */ getBottomRoundness(), + /* sourceType = */ FROM_PARENT, + /* animate = */ false); } } @@ -3709,24 +3671,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } - /** - * Enable the support for rounded corner based on the SourceType - * @param enabled true if is supported - */ - @Override - public void useRoundnessSourceTypes(boolean enabled) { - super.useRoundnessSourceTypes(enabled); - if (mChildrenContainer != null) { - mChildrenContainer.useRoundnessSourceTypes(mUseRoundnessSourceTypes); - } - } - @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - if (mUseRoundnessSourceTypes) { - updateBaseRoundness(); - } + updateBaseRoundness(); } /** Set whether this notification may show a snooze action. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java index 19c612ed21ff..1acc9f90b58f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java @@ -261,7 +261,6 @@ public class ExpandableNotificationRowController implements NotifViewController mStatusBarStateController.removeCallback(mStatusBarStateListener); } }); - mView.useRoundnessSourceTypes(true); } private final StatusBarStateController.StateListener mStatusBarStateListener = diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotifBindPipelineLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotifBindPipelineLogger.kt index 46fef3f973a7..45be0b151870 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotifBindPipelineLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotifBindPipelineLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.statusbar.notification.row import com.android.systemui.log.dagger.NotificationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.INFO +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.INFO import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowLogger.kt index ce11be36acf3..c3dd92a51a91 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowLogger.kt @@ -17,9 +17,9 @@ package com.android.systemui.statusbar.notification.row +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.log.dagger.NotificationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindStageLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindStageLogger.kt index 8a5d29a1ae2d..684a276ed635 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindStageLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowContentBindStageLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.statusbar.notification.row import com.android.systemui.log.dagger.NotificationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.INFO +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.INFO import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java index 9a777ea6230b..2c59c2e8a06f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java @@ -72,7 +72,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper imple private View mFeedbackIcon; private boolean mIsLowPriority; private boolean mTransformLowPriorityTitle; - private boolean mUseRoundnessSourceTypes; private RoundnessChangedListener mRoundnessChangedListener; protected NotificationHeaderViewWrapper(Context ctx, View view, ExpandableNotificationRow row) { @@ -122,7 +121,7 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper imple @Override public void applyRoundnessAndInvalidate() { - if (mUseRoundnessSourceTypes && mRoundnessChangedListener != null) { + if (mRoundnessChangedListener != null) { // We cannot apply the rounded corner to this View, so our parents (in drawChild()) will // clip our canvas. So we should invalidate our parent. mRoundnessChangedListener.applyRoundnessAndInvalidate(); @@ -377,15 +376,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper imple } /** - * Enable the support for rounded corner based on the SourceType - * - * @param enabled true if is supported - */ - public void useRoundnessSourceTypes(boolean enabled) { - mUseRoundnessSourceTypes = enabled; - } - - /** * Interface that handle the Roundness changes */ public interface RoundnessChangedListener { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/ui/viewbinder/NotificationShelfViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/ui/viewbinder/NotificationShelfViewBinder.kt index 81067157ca5b..12956ab9498a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/ui/viewbinder/NotificationShelfViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/ui/viewbinder/NotificationShelfViewBinder.kt @@ -81,7 +81,6 @@ object NotificationShelfViewBinder { ActivatableNotificationViewBinder.bind(viewModel, shelf, falsingManager) shelf.apply { setRefactorFlagEnabled(true) - useRoundnessSourceTypes(true) setSensitiveRevealAnimEndabled(featureFlags.isEnabled(Flags.SENSITIVE_REVEAL_ANIM)) // TODO(278765923): Replace with eventual NotificationIconContainerViewBinder#bind() notificationIconAreaController.setShelfIcons(shelfIcons) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java index 160a2309bfcc..d18757d3453f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java @@ -45,9 +45,7 @@ import com.android.internal.widget.NotificationExpandButton; import com.android.systemui.R; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.NotificationGroupingUtil; -import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.notification.FeedbackIcon; -import com.android.systemui.statusbar.notification.LegacySourceType; import com.android.systemui.statusbar.notification.NotificationFadeAware; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.Roundable; @@ -133,7 +131,6 @@ public class NotificationChildrenContainer extends ViewGroup private int mUntruncatedChildCount; private boolean mContainingNotificationIsFaded = false; private RoundableState mRoundableState; - private boolean mUseRoundnessSourceTypes; public NotificationChildrenContainer(Context context) { this(context, null); @@ -328,13 +325,6 @@ public class NotificationChildrenContainer extends ViewGroup row.setContentTransformationAmount(0, false /* isLastChild */); row.setNotificationFaded(mContainingNotificationIsFaded); - if (!mUseRoundnessSourceTypes) { - // This is a workaround, the NotificationShelf should be the owner of `OnScroll` - // roundness. - // Here we should reset the `OnScroll` roundness only on top-level rows. - NotificationShelf.resetLegacyOnScrollRoundness(row); - } - // It doesn't make sense to keep old animations around, lets cancel them! ExpandableViewState viewState = row.getViewState(); if (viewState != null) { @@ -342,9 +332,7 @@ public class NotificationChildrenContainer extends ViewGroup row.cancelAppearDrawing(); } - if (mUseRoundnessSourceTypes) { - applyRoundnessAndInvalidate(); - } + applyRoundnessAndInvalidate(); } private void ensureRemovedFromTransientContainer(View v) { @@ -379,10 +367,8 @@ public class NotificationChildrenContainer extends ViewGroup mGroupingUtil.restoreChildNotification(row); } - if (mUseRoundnessSourceTypes) { - row.requestRoundnessReset(FROM_PARENT, /* animate = */ false); - applyRoundnessAndInvalidate(); - } + row.requestRoundnessReset(FROM_PARENT, /* animate = */ false); + applyRoundnessAndInvalidate(); } /** @@ -409,10 +395,7 @@ public class NotificationChildrenContainer extends ViewGroup getContext(), mNotificationHeader, mContainingNotification); - mNotificationHeaderWrapper.useRoundnessSourceTypes(mUseRoundnessSourceTypes); - if (mUseRoundnessSourceTypes) { - mNotificationHeaderWrapper.setOnRoundnessChangedListener(this::invalidate); - } + mNotificationHeaderWrapper.setOnRoundnessChangedListener(this::invalidate); addView(mNotificationHeader, 0); invalidate(); } else { @@ -450,12 +433,7 @@ public class NotificationChildrenContainer extends ViewGroup getContext(), mNotificationHeaderLowPriority, mContainingNotification); - mNotificationHeaderWrapperLowPriority.useRoundnessSourceTypes( - mUseRoundnessSourceTypes - ); - if (mUseRoundnessSourceTypes) { - mNotificationHeaderWrapper.setOnRoundnessChangedListener(this::invalidate); - } + mNotificationHeaderWrapper.setOnRoundnessChangedListener(this::invalidate); addView(mNotificationHeaderLowPriority, 0); invalidate(); } else { @@ -891,7 +869,7 @@ public class NotificationChildrenContainer extends ViewGroup isCanvasChanged = true; canvas.save(); - if (mUseRoundnessSourceTypes && translation != 0f) { + if (translation != 0f) { clipPath.offset(translation, 0f); canvas.clipPath(clipPath); clipPath.offset(-translation, 0f); @@ -1444,40 +1422,30 @@ public class NotificationChildrenContainer extends ViewGroup @Override public void applyRoundnessAndInvalidate() { boolean last = true; - if (mUseRoundnessSourceTypes) { - if (mNotificationHeaderWrapper != null) { - mNotificationHeaderWrapper.requestTopRoundness( - /* value = */ getTopRoundness(), - /* sourceType = */ FROM_PARENT, - /* animate = */ false - ); - } - if (mNotificationHeaderWrapperLowPriority != null) { - mNotificationHeaderWrapperLowPriority.requestTopRoundness( - /* value = */ getTopRoundness(), - /* sourceType = */ FROM_PARENT, - /* animate = */ false - ); - } + if (mNotificationHeaderWrapper != null) { + mNotificationHeaderWrapper.requestTopRoundness( + /* value = */ getTopRoundness(), + /* sourceType = */ FROM_PARENT, + /* animate = */ false + ); + } + if (mNotificationHeaderWrapperLowPriority != null) { + mNotificationHeaderWrapperLowPriority.requestTopRoundness( + /* value = */ getTopRoundness(), + /* sourceType = */ FROM_PARENT, + /* animate = */ false + ); } for (int i = mAttachedChildren.size() - 1; i >= 0; i--) { ExpandableNotificationRow child = mAttachedChildren.get(i); if (child.getVisibility() == View.GONE) { continue; } - if (mUseRoundnessSourceTypes) { - child.requestRoundness( - /* top = */ 0f, - /* bottom = */ last ? getBottomRoundness() : 0f, - /* sourceType = */ FROM_PARENT, - /* animate = */ false); - } else { - child.requestRoundness( - /* top = */ 0f, - /* bottom = */ last ? getBottomRoundness() : 0f, - LegacySourceType.DefaultValue, - /* animate = */ isShown()); - } + child.requestRoundness( + /* top = */ 0f, + /* bottom = */ last ? getBottomRoundness() : 0f, + /* sourceType = */ FROM_PARENT, + /* animate = */ false); last = false; } Roundable.super.applyRoundnessAndInvalidate(); @@ -1537,15 +1505,6 @@ public class NotificationChildrenContainer extends ViewGroup return mNotificationHeaderWrapper; } - /** - * Enable the support for rounded corner based on the SourceType - * - * @param enabled true if is supported - */ - public void useRoundnessSourceTypes(boolean enabled) { - mUseRoundnessSourceTypes = enabled; - } - public String debugString() { return TAG + " { " + "visibility: " + getVisibility() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java index b6aec83ae600..fa1843e34305 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java @@ -16,22 +16,13 @@ package com.android.systemui.statusbar.notification.stack; -import android.content.res.Resources; -import android.util.MathUtils; - import androidx.annotation.NonNull; 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.statusbar.notification.LegacySourceType; -import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager; import com.android.systemui.statusbar.notification.Roundable; import com.android.systemui.statusbar.notification.SourceType; -import com.android.systemui.statusbar.notification.collection.NotificationEntry; -import com.android.systemui.statusbar.notification.logging.NotificationRoundnessLogger; -import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; import java.io.PrintWriter; @@ -48,63 +39,27 @@ public class NotificationRoundnessManager implements Dumpable { private static final String TAG = "NotificationRoundnessManager"; private static final SourceType DISMISS_ANIMATION = SourceType.from("DismissAnimation"); - private final ExpandableView[] mFirstInSectionViews; - private final ExpandableView[] mLastInSectionViews; - private final ExpandableView[] mTmpFirstInSectionViews; - private final ExpandableView[] mTmpLastInSectionViews; - private final NotificationRoundnessLogger mNotifLogger; private final DumpManager mDumpManager; - private boolean mExpanded; private HashSet<ExpandableView> mAnimatedChildren; - private Runnable mRoundingChangedCallback; - private ExpandableNotificationRow mTrackedHeadsUp; - private float mAppearFraction; private boolean mRoundForPulsingViews; private boolean mIsClearAllInProgress; private ExpandableView mSwipedView = null; private Roundable mViewBeforeSwipedView = null; private Roundable mViewAfterSwipedView = null; - private boolean mUseRoundnessSourceTypes; @Inject - NotificationRoundnessManager( - NotificationSectionsFeatureManager sectionsFeatureManager, - NotificationRoundnessLogger notifLogger, - DumpManager dumpManager) { - int numberOfSections = sectionsFeatureManager.getNumberOfBuckets(); - mFirstInSectionViews = new ExpandableView[numberOfSections]; - mLastInSectionViews = new ExpandableView[numberOfSections]; - mTmpFirstInSectionViews = new ExpandableView[numberOfSections]; - mTmpLastInSectionViews = new ExpandableView[numberOfSections]; - mNotifLogger = notifLogger; + NotificationRoundnessManager(DumpManager dumpManager) { mDumpManager = dumpManager; - mUseRoundnessSourceTypes = true; - mDumpManager.registerDumpable(TAG, this); } @Override public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { - pw.println("mFirstInSectionViews: length=" + mFirstInSectionViews.length); - pw.println(dumpViews(mFirstInSectionViews)); - pw.println("mLastInSectionViews: length=" + mLastInSectionViews.length); - pw.println(dumpViews(mFirstInSectionViews)); - if (mTrackedHeadsUp != null) { - pw.println("trackedHeadsUp=" + mTrackedHeadsUp.getEntry()); - } pw.println("roundForPulsingViews=" + mRoundForPulsingViews); pw.println("isClearAllInProgress=" + mIsClearAllInProgress); } - public void updateView(ExpandableView view, boolean animate) { - if (mUseRoundnessSourceTypes) return; - boolean changed = updateViewWithoutCallback(view, animate); - if (changed) { - mRoundingChangedCallback.run(); - } - } - public boolean isViewAffectedBySwipe(ExpandableView expandableView) { return expandableView != null && (expandableView == mSwipedView @@ -112,58 +67,6 @@ public class NotificationRoundnessManager implements Dumpable { || expandableView == mViewAfterSwipedView); } - boolean updateViewWithoutCallback( - ExpandableView view, - boolean animate) { - if (mUseRoundnessSourceTypes) return false; - if (view == null - || view == mViewBeforeSwipedView - || view == mViewAfterSwipedView) { - return false; - } - - final boolean isTopChanged = view.requestTopRoundness( - getRoundnessDefaultValue(view, true /* top */), - LegacySourceType.DefaultValue, - animate); - - final boolean isBottomChanged = view.requestBottomRoundness( - getRoundnessDefaultValue(view, /* top = */ false), - LegacySourceType.DefaultValue, - animate); - - final boolean isFirstInSection = isFirstInSection(view); - final boolean isLastInSection = isLastInSection(view); - - view.setFirstInSection(isFirstInSection); - view.setLastInSection(isLastInSection); - - mNotifLogger.onCornersUpdated(view, isFirstInSection, - isLastInSection, isTopChanged, isBottomChanged); - - return (isFirstInSection || isLastInSection) && (isTopChanged || isBottomChanged); - } - - private boolean isFirstInSection(ExpandableView view) { - if (mUseRoundnessSourceTypes) return false; - for (int i = 0; i < mFirstInSectionViews.length; i++) { - if (view == mFirstInSectionViews[i]) { - return true; - } - } - return false; - } - - private boolean isLastInSection(ExpandableView view) { - if (mUseRoundnessSourceTypes) return false; - for (int i = mLastInSectionViews.length - 1; i >= 0; i--) { - if (view == mLastInSectionViews[i]) { - return true; - } - } - return false; - } - void setViewsAffectedBySwipe( Roundable viewBefore, ExpandableView viewSwiped, @@ -177,34 +80,27 @@ public class NotificationRoundnessManager implements Dumpable { if (mSwipedView != null) oldViews.add(mSwipedView); if (mViewAfterSwipedView != null) oldViews.add(mViewAfterSwipedView); - final SourceType source; - if (mUseRoundnessSourceTypes) { - source = DISMISS_ANIMATION; - } else { - source = LegacySourceType.OnDismissAnimation; - } - mViewBeforeSwipedView = viewBefore; if (viewBefore != null) { oldViews.remove(viewBefore); - viewBefore.requestRoundness(/* top = */ 0f, /* bottom = */ 1f, source); + viewBefore.requestRoundness(/* top = */ 0f, /* bottom = */ 1f, DISMISS_ANIMATION); } mSwipedView = viewSwiped; if (viewSwiped != null) { oldViews.remove(viewSwiped); - viewSwiped.requestRoundness(/* top = */ 1f, /* bottom = */ 1f, source); + viewSwiped.requestRoundness(/* top = */ 1f, /* bottom = */ 1f, DISMISS_ANIMATION); } mViewAfterSwipedView = viewAfter; if (viewAfter != null) { oldViews.remove(viewAfter); - viewAfter.requestRoundness(/* top = */ 1f, /* bottom = */ 0f, source); + viewAfter.requestRoundness(/* top = */ 1f, /* bottom = */ 0f, DISMISS_ANIMATION); } // After setting the current Views, reset the views that are still present in the set. for (Roundable oldView : oldViews) { - oldView.requestRoundnessReset(source); + oldView.requestRoundnessReset(DISMISS_ANIMATION); } } @@ -226,143 +122,6 @@ public class NotificationRoundnessManager implements Dumpable { return mRoundForPulsingViews; } - private float getRoundnessDefaultValue(Roundable view, boolean top) { - if (mUseRoundnessSourceTypes) return 0f; - - if (view == null) { - return 0f; - } - if (view == mViewBeforeSwipedView - || view == mSwipedView - || view == mViewAfterSwipedView) { - return 1f; - } - if (view instanceof ExpandableNotificationRow - && ((ExpandableNotificationRow) view).canViewBeCleared() - && mIsClearAllInProgress) { - return 1.0f; - } - if (view instanceof ExpandableView) { - ExpandableView expandableView = (ExpandableView) view; - if ((expandableView.isPinned() - || (expandableView.isHeadsUpAnimatingAway()) && !mExpanded)) { - return 1.0f; - } - if (isFirstInSection(expandableView) && top) { - return 1.0f; - } - if (isLastInSection(expandableView) && !top) { - return 1.0f; - } - - if (view == mTrackedHeadsUp) { - // If we're pushing up on a headsup the appear fraction is < 0 and it needs to - // still be rounded. - return MathUtils.saturate(1.0f - mAppearFraction); - } - if (expandableView.showingPulsing() && mRoundForPulsingViews) { - return 1.0f; - } - if (expandableView.isChildInGroup()) { - return 0f; - } - final Resources resources = expandableView.getResources(); - return resources.getDimension(R.dimen.notification_corner_radius_small) - / resources.getDimension(R.dimen.notification_corner_radius); - } - return 0f; - } - - public void setExpanded(float expandedHeight, float appearFraction) { - if (mUseRoundnessSourceTypes) return; - mExpanded = expandedHeight != 0.0f; - mAppearFraction = appearFraction; - if (mTrackedHeadsUp != null) { - updateView(mTrackedHeadsUp, false /* animate */); - } - } - - public void updateRoundedChildren(NotificationSection[] sections) { - if (mUseRoundnessSourceTypes) return; - boolean anyChanged = false; - for (int i = 0; i < sections.length; i++) { - mTmpFirstInSectionViews[i] = mFirstInSectionViews[i]; - mTmpLastInSectionViews[i] = mLastInSectionViews[i]; - mFirstInSectionViews[i] = sections[i].getFirstVisibleChild(); - mLastInSectionViews[i] = sections[i].getLastVisibleChild(); - } - anyChanged |= handleRemovedOldViews(sections, mTmpFirstInSectionViews, true); - anyChanged |= handleRemovedOldViews(sections, mTmpLastInSectionViews, false); - anyChanged |= handleAddedNewViews(sections, mTmpFirstInSectionViews, true); - anyChanged |= handleAddedNewViews(sections, mTmpLastInSectionViews, false); - if (anyChanged) { - mRoundingChangedCallback.run(); - } - - mNotifLogger.onSectionCornersUpdated(sections, anyChanged); - } - - private boolean handleRemovedOldViews( - NotificationSection[] sections, - ExpandableView[] oldViews, - boolean first) { - if (mUseRoundnessSourceTypes) return false; - boolean anyChanged = false; - for (ExpandableView oldView : oldViews) { - if (oldView != null) { - boolean isStillPresent = false; - boolean adjacentSectionChanged = false; - for (NotificationSection section : sections) { - ExpandableView newView = - (first ? section.getFirstVisibleChild() - : section.getLastVisibleChild()); - if (newView == oldView) { - isStillPresent = true; - if (oldView.isFirstInSection() != isFirstInSection(oldView) - || oldView.isLastInSection() != isLastInSection(oldView)) { - adjacentSectionChanged = true; - } - break; - } - } - if (!isStillPresent || adjacentSectionChanged) { - anyChanged = true; - if (!oldView.isRemoved()) { - updateViewWithoutCallback(oldView, oldView.isShown()); - } - } - } - } - return anyChanged; - } - - private boolean handleAddedNewViews( - NotificationSection[] sections, - ExpandableView[] oldViews, - boolean first) { - if (mUseRoundnessSourceTypes) return false; - boolean anyChanged = false; - for (NotificationSection section : sections) { - ExpandableView newView = - (first ? section.getFirstVisibleChild() : section.getLastVisibleChild()); - if (newView != null) { - boolean wasAlreadyPresent = false; - for (ExpandableView oldView : oldViews) { - if (oldView == newView) { - wasAlreadyPresent = true; - break; - } - } - if (!wasAlreadyPresent) { - anyChanged = true; - updateViewWithoutCallback(newView, - newView.isShown() && !mAnimatedChildren.contains(newView)); - } - } - } - return anyChanged; - } - public void setAnimatedChildren(HashSet<ExpandableView> animatedChildren) { mAnimatedChildren = animatedChildren; } @@ -376,51 +135,7 @@ public class NotificationRoundnessManager implements Dumpable { return mAnimatedChildren.contains(view); } - public void setOnRoundingChangedCallback(Runnable roundingChangedCallback) { - mRoundingChangedCallback = roundingChangedCallback; - } - - public void setTrackingHeadsUp(ExpandableNotificationRow row) { - ExpandableNotificationRow previous = mTrackedHeadsUp; - mTrackedHeadsUp = row; - if (previous != null) { - updateView(previous, true /* animate */); - } - } - public void setShouldRoundPulsingViews(boolean shouldRoundPulsingViews) { mRoundForPulsingViews = shouldRoundPulsingViews; } - - private String dumpViews(ExpandableView[] views) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < views.length; i++) { - if (views[i] == null) continue; - - sb.append("\t") - .append("[").append(i).append("] ") - .append("isPinned=").append(views[i].isPinned()).append(" ") - .append("isFirstInSection=").append(views[i].isFirstInSection()).append(" ") - .append("isLastInSection=").append(views[i].isLastInSection()).append(" "); - - if (views[i] instanceof ExpandableNotificationRow) { - sb.append("entry="); - dumpEntry(((ExpandableNotificationRow) views[i]).getEntry(), sb); - } - - sb.append("\n"); - } - return sb.toString(); - } - - private void dumpEntry(NotificationEntry entry, StringBuilder sb) { - sb.append("NotificationEntry{key=").append(entry.getKey()).append(" "); - - if (entry.getSection() != null) { - sb.append(" section=") - .append(entry.getSection().getLabel()); - } - - sb.append("}"); - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsLogger.kt index b61c55edadcd..f9531876e30d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsLogger.kt @@ -18,8 +18,8 @@ package com.android.systemui.statusbar.notification.stack import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.dagger.NotificationSectionLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import javax.inject.Inject private const val TAG = "NotifSections" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt index 57b6dbce5398..fd064eeab2ab 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt @@ -52,8 +52,6 @@ class NotificationSectionsManager @Inject internal constructor( @SilentHeader private val silentHeaderController: SectionHeaderController ) : SectionProvider { - private val useRoundnessSourceTypes = true - private val configurationListener = object : ConfigurationController.ConfigurationListener { override fun onLocaleListChanged() { reinflateViews() @@ -193,35 +191,33 @@ class NotificationSectionsManager @Inject internal constructor( isSectionChanged || changed } - if (useRoundnessSourceTypes) { - val newFirstChildren = sections.mapNotNull { it.firstVisibleChild } - val newLastChildren = sections.mapNotNull { it.lastVisibleChild } + val newFirstChildren = sections.mapNotNull { it.firstVisibleChild } + val newLastChildren = sections.mapNotNull { it.lastVisibleChild } - // Update the roundness of Views that weren't already in the first/last position - newFirstChildren.forEach { firstChild -> - val wasFirstChild = oldFirstChildren.remove(firstChild) - if (!wasFirstChild) { - val notAnimatedChild = !notificationRoundnessManager.isAnimatedChild(firstChild) - val animated = firstChild.isShown && notAnimatedChild - firstChild.requestTopRoundness(1f, SECTION, animated) - } + // Update the roundness of Views that weren't already in the first/last position + newFirstChildren.forEach { firstChild -> + val wasFirstChild = oldFirstChildren.remove(firstChild) + if (!wasFirstChild) { + val notAnimatedChild = !notificationRoundnessManager.isAnimatedChild(firstChild) + val animated = firstChild.isShown && notAnimatedChild + firstChild.requestTopRoundness(1f, SECTION, animated) } - newLastChildren.forEach { lastChild -> - val wasLastChild = oldLastChildren.remove(lastChild) - if (!wasLastChild) { - val notAnimatedChild = !notificationRoundnessManager.isAnimatedChild(lastChild) - val animated = lastChild.isShown && notAnimatedChild - lastChild.requestBottomRoundness(1f, SECTION, animated) - } + } + newLastChildren.forEach { lastChild -> + val wasLastChild = oldLastChildren.remove(lastChild) + if (!wasLastChild) { + val notAnimatedChild = !notificationRoundnessManager.isAnimatedChild(lastChild) + val animated = lastChild.isShown && notAnimatedChild + lastChild.requestBottomRoundness(1f, SECTION, animated) } + } - // The Views left in the set are no longer in the first/last position - oldFirstChildren.forEach { noMoreFirstChild -> - noMoreFirstChild.requestTopRoundness(0f, SECTION) - } - oldLastChildren.forEach { noMoreLastChild -> - noMoreLastChild.requestBottomRoundness(0f, SECTION) - } + // The Views left in the set are no longer in the first/last position + oldFirstChildren.forEach { noMoreFirstChild -> + noMoreFirstChild.requestTopRoundness(0f, SECTION) + } + oldLastChildren.forEach { noMoreLastChild -> + noMoreLastChild.requestBottomRoundness(0f, SECTION) } if (DEBUG) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index abcb825c3e18..edff8770479a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -200,7 +200,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable private Set<Integer> mDebugTextUsedYPositions; private final boolean mDebugRemoveAnimation; private final boolean mSimplifiedAppearFraction; - private final boolean mUseRoundnessSourceTypes; private final boolean mSensitiveRevealAnimEndabled; private boolean mAnimatedInsets; @@ -625,7 +624,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable mDebugLines = featureFlags.isEnabled(Flags.NSSL_DEBUG_LINES); mDebugRemoveAnimation = featureFlags.isEnabled(Flags.NSSL_DEBUG_REMOVE_ANIMATION); mSimplifiedAppearFraction = featureFlags.isEnabled(Flags.SIMPLIFIED_APPEAR_FRACTION); - mUseRoundnessSourceTypes = true; mSensitiveRevealAnimEndabled = featureFlags.isEnabled(Flags.SENSITIVE_REVEAL_ANIM); setAnimatedInsetsEnabled(featureFlags.isEnabled(Flags.ANIMATED_NOTIFICATION_SHADE_INSETS)); mSectionsManager = Dependency.get(NotificationSectionsManager.class); @@ -3134,10 +3132,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable mAnimateNextSectionBoundsChange = false; } mAmbientState.setLastVisibleBackgroundChild(lastChild); - if (!mUseRoundnessSourceTypes) { - // TODO: Refactor SectionManager and put the RoundnessManager there. - mController.getNotificationRoundnessManager().updateRoundedChildren(mSections); - } mAnimateBottomOnLayout = false; invalidate(); } @@ -3584,9 +3578,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable @ShadeViewRefactor(RefactorComponent.LAYOUT_ALGORITHM) protected StackScrollAlgorithm createStackScrollAlgorithm(Context context) { - StackScrollAlgorithm stackScrollAlgorithm = new StackScrollAlgorithm(context, this); - stackScrollAlgorithm.useRoundnessSourceTypes(mUseRoundnessSourceTypes); - return stackScrollAlgorithm; + return new StackScrollAlgorithm(context, this); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java index d96a2cd4f760..7b046d6c9256 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java @@ -192,7 +192,6 @@ public class NotificationStackScrollLayoutController { private int mBarState; private HeadsUpAppearanceController mHeadsUpAppearanceController; private final FeatureFlags mFeatureFlags; - private final boolean mUseRoundnessSourceTypes; private final NotificationTargetsHelper mNotificationTargetsHelper; private final SecureSettings mSecureSettings; private final NotificationDismissibilityProvider mDismissibilityProvider; @@ -591,36 +590,12 @@ public class NotificationStackScrollLayoutController { } @Override - public void onHeadsUpPinned(NotificationEntry entry) { - if (!mUseRoundnessSourceTypes) { - mNotificationRoundnessManager.updateView( - entry.getRow(), - /* animate = */ false); - } - } - - @Override - public void onHeadsUpUnPinned(NotificationEntry entry) { - if (!mUseRoundnessSourceTypes) { - ExpandableNotificationRow row = entry.getRow(); - // update the roundedness posted, because we might be animating away the - // headsup soon, so no need to set the roundedness to 0 and then back to 1. - row.post(() -> mNotificationRoundnessManager.updateView(row, - true /* animate */)); - } - } - - @Override public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) { long numEntries = mHeadsUpManager.getAllEntries().count(); NotificationEntry topEntry = mHeadsUpManager.getTopEntry(); mView.setNumHeadsUp(numEntries); mView.setTopHeadsUpEntry(topEntry); generateHeadsUpAnimation(entry, isHeadsUp); - if (!mUseRoundnessSourceTypes) { - ExpandableNotificationRow row = entry.getRow(); - mNotificationRoundnessManager.updateView(row, true /* animate */); - } } }; @@ -720,7 +695,6 @@ public class NotificationStackScrollLayoutController { mShadeController = shadeController; mNotifIconAreaController = notifIconAreaController; mFeatureFlags = featureFlags; - mUseRoundnessSourceTypes = true; mNotificationTargetsHelper = notificationTargetsHelper; mSecureSettings = secureSettings; mDismissibilityProvider = dismissibilityProvider; @@ -788,11 +762,6 @@ public class NotificationStackScrollLayoutController { mLockscreenUserManager.addUserChangedListener(mLockscreenUserChangeListener); - if (!mUseRoundnessSourceTypes) { - mNotificationRoundnessManager.setOnRoundingChangedCallback(mView::invalidate); - mView.addOnExpandedHeightChangedListener(mNotificationRoundnessManager::setExpanded); - } - mVisibilityLocationProviderDelegator.setDelegate(this::isInVisibleLocation); mTunerService.addTunable( @@ -958,7 +927,6 @@ public class NotificationStackScrollLayoutController { public void setTrackingHeadsUp(ExpandableNotificationRow expandableNotificationRow) { mView.setTrackingHeadsUp(expandableNotificationRow); - mNotificationRoundnessManager.setTrackingHeadsUp(expandableNotificationRow); } public void wakeUpFromPulse() { @@ -1776,9 +1744,6 @@ public class NotificationStackScrollLayoutController { @Override public void bindRow(ExpandableNotificationRow row) { row.setHeadsUpAnimatingAwayListener(animatingAway -> { - if (!mUseRoundnessSourceTypes) { - mNotificationRoundnessManager.updateView(row, false); - } NotificationEntry entry = row.getEntry(); mHeadsUpAppearanceController.updateHeader(entry); mHeadsUpAppearanceController.updateHeadsUpAndPulsingRoundness(entry); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt index 64dd6dcd3008..5b0ec1d14edc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt @@ -1,9 +1,9 @@ package com.android.systemui.statusbar.notification.stack import com.android.systemui.log.dagger.NotificationHeadsUpLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogLevel.INFO +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogLevel.INFO import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_ADD diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java index 2d0a6cf8e5a7..993c3801cecd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java @@ -68,7 +68,6 @@ class NotificationSwipeHelper extends SwipeHelper implements NotificationSwipeAc private boolean mIsExpanded; private boolean mPulsing; private final NotificationRoundnessManager mNotificationRoundnessManager; - private final boolean mUseRoundnessSourceTypes; NotificationSwipeHelper( Resources resources, @@ -80,7 +79,6 @@ class NotificationSwipeHelper extends SwipeHelper implements NotificationSwipeAc NotificationRoundnessManager notificationRoundnessManager) { super(callback, resources, viewConfiguration, falsingManager, featureFlags); mNotificationRoundnessManager = notificationRoundnessManager; - mUseRoundnessSourceTypes = true; mMenuListener = menuListener; mCallback = callback; mFalsingCheck = () -> resetExposedMenuView(true /* animate */, true /* force */); @@ -322,8 +320,7 @@ class NotificationSwipeHelper extends SwipeHelper implements NotificationSwipeAc protected void prepareDismissAnimation(View view, Animator anim) { super.prepareDismissAnimation(view, anim); - if (mUseRoundnessSourceTypes - && view instanceof ExpandableNotificationRow + if (view instanceof ExpandableNotificationRow && mNotificationRoundnessManager.isClearAllInProgress()) { ExpandableNotificationRow row = (ExpandableNotificationRow) view; anim.addListener(new AnimatorListenerAdapter() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationTargetsHelper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationTargetsHelper.kt index cd0c1b153816..02662f409a87 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationTargetsHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationTargetsHelper.kt @@ -4,7 +4,6 @@ import androidx.core.view.children import androidx.core.view.isVisible import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FeatureFlags -import com.android.systemui.flags.Flags import com.android.systemui.statusbar.notification.Roundable import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView @@ -20,7 +19,6 @@ class NotificationTargetsHelper constructor( featureFlags: FeatureFlags, ) { - private val useRoundnessSourceTypes = true /** * This method looks for views that can be rounded (and implement [Roundable]) during a @@ -48,10 +46,6 @@ constructor( if (notificationParent != null && childrenContainer != null) { // We are inside a notification group - if (!useRoundnessSourceTypes) { - return RoundableTargets(null, null, null) - } - val visibleGroupChildren = childrenContainer.attachedChildren.filter { it.isVisible } val indexOfParentSwipedView = visibleGroupChildren.indexOf(viewSwiped) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index 306047388381..92d767a419f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -34,7 +34,6 @@ import com.android.systemui.flags.Flags; import com.android.systemui.shade.transition.LargeScreenShadeInterpolator; import com.android.systemui.statusbar.EmptyShadeView; import com.android.systemui.statusbar.NotificationShelf; -import com.android.systemui.statusbar.notification.LegacySourceType; import com.android.systemui.statusbar.notification.SourceType; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -75,7 +74,6 @@ public class StackScrollAlgorithm { private float mQuickQsOffsetHeight; private float mSmallCornerRadius; private float mLargeCornerRadius; - private boolean mUseRoundnessSourceTypes; public StackScrollAlgorithm( Context context, @@ -836,12 +834,8 @@ public class StackScrollAlgorithm { row.isLastInSection() ? 1f : (mSmallCornerRadius / mLargeCornerRadius); final float bottomValue = computeCornerRoundnessForPinnedHun(mHostView.getHeight(), ambientState.getStackY(), getMaxAllowedChildHeight(row), originalCornerRadius); - if (mUseRoundnessSourceTypes) { - row.requestBottomRoundness(bottomValue, STACK_SCROLL_ALGO); - row.addOnDetachResetRoundness(STACK_SCROLL_ALGO); - } else { - row.requestBottomRoundness(bottomValue, LegacySourceType.OnScroll); - } + row.requestBottomRoundness(bottomValue, STACK_SCROLL_ALGO); + row.addOnDetachResetRoundness(STACK_SCROLL_ALGO); } @VisibleForTesting @@ -979,14 +973,6 @@ public class StackScrollAlgorithm { this.mIsExpanded = isExpanded; } - /** - * Enable the support for rounded corner based on the SourceType - * @param enabled true if is supported - */ - public void useRoundnessSourceTypes(boolean enabled) { - mUseRoundnessSourceTypes = enabled; - } - public static class StackScrollAlgorithmState { /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateLogger.kt index f5de678a8536..cca84b3330a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateLogger.kt @@ -1,8 +1,8 @@ package com.android.systemui.statusbar.notification.stack import com.android.systemui.log.dagger.NotificationHeadsUpLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java index 0c4821c003dd..f15dcc310837 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java @@ -76,7 +76,6 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar private final DarkIconDispatcher mDarkIconDispatcher; private final ShadeViewController mShadeViewController; private final NotificationRoundnessManager mNotificationRoundnessManager; - private final boolean mUseRoundnessSourceTypes; private final Consumer<ExpandableNotificationRow> mSetTrackingHeadsUp = this::setTrackingHeadsUp; private final BiConsumer<Float, Float> mSetExpandedHeight = this::setAppearFraction; @@ -124,7 +123,6 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar super(headsUpStatusBarView); mNotificationIconAreaController = notificationIconAreaController; mNotificationRoundnessManager = notificationRoundnessManager; - mUseRoundnessSourceTypes = true; mHeadsUpManager = headsUpManager; // We may be mid-HUN-expansion when this controller is re-created (for example, if the user @@ -405,21 +403,19 @@ public class HeadsUpAppearanceController extends ViewController<HeadsUpStatusBar * @param entry target notification */ public void updateHeadsUpAndPulsingRoundness(NotificationEntry entry) { - if (mUseRoundnessSourceTypes) { - ExpandableNotificationRow row = entry.getRow(); - boolean isTrackedChild = row == mTrackedChild; - if (row.isPinned() || row.isHeadsUpAnimatingAway() || isTrackedChild) { - float roundness = MathUtils.saturate(1f - mAppearFraction); - row.requestRoundness(roundness, roundness, HEADS_UP); + ExpandableNotificationRow row = entry.getRow(); + boolean isTrackedChild = row == mTrackedChild; + if (row.isPinned() || row.isHeadsUpAnimatingAway() || isTrackedChild) { + float roundness = MathUtils.saturate(1f - mAppearFraction); + row.requestRoundness(roundness, roundness, HEADS_UP); + } else { + row.requestRoundnessReset(HEADS_UP); + } + if (mNotificationRoundnessManager.shouldRoundNotificationPulsing()) { + if (row.showingPulsing()) { + row.requestRoundness(/* top = */ 1f, /* bottom = */ 1f, PULSING); } else { - row.requestRoundnessReset(HEADS_UP); - } - if (mNotificationRoundnessManager.shouldRoundNotificationPulsing()) { - if (row.showingPulsing()) { - row.requestRoundness(/* top = */ 1f, /* bottom = */ 1f, PULSING); - } else { - row.requestRoundnessReset(PULSING); - } + row.requestRoundnessReset(PULSING); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java index e835c5cebbc3..12ed71bf14d1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java @@ -45,7 +45,7 @@ import com.android.systemui.R; import com.android.systemui.animation.InterpolatorsAndroidX; import com.android.systemui.battery.BatteryMeterViewController; import com.android.systemui.dagger.qualifiers.Main; -import com.android.systemui.plugins.log.LogLevel; +import com.android.systemui.log.LogLevel; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shade.ShadeViewStateProvider; import com.android.systemui.statusbar.CommandQueue; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt index 4839fe6a7bef..5c357d7cd3ab 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt @@ -20,8 +20,8 @@ import android.util.DisplayMetrics import android.view.View import com.android.internal.logging.nano.MetricsProto.MetricsEvent import com.android.systemui.log.dagger.LSShadeTransitionLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView import javax.inject.Inject 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/phone/StatusBarNotificationActivityStarterLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt index 1f0b96a58da6..12f023b21701 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt @@ -18,11 +18,11 @@ package com.android.systemui.statusbar.phone import android.app.PendingIntent import com.android.systemui.log.dagger.NotifInteractionLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogLevel.ERROR -import com.android.systemui.plugins.log.LogLevel.INFO -import com.android.systemui.plugins.log.LogLevel.WARNING +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogLevel.ERROR +import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.LogLevel.WARNING import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLogger.kt index d64bc58a0c37..0c86b51a4995 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.statusbar.phone.fragment import com.android.systemui.log.dagger.CollapsedSbFragmentLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.disableflags.DisableFlagsLogger import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt index b3d246164e87..19c77e0b0de3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt @@ -22,7 +22,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBufferFactory import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.log.table.TableLogBufferFactory -import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.log.LogBuffer import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepositoryImpl import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/MobileInputLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/MobileInputLogger.kt index 68cbbceb056d..b3a1c4075d87 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/MobileInputLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/MobileInputLogger.kt @@ -22,8 +22,8 @@ import android.telephony.TelephonyDisplayInfo import com.android.settingslib.SignalIcon import com.android.settingslib.mobile.MobileMappings import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.pipeline.dagger.MobileInputLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileViewLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileViewLogger.kt index f2f91430eba6..7e0c145696c9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileViewLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileViewLogger.kt @@ -20,8 +20,8 @@ import android.view.View import com.android.systemui.Dumpable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.pipeline.dagger.MobileViewLog import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.LocationBasedMobileViewModel import java.io.PrintWriter diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/VerboseMobileViewLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/VerboseMobileViewLogger.kt index f67bc8f14447..507549b1e234 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/VerboseMobileViewLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/VerboseMobileViewLogger.kt @@ -19,8 +19,8 @@ package com.android.systemui.statusbar.pipeline.mobile.ui import android.view.View import com.android.systemui.common.shared.model.Icon import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.pipeline.dagger.VerboseMobileViewLog import com.android.systemui.statusbar.pipeline.mobile.ui.MobileViewLogger.Companion.getIdForLogging import com.android.systemui.statusbar.pipeline.mobile.ui.model.SignalIconModel diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityInputLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityInputLogger.kt index 82492babba46..051f43f1059c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityInputLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityInputLogger.kt @@ -19,8 +19,8 @@ package com.android.systemui.statusbar.pipeline.shared import android.net.Network import android.net.NetworkCapabilities import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.pipeline.dagger.SharedConnectivityInputLog import com.android.systemui.statusbar.pipeline.shared.data.model.DefaultConnectionModel import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/LoggerHelper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/LoggerHelper.kt index a96e8ff20dd4..328d901b541d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/LoggerHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/LoggerHelper.kt @@ -18,8 +18,8 @@ package com.android.systemui.statusbar.pipeline.shared import android.net.Network import android.net.NetworkCapabilities -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel /** Helper object for logs that are shared between wifi and mobile. */ object LoggerHelper { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/model/DefaultConnectionModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/model/DefaultConnectionModel.kt index 2a02687f0761..058eda4400df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/model/DefaultConnectionModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/data/model/DefaultConnectionModel.kt @@ -17,7 +17,7 @@ package com.android.systemui.statusbar.pipeline.shared.data.model import android.net.NetworkCapabilities -import com.android.systemui.plugins.log.LogMessage +import com.android.systemui.log.LogMessage /** * A model for all of the current default connections(s). diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/shared/WifiInputLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/shared/WifiInputLogger.kt index bb0b166f7aba..4a9ceacb0bd1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/shared/WifiInputLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/shared/WifiInputLogger.kt @@ -19,8 +19,8 @@ package com.android.systemui.statusbar.pipeline.wifi.shared import android.net.Network import android.net.NetworkCapabilities import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.statusbar.pipeline.dagger.WifiInputLog import com.android.systemui.statusbar.pipeline.shared.LoggerHelper import javax.inject.Inject 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/src/com/android/systemui/statusbar/policy/DeviceStateRotationLockSettingControllerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceStateRotationLockSettingControllerLogger.kt index aa502bc48149..6ba2a81b4b13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceStateRotationLockSettingControllerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceStateRotationLockSettingControllerLogger.kt @@ -21,9 +21,9 @@ import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_LOCK_LOCKED import android.provider.Settings.Secure.DEVICE_STATE_ROTATION_LOCK_UNLOCKED import com.android.internal.R +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.VERBOSE import com.android.systemui.log.dagger.DeviceStateAutoRotationLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.VERBOSE import javax.inject.Inject class DeviceStateRotationLockSettingControllerLogger @@ -34,6 +34,8 @@ constructor(@DeviceStateAutoRotationLog private val logBuffer: LogBuffer, contex private val halfFoldedStates = context.resources.getIntArray(R.array.config_halfFoldedDeviceStates) private val unfoldedStates = context.resources.getIntArray(R.array.config_openDeviceStates) + private val rearDisplayStates = + context.resources.getIntArray(R.array.config_rearDisplayDeviceStates) fun logListeningChange(listening: Boolean) { logBuffer.log(TAG, VERBOSE, { bool1 = listening }, { "setListening: $bool1" }) @@ -122,6 +124,7 @@ constructor(@DeviceStateAutoRotationLog private val logBuffer: LogBuffer, contex in foldedStates -> "Folded" in unfoldedStates -> "Unfolded" in halfFoldedStates -> "Half-Folded" + in rearDisplayStates -> "Rear display" -1 -> "Uninitialized" else -> "Unknown" } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt index df1e80b78c9b..06ed1fd279b5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt @@ -17,9 +17,9 @@ package com.android.systemui.statusbar.policy import com.android.systemui.log.dagger.NotificationHeadsUpLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel.INFO -import com.android.systemui.plugins.log.LogLevel.VERBOSE +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel.INFO +import com.android.systemui.log.LogLevel.VERBOSE import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewLogger.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewLogger.kt index 667e22a82a2a..066ac04c2727 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.temporarydisplay import android.view.View -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel /** A logger for temporary view changes -- see [TemporaryViewDisplayController]. */ open class TemporaryViewLogger<T : TemporaryViewInfo>( diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarLogger.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarLogger.kt index f23942847e68..d55751b9d8a0 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.temporarydisplay.chipbar import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import com.android.systemui.temporarydisplay.TemporaryViewLogger import com.android.systemui.temporarydisplay.dagger.ChipbarLog import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/TemporaryDisplayModule.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/TemporaryDisplayModule.kt index b1be4045eb43..cae13086f592 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/TemporaryDisplayModule.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/TemporaryDisplayModule.kt @@ -18,9 +18,9 @@ package com.android.systemui.temporarydisplay.dagger import android.content.Context import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogBufferFactory import com.android.systemui.media.taptotransfer.MediaTttFlags -import com.android.systemui.plugins.log.LogBuffer import com.android.systemui.settings.DisplayTracker import com.android.systemui.statusbar.gesture.SwipeUpGestureLogger import com.android.systemui.temporarydisplay.chipbar.SwipeChipbarAwayGestureHandler diff --git a/packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt b/packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt index 6026d2cb6858..f0fa779ba0cf 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt +++ b/packages/SystemUI/src/com/android/systemui/theme/DynamicColors.kt @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.systemui.theme import android.util.Pair @@ -24,68 +25,73 @@ class DynamicColors { @JvmField val ALL_DYNAMIC_COLORS_MAPPED: List<Pair<String, DynamicColor>> = arrayListOf( - Pair.create("primary_container", MDC.primaryContainer), - Pair.create("on_primary_container", MDC.onPrimaryContainer), - Pair.create("primary", MDC.primary), - Pair.create("on_primary", MDC.onPrimary), - Pair.create("secondary_container", MDC.secondaryContainer), - Pair.create("on_secondary_container", MDC.onSecondaryContainer), - Pair.create("secondary", MDC.secondary), - Pair.create("on_secondary", MDC.onSecondary), - Pair.create("tertiary_container", MDC.tertiaryContainer), - Pair.create("on_tertiary_container", MDC.onTertiaryContainer), - Pair.create("tertiary", MDC.tertiary), - Pair.create("on_tertiary", MDC.onTertiary), - Pair.create("background", MDC.background), - Pair.create("on_background", MDC.onBackground), - Pair.create("surface", MDC.surface), - Pair.create("on_surface", MDC.onSurface), - Pair.create("surface_container_low", MDC.surfaceContainerLow), - Pair.create("surface_container_lowest", MDC.surfaceContainerLowest), - Pair.create("surface_container", MDC.surfaceContainer), - Pair.create("surface_container_high", MDC.surfaceContainerHigh), - Pair.create("surface_container_highest", MDC.surfaceContainerHighest), - Pair.create("surface_bright", MDC.surfaceBright), - Pair.create("surface_dim", MDC.surfaceDim), - Pair.create("surface_variant", MDC.surfaceVariant), - Pair.create("on_surface_variant", MDC.onSurfaceVariant), - Pair.create("outline", MDC.outline), - Pair.create("outline_variant", MDC.outlineVariant), - Pair.create("error", MDC.error), - Pair.create("on_error", MDC.onError), - Pair.create("error_container", MDC.errorContainer), - Pair.create("on_error_container", MDC.onErrorContainer), - Pair.create("primary_fixed", MDC.primaryFixed), - Pair.create("primary_fixed_dim", MDC.primaryFixedDim), - Pair.create("on_primary_fixed", MDC.onPrimaryFixed), - Pair.create("on_primary_fixed_variant", MDC.onPrimaryFixedVariant), - Pair.create("secondary_fixed", MDC.secondaryFixed), - Pair.create("secondary_fixed_dim", MDC.secondaryFixedDim), - Pair.create("on_secondary_fixed", MDC.onSecondaryFixed), - Pair.create("on_secondary_fixed_variant", MDC.onSecondaryFixedVariant), - Pair.create("tertiary_fixed", MDC.tertiaryFixed), - Pair.create("tertiary_fixed_dim", MDC.tertiaryFixedDim), - Pair.create("on_tertiary_fixed", MDC.onTertiaryFixed), - Pair.create("on_tertiary_fixed_variant", MDC.onTertiaryFixedVariant), - Pair.create("control_activated", MDC.controlActivated), - Pair.create("control_normal", MDC.controlNormal), - Pair.create("control_highlight", MDC.controlHighlight), - Pair.create("text_primary_inverse", MDC.textPrimaryInverse), + Pair.create("primary_container", MDC.primaryContainer()), + Pair.create("on_primary_container", MDC.onPrimaryContainer()), + Pair.create("primary", MDC.primary()), + Pair.create("on_primary", MDC.onPrimary()), + Pair.create("secondary_container", MDC.secondaryContainer()), + Pair.create("on_secondary_container", MDC.onSecondaryContainer()), + Pair.create("secondary", MDC.secondary()), + Pair.create("on_secondary", MDC.onSecondary()), + Pair.create("tertiary_container", MDC.tertiaryContainer()), + Pair.create("on_tertiary_container", MDC.onTertiaryContainer()), + Pair.create("tertiary", MDC.tertiary()), + Pair.create("on_tertiary", MDC.onTertiary()), + Pair.create("background", MDC.background()), + Pair.create("on_background", MDC.onBackground()), + Pair.create("surface", MDC.surface()), + Pair.create("on_surface", MDC.onSurface()), + Pair.create("surface_container_low", MDC.surfaceContainerLow()), + Pair.create("surface_container_lowest", MDC.surfaceContainerLowest()), + Pair.create("surface_container", MDC.surfaceContainer()), + Pair.create("surface_container_high", MDC.surfaceContainerHigh()), + Pair.create("surface_container_highest", MDC.surfaceContainerHighest()), + Pair.create("surface_bright", MDC.surfaceBright()), + Pair.create("surface_dim", MDC.surfaceDim()), + Pair.create("surface_variant", MDC.surfaceVariant()), + Pair.create("on_surface_variant", MDC.onSurfaceVariant()), + Pair.create("outline", MDC.outline()), + Pair.create("error", MDC.error()), + Pair.create("on_error", MDC.onError()), + Pair.create("error_container", MDC.errorContainer()), + Pair.create("on_error_container", MDC.onErrorContainer()), + Pair.create("primary_fixed", MDC.primaryFixed()), + Pair.create("primary_fixed_dim", MDC.primaryFixedDim()), + Pair.create("on_primary_fixed", MDC.onPrimaryFixed()), + Pair.create("on_primary_fixed_variant", MDC.onPrimaryFixedVariant()), + Pair.create("secondary_fixed", MDC.secondaryFixed()), + Pair.create("secondary_fixed_dim", MDC.secondaryFixedDim()), + Pair.create("on_secondary_fixed", MDC.onSecondaryFixed()), + Pair.create("on_secondary_fixed_variant", MDC.onSecondaryFixedVariant()), + Pair.create("tertiary_fixed", MDC.tertiaryFixed()), + Pair.create("tertiary_fixed_dim", MDC.tertiaryFixedDim()), + Pair.create("on_tertiary_fixed", MDC.onTertiaryFixed()), + Pair.create("on_tertiary_fixed_variant", MDC.onTertiaryFixedVariant()), + Pair.create("control_activated", MDC.controlActivated()), + Pair.create("control_normal", MDC.controlNormal()), + Pair.create("control_highlight", MDC.controlHighlight()), + Pair.create("text_primary_inverse", MDC.textPrimaryInverse()), Pair.create( "text_secondary_and_tertiary_inverse", - MDC.textSecondaryAndTertiaryInverse + MDC.textSecondaryAndTertiaryInverse() + ), + Pair.create( + "text_primary_inverse_disable_only", + MDC.textPrimaryInverseDisableOnly() ), - Pair.create("text_primary_inverse_disable_only", MDC.textPrimaryInverseDisableOnly), Pair.create( "text_secondary_and_tertiary_inverse_disabled", - MDC.textSecondaryAndTertiaryInverseDisabled + MDC.textSecondaryAndTertiaryInverseDisabled() ), - Pair.create("text_hint_inverse", MDC.textHintInverse), - Pair.create("palette_key_color_primary", MDC.primaryPaletteKeyColor), - Pair.create("palette_key_color_secondary", MDC.secondaryPaletteKeyColor), - Pair.create("palette_key_color_tertiary", MDC.tertiaryPaletteKeyColor), - Pair.create("palette_key_color_neutral", MDC.neutralPaletteKeyColor), - Pair.create("palette_key_color_neutral_variant", MDC.neutralVariantPaletteKeyColor) + Pair.create("text_hint_inverse", MDC.textHintInverse()), + Pair.create("palette_key_color_primary", MDC.primaryPaletteKeyColor()), + Pair.create("palette_key_color_secondary", MDC.secondaryPaletteKeyColor()), + Pair.create("palette_key_color_tertiary", MDC.tertiaryPaletteKeyColor()), + Pair.create("palette_key_color_neutral", MDC.neutralPaletteKeyColor()), + Pair.create( + "palette_key_color_neutral_variant", + MDC.neutralVariantPaletteKeyColor() + ) ) } } diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java index faae8df44ed9..43d15bcc22b3 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.android.systemui.theme; import static android.util.TypedValue.TYPE_INT_COLOR_ARGB8; @@ -659,9 +660,9 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { && res.getColor(android.R.color.system_neutral2_500, theme) == mColorScheme.getNeutral2().getS500() && res.getColor(android.R.color.system_primary_container_dark, theme) - == MaterialDynamicColors.primaryContainer.getArgb(mDynamicSchemeDark) + == MaterialDynamicColors.primaryContainer().getArgb(mDynamicSchemeDark) && res.getColor(android.R.color.system_primary_container_light, theme) - == MaterialDynamicColors.primaryContainer.getArgb(mDynamicSchemeLight))) { + == MaterialDynamicColors.primaryContainer().getArgb(mDynamicSchemeLight))) { return false; } } diff --git a/packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt b/packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt index fda511433143..dfe748afbd41 100644 --- a/packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt @@ -17,10 +17,10 @@ package com.android.systemui.toast import com.android.systemui.log.dagger.ToastLog -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.plugins.log.LogLevel.DEBUG -import com.android.systemui.plugins.log.LogMessage +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel +import com.android.systemui.log.LogLevel.DEBUG +import com.android.systemui.log.LogMessage import javax.inject.Inject private const val TAG = "ToastLog" diff --git a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLockLog.java b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLockLog.java index 59cb0525a7e9..9cebc330af12 100644 --- a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLockLog.java +++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLockLog.java @@ -18,7 +18,7 @@ package com.android.systemui.util.wakelock; import static java.lang.annotation.RetentionPolicy.RUNTIME; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLockLogger.kt b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLockLogger.kt index 951903dc29bd..09268007dddc 100644 --- a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLockLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLockLogger.kt @@ -17,8 +17,8 @@ package com.android.systemui.util.wakelock import android.os.PowerManager -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel import javax.inject.Inject class WakeLockLogger @Inject constructor(@WakeLockLog private val buffer: LogBuffer) { diff --git a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt index 8f4b32006919..19d5278932c2 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt @@ -35,7 +35,7 @@ import com.android.systemui.plugins.ClockFaceController import com.android.systemui.plugins.ClockFaceConfig import com.android.systemui.plugins.ClockFaceEvents import com.android.systemui.plugins.ClockTickRate -import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.log.LogBuffer import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.policy.BatteryController import com.android.systemui.statusbar.policy.ConfigurationController diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java index 95db0c096faf..fb738454fc71 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java @@ -45,6 +45,7 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; +import com.android.systemui.log.LogBuffer; import com.android.systemui.plugins.ClockAnimations; import com.android.systemui.plugins.ClockController; import com.android.systemui.plugins.ClockEvents; @@ -52,7 +53,6 @@ import com.android.systemui.plugins.ClockFaceConfig; import com.android.systemui.plugins.ClockFaceController; import com.android.systemui.plugins.ClockFaceEvents; import com.android.systemui.plugins.ClockTickRate; -import com.android.systemui.plugins.log.LogBuffer; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.clocks.AnimatableClockView; import com.android.systemui.shared.clocks.ClockRegistry; diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt index 6d4c467aca7d..a20875b5d9de 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt @@ -49,6 +49,7 @@ import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.Dispatchers import org.junit.After +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -62,6 +63,7 @@ import org.mockito.Mockito.verify import org.mockito.Mockito.`when` as whenever import org.mockito.junit.MockitoJUnit +@Ignore("b/279650412") @RunWith(AndroidJUnit4::class) @RunWithLooper(setAsMainLooper = true) @SmallTest diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/FingerprintRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/FingerprintRepositoryImplTest.kt new file mode 100644 index 000000000000..f3a100bd55e5 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/data/repository/FingerprintRepositoryImplTest.kt @@ -0,0 +1,129 @@ +/* + * 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.biometrics.data.repository + +import android.hardware.biometrics.ComponentInfoInternal +import android.hardware.biometrics.SensorLocationInternal +import android.hardware.biometrics.SensorProperties +import android.hardware.fingerprint.FingerprintManager +import android.hardware.fingerprint.FingerprintSensorProperties +import android.hardware.fingerprint.FingerprintSensorPropertiesInternal +import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.biometrics.shared.model.FingerprintSensorType +import com.android.systemui.biometrics.shared.model.SensorStrength +import com.android.systemui.coroutines.collectLastValue +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.junit.MockitoJUnit + +@SmallTest +@RunWith(JUnit4::class) +class FingerprintRepositoryImplTest : SysuiTestCase() { + + @JvmField @Rule var mockitoRule = MockitoJUnit.rule() + private lateinit var testScope: TestScope + + @Mock private lateinit var fingerprintManager: FingerprintManager + private lateinit var repository: FingerprintPropertyRepositoryImpl + + @Captor + private lateinit var fingerprintAuthenticatorsCaptor: + ArgumentCaptor<IFingerprintAuthenticatorsRegisteredCallback.Stub> + + @Before + fun setup() { + val dispatcher = StandardTestDispatcher() + testScope = TestScope(dispatcher) + repository = + FingerprintPropertyRepositoryImpl(testScope.backgroundScope, fingerprintManager) + testScope.runCurrent() + + verify(fingerprintManager) + .addAuthenticatorsRegisteredCallback(fingerprintAuthenticatorsCaptor.capture()) + } + + @Test + fun initializeProperties() = + testScope.runTest { + val isInitialized = collectLastValue(repository.isInitialized) + + assertDefaultProperties() + assertThat(isInitialized()).isFalse() + + val fingerprintProps = + listOf( + FingerprintSensorPropertiesInternal( + 1 /* sensorId */, + SensorProperties.STRENGTH_STRONG, + 5 /* maxEnrollmentsPerUser */, + listOf<ComponentInfoInternal>( + ComponentInfoInternal( + "sensor" /* componentId */, + "vendor/model/revision" /* hardwareVersion */, + "1.01" /* firmwareVersion */, + "00000001" /* serialNumber */, + "" /* softwareVersion */ + ) + ), + FingerprintSensorProperties.TYPE_REAR, + false /* halControlsIllumination */, + true /* resetLockoutRequiresHardwareAuthToken */, + listOf<SensorLocationInternal>( + SensorLocationInternal( + "" /* displayId */, + 540 /* sensorLocationX */, + 1636 /* sensorLocationY */, + 130 /* sensorRadius */ + ) + ) + ) + ) + + fingerprintAuthenticatorsCaptor.value.onAllAuthenticatorsRegistered(fingerprintProps) + + assertThat(repository.sensorId.value).isEqualTo(1) + assertThat(repository.strength.value).isEqualTo(SensorStrength.STRONG) + assertThat(repository.sensorType.value).isEqualTo(FingerprintSensorType.REAR) + with(repository.sensorLocation.value) { + assertThat(displayId).isEqualTo("") + assertThat(sensorLocationX).isEqualTo(540) + assertThat(sensorLocationY).isEqualTo(1636) + assertThat(sensorRadius).isEqualTo(130) + } + assertThat(isInitialized()).isTrue() + } + + private fun assertDefaultProperties() { + assertThat(repository.sensorId.value).isEqualTo(-1) + assertThat(repository.strength.value).isEqualTo(SensorStrength.CONVENIENCE) + assertThat(repository.sensorType.value).isEqualTo(FingerprintSensorType.UNKNOWN) + } +} 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/dump/DumpHandlerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt index 19135d0cc800..e8cbdf3db327 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/dump/DumpHandlerTest.kt @@ -21,7 +21,7 @@ import com.android.systemui.CoreStartable import com.android.systemui.Dumpable import com.android.systemui.ProtoDumpable import com.android.systemui.SysuiTestCase -import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.log.LogBuffer import com.android.systemui.shared.system.UncaughtExceptionPreHandlerManager import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq diff --git a/packages/SystemUI/tests/src/com/android/systemui/dump/DumpManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/dump/DumpManagerTest.kt index 0c5a74cd39fa..d22c409d8590 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dump/DumpManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/dump/DumpManagerTest.kt @@ -19,7 +19,7 @@ package com.android.systemui.dump import androidx.test.filters.SmallTest import com.android.systemui.Dumpable import com.android.systemui.SysuiTestCase -import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.log.LogBuffer import com.android.systemui.util.mockito.any import java.io.PrintWriter import org.junit.Before diff --git a/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferHelper.kt b/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferHelper.kt index 64547f4463d1..bd029a727ee3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferHelper.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferHelper.kt @@ -16,9 +16,9 @@ package com.android.systemui.dump -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.plugins.log.LogcatEchoTracker +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel +import com.android.systemui.log.LogcatEchoTracker /** * Creates a LogBuffer that will echo everything to logcat, which is useful for debugging tests. 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/keyguard/data/repository/TrustRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/TrustRepositoryTest.kt index bf3c73a2c94e..c2195c7bc2c1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/TrustRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/TrustRepositoryTest.kt @@ -24,8 +24,8 @@ import com.android.keyguard.logging.TrustRepositoryLogger import com.android.systemui.RoboPilotTest import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogcatEchoTracker +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogcatEchoTracker import com.android.systemui.user.data.repository.FakeUserRepository import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi diff --git a/packages/SystemUI/plugin/tests/log/LogBufferTest.kt b/packages/SystemUI/tests/src/com/android/systemui/log/LogBufferTest.kt index a39b856f0f49..0cf6d3da7e9c 100644 --- a/packages/SystemUI/plugin/tests/log/LogBufferTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/log/LogBufferTest.kt @@ -2,7 +2,6 @@ package com.android.systemui.log import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.plugins.log.LogBuffer import com.google.common.truth.Truth.assertThat import java.io.PrintWriter import java.io.StringWriter diff --git a/packages/SystemUI/tests/src/com/android/systemui/log/table/TableLogBufferTest.kt b/packages/SystemUI/tests/src/com/android/systemui/log/table/TableLogBufferTest.kt index a2b2322899b7..df8a71826401 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/log/table/TableLogBufferTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/log/table/TableLogBufferTest.kt @@ -18,9 +18,9 @@ package com.android.systemui.log.table import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.log.LogLevel +import com.android.systemui.log.LogcatEchoTracker import com.android.systemui.log.table.TableChange.Companion.IS_INITIAL_PREFIX -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.plugins.log.LogcatEchoTracker import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtilsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtilsTest.kt index 8da1c646109d..b322bb7d6b46 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtilsTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttLoggerUtilsTest.kt @@ -19,9 +19,9 @@ package com.android.systemui.media.taptotransfer.common import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager +import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogBufferFactory -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogcatEchoTracker +import com.android.systemui.log.LogcatEchoTracker import com.google.common.truth.Truth.assertThat import java.io.PrintWriter import java.io.StringWriter diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLoggerTest.kt index 95df484cddc2..64f3fd304ca6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverLoggerTest.kt @@ -19,9 +19,9 @@ package com.android.systemui.media.taptotransfer.receiver import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager +import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogBufferFactory -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogcatEchoTracker +import com.android.systemui.log.LogcatEchoTracker import com.google.common.truth.Truth.assertThat import java.io.PrintWriter import java.io.StringWriter diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLoggerTest.kt index 003375709a16..2287da572795 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderLoggerTest.kt @@ -19,9 +19,9 @@ package com.android.systemui.media.taptotransfer.sender import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager +import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogBufferFactory -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogcatEchoTracker +import com.android.systemui.log.LogcatEchoTracker import com.google.common.truth.Truth.assertThat import java.io.PrintWriter import java.io.StringWriter diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java index fb5197eff73f..4ce32d2c1f00 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java @@ -17,18 +17,16 @@ package com.android.systemui.monet; import static com.android.systemui.monet.utils.ArgbSubject.assertThat; - import static org.junit.Assert.assertTrue; - import androidx.test.filters.SmallTest; -import com.android.systemui.SysuiTestCase; import com.android.systemui.monet.contrast.Contrast; import com.android.systemui.monet.dynamiccolor.DynamicColor; import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.dynamiccolor.ToneDeltaConstraint; import com.android.systemui.monet.dynamiccolor.TonePolarity; +import com.android.systemui.SysuiTestCase; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.DynamicScheme; import com.android.systemui.monet.scheme.SchemeContent; @@ -36,182 +34,174 @@ import com.android.systemui.monet.scheme.SchemeFidelity; import com.android.systemui.monet.scheme.SchemeMonochrome; import com.android.systemui.monet.scheme.SchemeTonalSpot; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) -public final class DynamicColorTest extends SysuiTestCase { - - @Test - public void fromArgbNoBackground_doesntChangeForContrast() { - final int blueArgb = 0xff0000ff; - final DynamicColor dynamicColor = DynamicColor.fromArgb(blueArgb); - - final SchemeTonalSpot standardContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, - 0.0); - assertThat(dynamicColor.getArgb(standardContrast)).isSameColorAs(blueArgb); - - final SchemeTonalSpot minContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, -1.0); - assertThat(dynamicColor.getArgb(minContrast)).isSameColorAs(blueArgb); - - final SchemeTonalSpot maxContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 1.0); - assertThat(dynamicColor.getArgb(maxContrast)).isSameColorAs(blueArgb); - } - - @Test - public void toneDeltaConstraintNoPreference_evaluatesCorrectly() { - final int blueArgb = 0xff0000ff; - final int redArgb = 0xffff0000; - final DynamicColor otherDynamicColor = DynamicColor.fromArgb(redArgb); - final DynamicColor dynamicColor = - DynamicColor.fromArgb( - blueArgb, - (s) -> 30.0, - null, - (s) -> new ToneDeltaConstraint(30, otherDynamicColor, - TonePolarity.NO_PREFERENCE)); - final SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 0.0); - assertThat(dynamicColor.getArgb(scheme)).isSameColorAs(0xff0000ef); - } - - @Test - public void dynamicColor_withOpacity() { - final DynamicColor dynamicColor = - new DynamicColor( - s -> 0.0, - s -> 0.0, - s -> s.isDark ? 100.0 : 0.0, - s -> s.isDark ? 0.20 : 0.12, - null, - scheme -> - DynamicColor.toneMinContrastDefault( - (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null), - scheme -> - DynamicColor.toneMaxContrastDefault( - (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null), - null); - final SchemeTonalSpot lightScheme = new SchemeTonalSpot(Hct.fromInt(0xff4285f4), false, - 0.0); - assertThat(dynamicColor.getArgb(lightScheme)).isSameColorAs(0x1f000000); - - final SchemeTonalSpot darkScheme = new SchemeTonalSpot(Hct.fromInt(0xff4285f4), true, 0.0); - assertThat(dynamicColor.getArgb(darkScheme)).isSameColorAs(0x33ffffff); - } - - @Test - public void respectsContrast() { - final Hct[] seedColors = - new Hct[]{ - Hct.fromInt(0xFFFF0000), - Hct.fromInt(0xFFFFFF00), - Hct.fromInt(0xFF00FF00), - Hct.fromInt(0xFF0000FF) - }; - - final double[] contrastLevels = {-1.0, -0.5, 0.0, 0.5, 1.0}; - - for (Hct seedColor : seedColors) { - for (double contrastLevel : contrastLevels) { - for (boolean isDark : new boolean[]{false, true}) { - final DynamicScheme[] schemes = - new DynamicScheme[]{ - new SchemeContent(seedColor, isDark, contrastLevel), - new SchemeMonochrome(seedColor, isDark, contrastLevel), - new SchemeTonalSpot(seedColor, isDark, contrastLevel), - new SchemeFidelity(seedColor, isDark, contrastLevel) - }; - for (final DynamicScheme scheme : schemes) { - assertTrue( - pairSatisfiesContrast( - scheme, MaterialDynamicColors.onPrimary, - MaterialDynamicColors.primary)); - assertTrue( - pairSatisfiesContrast( - scheme, - MaterialDynamicColors.onPrimaryContainer, - MaterialDynamicColors.primaryContainer)); - assertTrue( - pairSatisfiesContrast( - scheme, MaterialDynamicColors.onSecondary, - MaterialDynamicColors.secondary)); - assertTrue( - pairSatisfiesContrast( - scheme, - MaterialDynamicColors.onSecondaryContainer, - MaterialDynamicColors.secondaryContainer)); - assertTrue( - pairSatisfiesContrast( - scheme, MaterialDynamicColors.onTertiary, - MaterialDynamicColors.tertiary)); - assertTrue( - pairSatisfiesContrast( - scheme, - MaterialDynamicColors.onTertiaryContainer, - MaterialDynamicColors.tertiaryContainer)); - assertTrue( - pairSatisfiesContrast( - scheme, MaterialDynamicColors.onError, - MaterialDynamicColors.error)); - assertTrue( - pairSatisfiesContrast( - scheme, - MaterialDynamicColors.onErrorContainer, - MaterialDynamicColors.errorContainer)); - assertTrue( - pairSatisfiesContrast( - scheme, MaterialDynamicColors.onBackground, - MaterialDynamicColors.background)); - assertTrue( - pairSatisfiesContrast( - scheme, - MaterialDynamicColors.onSurfaceVariant, - MaterialDynamicColors.surfaceVariant)); - assertTrue( - pairSatisfiesContrast( - scheme, - MaterialDynamicColors.onSurfaceInverse, - MaterialDynamicColors.surfaceInverse)); - } - } - } +public final class DynamicColorTest extends SysuiTestCase{ + + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + + @Test + public void fromArgbNoBackground_doesntChangeForContrast() { + final int blueArgb = 0xff0000ff; + final DynamicColor dynamicColor = DynamicColor.fromArgb(blueArgb); + + final SchemeTonalSpot standardContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 0.0); + assertThat(dynamicColor.getArgb(standardContrast)).isSameColorAs(blueArgb); + + final SchemeTonalSpot minContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, -1.0); + assertThat(dynamicColor.getArgb(minContrast)).isSameColorAs(blueArgb); + + final SchemeTonalSpot maxContrast = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 1.0); + assertThat(dynamicColor.getArgb(maxContrast)).isSameColorAs(blueArgb); + } + + @Test + public void toneDeltaConstraintNoPreference_evaluatesCorrectly() { + final int blueArgb = 0xff0000ff; + final int redArgb = 0xffff0000; + final DynamicColor otherDynamicColor = DynamicColor.fromArgb(redArgb); + final DynamicColor dynamicColor = + DynamicColor.fromArgb( + blueArgb, + (s) -> 30.0, + null, + (s) -> new ToneDeltaConstraint(30, otherDynamicColor, TonePolarity.NO_PREFERENCE)); + final SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(blueArgb), false, 0.0); + assertThat(dynamicColor.getArgb(scheme)).isSameColorAs(0xff0000ef); + } + + @Test + public void dynamicColor_withOpacity() { + final DynamicColor dynamicColor = + new DynamicColor( + s -> 0.0, + s -> 0.0, + s -> s.isDark ? 100.0 : 0.0, + s -> s.isDark ? 0.20 : 0.12, + null, + scheme -> + DynamicColor.toneMinContrastDefault( + (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null), + scheme -> + DynamicColor.toneMaxContrastDefault( + (s) -> s.isDark ? 100.0 : 0.0, null, scheme, null), + null); + final SchemeTonalSpot lightScheme = new SchemeTonalSpot(Hct.fromInt(0xff4285f4), false, 0.0); + assertThat(dynamicColor.getArgb(lightScheme)).isSameColorAs(0x1f000000); + + final SchemeTonalSpot darkScheme = new SchemeTonalSpot(Hct.fromInt(0xff4285f4), true, 0.0); + assertThat(dynamicColor.getArgb(darkScheme)).isSameColorAs(0x33ffffff); + } + + @Test + public void respectsContrast() { + final Hct[] seedColors = + new Hct[] { + Hct.fromInt(0xFFFF0000), + Hct.fromInt(0xFFFFFF00), + Hct.fromInt(0xFF00FF00), + Hct.fromInt(0xFF0000FF) + }; + + final double[] contrastLevels = {-1.0, -0.5, 0.0, 0.5, 1.0}; + + for (Hct seedColor : seedColors) { + for (double contrastLevel : contrastLevels) { + for (boolean isDark : new boolean[] {false, true}) { + final DynamicScheme[] schemes = + new DynamicScheme[] { + new SchemeContent(seedColor, isDark, contrastLevel), + new SchemeMonochrome(seedColor, isDark, contrastLevel), + new SchemeTonalSpot(seedColor, isDark, contrastLevel), + new SchemeFidelity(seedColor, isDark, contrastLevel) + }; + for (final DynamicScheme scheme : schemes) { + assertTrue( + pairSatisfiesContrast(scheme, dynamicColors.onPrimary(), dynamicColors.primary())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.onPrimaryContainer(), dynamicColors.primaryContainer())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.onSecondary(), dynamicColors.secondary())); + assertTrue( + pairSatisfiesContrast( + scheme, + dynamicColors.onSecondaryContainer(), + dynamicColors.secondaryContainer())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.onTertiary(), dynamicColors.tertiary())); + assertTrue( + pairSatisfiesContrast( + scheme, + dynamicColors.onTertiaryContainer(), + dynamicColors.tertiaryContainer())); + assertTrue( + pairSatisfiesContrast(scheme, dynamicColors.onError(), dynamicColors.error())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.onErrorContainer(), dynamicColors.errorContainer())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.onBackground(), dynamicColors.background())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.onSurfaceVariant(), dynamicColors.surfaceVariant())); + assertTrue( + pairSatisfiesContrast( + scheme, dynamicColors.inverseOnSurface(), dynamicColors.inverseSurface())); + } } + } } - - @Test - public void valuesAreCorrect() { - // Checks that the values of certain dynamic colors match Dart results. - assertThat( - MaterialDynamicColors.onPrimaryContainer.getArgb( - new SchemeFidelity(Hct.fromInt(0xFFFF0000), false, 0.5))) - .isSameColorAs(0xFFFFE5E1); - assertThat( - MaterialDynamicColors.onSecondaryContainer.getArgb( - new SchemeContent(Hct.fromInt(0xFF0000FF), false, 0.5))) - .isSameColorAs(0xFFFFFCFF); - assertThat( - MaterialDynamicColors.onTertiaryContainer.getArgb( - new SchemeContent(Hct.fromInt(0xFFFFFF00), true, -0.5))) - .isSameColorAs(0xFF616600); - assertThat( - MaterialDynamicColors.surfaceInverse.getArgb( - new SchemeContent(Hct.fromInt(0xFF0000FF), false, 0.0))) - .isSameColorAs(0xFF464652); - assertThat( - MaterialDynamicColors.primaryInverse.getArgb( - new SchemeContent(Hct.fromInt(0xFFFF0000), false, -0.5))) - .isSameColorAs(0xFFFF8C7A); - assertThat( - MaterialDynamicColors.outlineVariant.getArgb( - new SchemeContent(Hct.fromInt(0xFFFFFF00), true, 0.0))) - .isSameColorAs(0xFF484831); - } - - private boolean pairSatisfiesContrast(DynamicScheme scheme, DynamicColor fg, DynamicColor bg) { - double fgTone = fg.getHct(scheme).getTone(); - double bgTone = bg.getHct(scheme).getTone(); - double minimumRequirement = scheme.contrastLevel >= 0.0 ? 4.5 : 3.0; - return Contrast.ratioOfTones(fgTone, bgTone) >= minimumRequirement; - } + } + + @Test + public void valuesAreCorrect() { + // Checks that the values of certain dynamic colors match Dart results. + assertThat( + dynamicColors + .onPrimaryContainer() + .getArgb(new SchemeFidelity(Hct.fromInt(0xFFFF0000), false, 0.5))) + .isSameColorAs(0xFFFFE5E1); + assertThat( + dynamicColors + .onSecondaryContainer() + .getArgb(new SchemeContent(Hct.fromInt(0xFF0000FF), false, 0.5))) + .isSameColorAs(0xFFFFFCFF); + assertThat( + dynamicColors + .onTertiaryContainer() + .getArgb(new SchemeContent(Hct.fromInt(0xFFFFFF00), true, -0.5))) + .isSameColorAs(0xFF616600); + assertThat( + dynamicColors + .inverseSurface() + .getArgb(new SchemeContent(Hct.fromInt(0xFF0000FF), false, 0.0))) + .isSameColorAs(0xFF2F2F3B); + assertThat( + dynamicColors + .inversePrimary() + .getArgb(new SchemeContent(Hct.fromInt(0xFFFF0000), false, -0.5))) + .isSameColorAs(0xFFFF907F); + assertThat( + dynamicColors + .outlineVariant() + .getArgb(new SchemeContent(Hct.fromInt(0xFFFFFF00), true, 0.0))) + .isSameColorAs(0xFF484831); + } + + private boolean pairSatisfiesContrast(DynamicScheme scheme, DynamicColor fg, DynamicColor bg) { + double fgTone = fg.getHct(scheme).getTone(); + double bgTone = bg.getHct(scheme).getTone(); + double minimumRequirement = scheme.contrastLevel >= 0.0 ? 4.5 : 3.0; + return Contrast.ratioOfTones(fgTone, bgTone) >= minimumRequirement; + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeContentTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeContentTest.java index 1ddfc4d4af5b..704aed81e9c4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeContentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeContentTest.java @@ -25,246 +25,229 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeContent; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeContentTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff080CFF); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff656DD3); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff81009F); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff767684); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff757589); } @Test public void lightTheme_minContrast_primary() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFF1218FF); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF1218FF); } @Test public void lightTheme_standardContrast_primary() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFF0001C3); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF0001C3); } @Test public void lightTheme_maxContrast_primary() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFF000181); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF000181); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF5660FF); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF5660FF); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF2D36FF); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF2D36FF); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF0000E3); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF0000E3); } @Test public void lightTheme_minContrast_tertiaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFB042CC); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFB042CC); } @Test public void lightTheme_standardContrast_tertiaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF9221AF); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFF9221AF); } @Test public void lightTheme_maxContrast_tertiaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF73008E); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFF73008E); } @Test public void lightTheme_minContrast_objectionableTertiaryContainerLightens() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF850096), false, -1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFD03A71); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFD03A71); } @Test public void lightTheme_standardContrast_objectionableTertiaryContainerLightens() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF850096), false, 0.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFAC1B57); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFAC1B57); } @Test public void lightTheme_maxContrast_objectionableTertiaryContainerDarkens() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF850096), false, 1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF870040); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xFF870040); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFCBCDFF); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFFCBCDFF); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFCECFFF); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFFCECFFF); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFD6D6FF); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFFD6D6FF); } @Test public void lightTheme_minContrast_surface() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, -1); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xFFFBF8FF); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFFFBF8FF); } @Test public void lightTheme_standardContrast_surface() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xFFFBF8FF); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFFFBF8FF); } @Test public void lightTheme_maxContrast_surface() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xFFFBF8FF); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFFFBF8FF); } @Test public void darkTheme_minContrast_primary() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFF5660FF); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF5660FF); } @Test public void darkTheme_standardContrast_primary() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFFBEC2FF); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFFBEC2FF); } @Test public void darkTheme_maxContrast_primary() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFFF6F4FF); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFFF6F4FF); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF0000E6); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF0000E6); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF0000E6); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFF0000E6); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFC4C6FF); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xFFC4C6FF); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF7A83FF); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFF7A83FF); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFA4AAFF); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFFA4AAFF); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF0001C6); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xFF0001C6); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFCF60EA); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFCF60EA); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFFEB8CFF); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xFFEB8CFF); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xFF63007B); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xFF63007B); } @Test public void darkTheme_minContrast_surface() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xFF12121D); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFF12121D); } @Test public void darkTheme_standardContrast_surface() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xFF12121D); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFF12121D); } @Test public void darkTheme_maxContrast_surface() { SchemeContent scheme = new SchemeContent(Hct.fromInt(0xFF0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xFF12121D); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xFF12121D); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeExpressiveTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeExpressiveTest.java index 31e8711c6d8c..32a589d0ea6e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeExpressiveTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeExpressiveTest.java @@ -25,183 +25,175 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeExpressive; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeExpressiveTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff35855F); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff8C6D8C); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff806EA1); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff79757F); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff7A7585); } @Test public void lightTheme_minContrast_primary() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff32835D); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffad603c); } @Test public void lightTheme_standardContrast_primary() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff146C48); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff924b28); } @Test public void lightTheme_maxContrast_primary() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff002818); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff401400); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffA2F4C6); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffffdbcc); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffA2F4C6); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffffdbcc); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff004D31); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff6f3010); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff1e724e); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff99512e); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff002112); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff351000); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff9aebbe); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffffd0bc); } @Test public void lightTheme_minContrast_surface() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffdf7ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_standardContrast_surface() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffdf7ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_maxContrast_surface() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffdf7ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void darkTheme_minContrast_primary() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff32835d); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffad603c); } @Test public void darkTheme_standardContrast_primary() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff87d7ab); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffffb595); } @Test public void darkTheme_maxContrast_primary() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffd5ffe4); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfffff3ee); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff005234); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff743413); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff005234); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff743413); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff8bdbaf); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffffbb9e); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff76c59b); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xfff99f75); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffa2f4c6); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffffdbcc); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff004229); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff622706); } @Test public void darkTheme_minContrast_surface() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff14121a); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a); } @Test public void darkTheme_standardContrast_surface() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff14121a); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a); } @Test public void darkTheme_maxContrast_surface() { SchemeExpressive scheme = new SchemeExpressive(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff14121a); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFidelityTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFidelityTest.java index 511f83bb0140..6844a92185e0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFidelityTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFidelityTest.java @@ -25,245 +25,230 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeFidelity; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeFidelityTest extends SysuiTestCase { + + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff080CFF); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff656DD3); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff9D0002); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff767684); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff757589); } @Test public void lightTheme_minContrast_primary() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff1218ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff1218ff); } @Test public void lightTheme_standardContrast_primary() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff0001c3); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff0001c3); } @Test public void lightTheme_maxContrast_primary() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff000181); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff000181); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff5660ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff5660ff); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff2d36ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff2d36ff); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0000e3); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000e3); } @Test public void lightTheme_minContrast_tertiaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffd93628); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xffd93628); } @Test public void lightTheme_standardContrast_tertiaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffb31910); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xffb31910); } @Test public void lightTheme_maxContrast_tertiaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff8c0002); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xff8c0002); } @Test public void lightTheme_minContrast_objectionableTertiaryContainerLightens() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff850096), false, -1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffbcac5a); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xffbcac5a); } @Test public void lightTheme_standardContrast_objectionableTertiaryContainerLightens() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff850096), false, 0.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffbcac5a); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xffbcac5a); } @Test public void lightTheme_maxContrast_objectionableTertiaryContainerDarkens() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff850096), false, 1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff4d4300); + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs(0xff4d4300); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffcbcdff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffcbcdff); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffcecfff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffcecfff); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffd6d6ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd6d6ff); } @Test public void lightTheme_minContrast_surface() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_standardContrast_surface() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_maxContrast_surface() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void darkTheme_minContrast_primary() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff5660ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5660ff); } @Test public void darkTheme_standardContrast_primary() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffbec2ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffbec2ff); } @Test public void darkTheme_maxContrast_primary() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xfff6f4ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0000e6); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000e6); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0000e6); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000e6); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffc4c6ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffc4c6ff); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff7a83ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff7a83ff); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffa4aaff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffa4aaff); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0001c6); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff0001c6); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xfffe513e); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xfffe513e); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffFF9181); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffFF9181); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff790001); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff790001); } @Test public void darkTheme_minContrast_surface() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12121d); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12121d); } @Test public void darkTheme_standardContrast_surface() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12121d); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12121d); } @Test public void darkTheme_maxContrast_surface() { SchemeFidelity scheme = new SchemeFidelity(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12121d); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12121d); } + } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFruitSaladTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFruitSaladTest.java index 4cf14d5455d3..4bca2c4f08f4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFruitSaladTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeFruitSaladTest.java @@ -25,226 +25,230 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeFruitSalad; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeFruitSaladTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff0091C0); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff3A7E9E); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff6E72AC); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff777682); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff75758B); } @Test public void lightTheme_minContrast_primary() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff007ea7); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff007ea7); } @Test public void lightTheme_standardContrast_primary() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff006688); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff006688); } @Test public void lightTheme_maxContrast_primary() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff002635); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff002635); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xffC2E8FF); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xffC2E8FF); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xff004862); } @Test public void lightTheme_minContrast_tertiaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffE0E0FF); } @Test public void lightTheme_standardContrast_tertiaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffE0E0FF); } @Test public void lightTheme_maxContrast_tertiaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs( 0xFF3A3E74); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff006C90); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff001E2B); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xffACE1FF); } @Test public void lightTheme_minContrast_surface() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_standardContrast_surface() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_maxContrast_surface() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void darkTheme_minContrast_primary() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff007EA7); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff007EA7); } @Test public void darkTheme_standardContrast_primary() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFF76D1FF); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFF76D1FF); } @Test public void darkTheme_maxContrast_primary() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xFFECF7FF); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xFFECF7FF); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xFF004D67); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xFF004D67); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xFF83D5FF); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff55C0F2); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xffC2E8FF); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff003E54); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffADB0EF); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffe0e0ff); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs( 0xff30346A); } @Test public void darkTheme_minContrast_surface() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12131c); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131c); } @Test public void darkTheme_standardContrast_surface() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12131c); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131c); } @Test public void darkTheme_maxContrast_surface() { SchemeFruitSalad scheme = new SchemeFruitSalad(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12131c); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131c); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeMonochromeTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeMonochromeTest.java index 3eca4dcf7baa..d5114222c2a0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeMonochromeTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeMonochromeTest.java @@ -16,6 +16,7 @@ package com.android.systemui.monet; +import static com.google.common.truth.Truth.assertThat; import static com.android.systemui.monet.utils.ArgbSubject.assertThat; import androidx.test.filters.SmallTest; @@ -25,204 +26,227 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeMonochrome; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeMonochromeTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); } @Test public void lightTheme_minContrast_primary() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff747474); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff3c3c3c); } @Test public void lightTheme_standardContrast_primary() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff5e5e5e); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff000000); } @Test public void lightTheme_maxContrast_primary() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff222222); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff000000); } @Test public void lightTheme_minContrast_primaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e2e2); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff5f5f5f); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e2e2); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff3b3b3b); } @Test public void lightTheme_maxContrast_primaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff434343); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff3a3a3a); } @Test public void lightTheme_minContrast_onPrimaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff646464); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd9d9d9); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff1b1b1b); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffffffff); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffdadada); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffcdcdcd); } @Test public void lightTheme_minContrast_surface() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfff9f9f9); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, -1); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9); } @Test public void lightTheme_standardContrast_surface() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfff9f9f9); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9); } @Test public void lightTheme_maxContrast_surface() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfff9f9f9); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 1); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9); } @Test public void darkTheme_minContrast_primary() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff747474); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffcccccc); } @Test public void darkTheme_standardContrast_primary() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffc6c6c6); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffffffff); } @Test public void darkTheme_maxContrast_primary() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xfff5f5f5); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffffffff); } @Test public void darkTheme_minContrast_primaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff474747); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffa3a3a3); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff474747); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffd4d4d4); } @Test public void darkTheme_maxContrast_primaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffcbcbcb); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffd5d5d5); } @Test public void darkTheme_minContrast_onPrimaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffb5b5b5); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff393939); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e2e2); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff000000); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff393939); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff404040); } @Test public void darkTheme_minContrast_onTertiaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffb5b5b5); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffd1d1d1); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e2e2); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff000000); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff393939); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff393939); } @Test public void darkTheme_minContrast_surface() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131313); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, -1); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313); } @Test public void darkTheme_standardContrast_surface() { SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131313); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313); } @Test public void darkTheme_maxContrast_surface() { - SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131313); + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 1); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313); + } + + @Test + public void darkTheme_monochromeSpec() { + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), true, 0.0); + assertThat(dynamicColors.primary().getHct(scheme).getTone()).isWithin(1).of(100); + assertThat(dynamicColors.onPrimary().getHct(scheme).getTone()).isWithin(1).of(10); + assertThat(dynamicColors.primaryContainer().getHct(scheme).getTone()).isWithin(1).of(85); + assertThat(dynamicColors.onPrimaryContainer().getHct(scheme).getTone()).isWithin(1).of(0); + assertThat(dynamicColors.secondary().getHct(scheme).getTone()).isWithin(1).of(80); + assertThat(dynamicColors.onSecondary().getHct(scheme).getTone()).isWithin(1).of(10); + assertThat(dynamicColors.secondaryContainer().getHct(scheme).getTone()).isWithin(1).of(30); + assertThat(dynamicColors.onSecondaryContainer().getHct(scheme).getTone()).isWithin(1).of(90); + assertThat(dynamicColors.tertiary().getHct(scheme).getTone()).isWithin(1).of(90); + assertThat(dynamicColors.onTertiary().getHct(scheme).getTone()).isWithin(1).of(10); + assertThat(dynamicColors.tertiaryContainer().getHct(scheme).getTone()).isWithin(1).of(60); + assertThat(dynamicColors.onTertiaryContainer().getHct(scheme).getTone()).isWithin(1).of(0); + } + + @Test + public void lightTheme_monochromeSpec() { + SchemeMonochrome scheme = new SchemeMonochrome(Hct.fromInt(0xff0000ff), false, 0.0); + assertThat(dynamicColors.primary().getHct(scheme).getTone()).isWithin(1).of(0); + assertThat(dynamicColors.onPrimary().getHct(scheme).getTone()).isWithin(1).of(90); + assertThat(dynamicColors.primaryContainer().getHct(scheme).getTone()).isWithin(1).of(25); + assertThat(dynamicColors.onPrimaryContainer().getHct(scheme).getTone()).isWithin(1).of(100); + assertThat(dynamicColors.secondary().getHct(scheme).getTone()).isWithin(1).of(40); + assertThat(dynamicColors.onSecondary().getHct(scheme).getTone()).isWithin(1).of(100); + assertThat(dynamicColors.secondaryContainer().getHct(scheme).getTone()).isWithin(1).of(85); + assertThat(dynamicColors.onSecondaryContainer().getHct(scheme).getTone()).isWithin(1).of(10); + assertThat(dynamicColors.tertiary().getHct(scheme).getTone()).isWithin(1).of(25); + assertThat(dynamicColors.onTertiary().getHct(scheme).getTone()).isWithin(1).of(90); + assertThat(dynamicColors.tertiaryContainer().getHct(scheme).getTone()).isWithin(1).of(49); + assertThat(dynamicColors.onTertiaryContainer().getHct(scheme).getTone()).isWithin(1).of(100); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeNeutralTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeNeutralTest.java index 71e9f4da79cb..4f3fc7d50b61 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeNeutralTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeNeutralTest.java @@ -25,204 +25,193 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeNeutral; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeNeutralTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff767685); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff777680); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff75758B); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff787678); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff787678); } @Test public void lightTheme_minContrast_primary() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff737383); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff737383); } @Test public void lightTheme_standardContrast_primary() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff5d5d6c); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5d5d6c); } @Test public void lightTheme_maxContrast_primary() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff21212e); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff21212e); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e1f3); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe2e1f3); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e1f3); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe2e1f3); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff414250); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff414250); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff636372); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff636372); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff1a1b27); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff1a1b27); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffd9d8ea); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd9d8ea); } @Test public void lightTheme_minContrast_surface() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffcf8fa); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffcf8fa); } @Test public void lightTheme_standardContrast_surface() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffcf8fa); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffcf8fa); } @Test public void lightTheme_maxContrast_surface() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffcf8fa); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffcf8fa); } @Test public void darkTheme_minContrast_primary() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff737383); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff737383); } @Test public void darkTheme_standardContrast_primary() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffc6c5d6); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffc6c5d6); } @Test public void darkTheme_maxContrast_primary() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xfff6f4ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff454654); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff454654); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff454654); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff454654); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffcac9da); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffcac9da); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffb5b3c4); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffb5b3c4); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe2e1f3); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffe2e1f3); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff373846); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff373846); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffb3b3cb); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffb3b3cb); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe1e0f9); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffe1e0f9); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff37374b); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff37374b); } @Test public void darkTheme_minContrast_surface() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131315); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131315); } @Test public void darkTheme_standardContrast_surface() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131315); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131315); } @Test public void darkTheme_maxContrast_surface() { SchemeNeutral scheme = new SchemeNeutral(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131315); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131315); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeRainbowTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeRainbowTest.java index cc6f044eb09c..ece3f9a16c48 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeRainbowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeRainbowTest.java @@ -25,225 +25,229 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeRainbow; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeRainbowTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff696FC4); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff75758B); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff936B84); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff070707); } @Test public void lightTheme_minContrast_primary() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff676DC1); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff676DC1); } @Test public void lightTheme_standardContrast_primary() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff5056A9); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5056A9); } @Test public void lightTheme_maxContrast_primary() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff0F136A); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff0F136A); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xffE0E0FF); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xffE0E0FF); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xff34398B); } @Test public void lightTheme_minContrast_tertiaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffffd8ee); } @Test public void lightTheme_standardContrast_tertiaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffffd8ee); } @Test public void lightTheme_maxContrast_tertiaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.tertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.tertiaryContainer().getArgb(scheme)).isSameColorAs( 0xff5A384E); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff565CB0); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff050865); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xffd6d6ff); } @Test public void lightTheme_minContrast_surface() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfff9f9f9); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9); } @Test public void lightTheme_standardContrast_surface() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfff9f9f9); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9); } @Test public void lightTheme_maxContrast_surface() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfff9f9f9); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfff9f9f9); } @Test public void darkTheme_minContrast_primary() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff676DC1); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff676DC1); } @Test public void darkTheme_standardContrast_primary() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffbec2ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffbec2ff); } @Test public void darkTheme_maxContrast_primary() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xfff6f4ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xff383E8F); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xff383E8F); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs( 0xffc4c6ff); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xffa9afff); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xffe0e0ff); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs( 0xff292f81); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffd5a8c3); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs( 0xffffd8ee); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs( 0xff4f2e44); } @Test public void darkTheme_minContrast_surface() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131313); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313); } @Test public void darkTheme_standardContrast_surface() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131313); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313); } @Test public void darkTheme_maxContrast_surface() { SchemeRainbow scheme = new SchemeRainbow(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131313); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131313); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTonalSpotTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTonalSpotTest.java index e4880d9df858..01d199b02f26 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTonalSpotTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeTonalSpotTest.java @@ -25,348 +25,338 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeTonalSpot; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeTonalSpotTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff6E72AC); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff75758B); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff936B84); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff78767A); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff777680); } + @Test public void lightTheme_minContrast_primary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff6c70aa); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff6a6fb1); } @Test public void lightTheme_standardContrast_primary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff555992); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff545999); } @Test public void lightTheme_maxContrast_primary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff181c51); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff161a59); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe0e0ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe0e0ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff3a3e74); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff383c7c); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff5C5F98); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff5a5fa0); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff11144B); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff0e1253); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffd6d6ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd6d6ff); } @Test public void lightTheme_minContrast_surface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xffFCF8FD); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_standardContrast_surface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xffFCF8FD); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_maxContrast_surface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xffFCF8FD); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_minContrast_onSurface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onSurface.getArgb(scheme)).isSameColorAs(0xff605E62); + assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xff5f5e65); } @Test public void lightTheme_standardContrast_onSurface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onSurface.getArgb(scheme)).isSameColorAs(0xff1B1B1F); + assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xff1b1b21); } @Test public void lightTheme_maxContrast_onSurface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onSurface.getArgb(scheme)).isSameColorAs(0xff1B1A1E); + assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xff1a1a20); } @Test public void lightTheme_minContrast_onSecondary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onSecondary.getArgb(scheme)).isSameColorAs(0xffcfcfe7); + assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xffcfcfe7); } @Test public void lightTheme_standardContrast_onSecondary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onSecondary.getArgb(scheme)).isSameColorAs(0xffffffff); + assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xffffffff); } @Test public void lightTheme_maxContrast_onSecondary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onSecondary.getArgb(scheme)).isSameColorAs(0xffababc3); + assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xffababc3); } @Test public void lightTheme_minContrast_onTertiary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onTertiary.getArgb(scheme)).isSameColorAs(0xfff3c3df); + assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xfff3c3df); } @Test public void lightTheme_standardContrast_onTertiary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onTertiary.getArgb(scheme)).isSameColorAs(0xffffffff); + assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xffffffff); } @Test public void lightTheme_maxContrast_onTertiary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onTertiary.getArgb(scheme)).isSameColorAs(0xffcda0bb); + assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xffcda0bb); } @Test public void lightTheme_minContrast_onError() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onError.getArgb(scheme)).isSameColorAs(0xffffc2bb); + assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xffffc2bb); } @Test public void lightTheme_standardContrast_onError() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onError.getArgb(scheme)).isSameColorAs(0xffffffff); + assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xffffffff); } @Test public void lightTheme_maxContrast_onError() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onError.getArgb(scheme)).isSameColorAs(0xffff8d80); + assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xffff8d80); } @Test public void darkTheme_minContrast_primary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff6C70AA); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff6a6fb1); } @Test public void darkTheme_standardContrast_primary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffbec2ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffbec2ff); } @Test public void darkTheme_maxContrast_primary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xfff6f4ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff3E4278); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff3c4180); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff3E4278); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff3c4180); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffc4c6ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffc4c6ff); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffadb0ef); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffabaff7); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe0e0ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff30346A); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff2e3271); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffd5a8c3); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffd5a8c3); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffffd8ee); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffffd8ee); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff4f2e44); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff4f2e44); } @Test public void darkTheme_minContrast_onSecondary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onSecondary.getArgb(scheme)).isSameColorAs(0xfffffbff); + assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xfffffbff); } @Test public void darkTheme_standardContrast_onSecondary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onSecondary.getArgb(scheme)).isSameColorAs(0xff2e2f42); + assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xff2e2f42); } @Test public void darkTheme_maxContrast_onSecondary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onSecondary.getArgb(scheme)).isSameColorAs(0xff505165); + assertThat(dynamicColors.onSecondary().getArgb(scheme)).isSameColorAs(0xff505165); } @Test public void darkTheme_minContrast_onTertiary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiary.getArgb(scheme)).isSameColorAs(0xfffffbff); + assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xfffffbff); } @Test public void darkTheme_standardContrast_onTertiary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiary.getArgb(scheme)).isSameColorAs(0xff46263b); + assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xff46263b); } @Test public void darkTheme_maxContrast_onTertiary() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiary.getArgb(scheme)).isSameColorAs(0xff6b485f); + assertThat(dynamicColors.onTertiary().getArgb(scheme)).isSameColorAs(0xff6b485f); } @Test public void darkTheme_minContrast_onError() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onError.getArgb(scheme)).isSameColorAs(0xfffffbff); + assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xfffffbff); } @Test public void darkTheme_standardContrast_onError() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onError.getArgb(scheme)).isSameColorAs(0xff690005); + assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xff690005); } @Test public void darkTheme_maxContrast_onError() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onError.getArgb(scheme)).isSameColorAs(0xffa80710); + assertThat(dynamicColors.onError().getArgb(scheme)).isSameColorAs(0xffa80710); } @Test public void darkTheme_minContrast_surface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131316); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131318); } @Test public void darkTheme_standardContrast_surface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131316); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131318); } @Test public void darkTheme_maxContrast_surface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff131316); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff131318); } @Test public void darkTheme_minContrast_onSurface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onSurface.getArgb(scheme)).isSameColorAs(0xffa4a2a6); + assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xffa4a2a9); } @Test public void darkTheme_standardContrast_onSurface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onSurface.getArgb(scheme)).isSameColorAs(0xffe5e1e6); + assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xffe4e1e9); } @Test public void darkTheme_maxContrast_onSurface() { SchemeTonalSpot scheme = new SchemeTonalSpot(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onSurface.getArgb(scheme)).isSameColorAs(0xffe6e2e7); + assertThat(dynamicColors.onSurface().getArgb(scheme)).isSameColorAs(0xffe5e2ea); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeVibrantTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeVibrantTest.java index e5963a2f39fe..0fb53eb6066c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeVibrantTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/SchemeVibrantTest.java @@ -25,204 +25,193 @@ import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors; import com.android.systemui.monet.hct.Hct; import com.android.systemui.monet.scheme.SchemeVibrant; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +@Ignore("b/279581953") @SmallTest @RunWith(JUnit4.class) public final class SchemeVibrantTest extends SysuiTestCase { + private final MaterialDynamicColors dynamicColors = new MaterialDynamicColors(); + @Test public void testKeyColors() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.primaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff080CFF); - assertThat(MaterialDynamicColors.secondaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.secondaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff7B7296); - assertThat(MaterialDynamicColors.tertiaryPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.tertiaryPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff886C9D); - assertThat(MaterialDynamicColors.neutralPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff777682); - assertThat(MaterialDynamicColors.neutralVariantPaletteKeyColor.getArgb(scheme)) + assertThat(dynamicColors.neutralVariantPaletteKeyColor().getArgb(scheme)) .isSameColorAs(0xff767685); } @Test public void lightTheme_minContrast_primary() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff5660ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5660ff); } @Test public void lightTheme_standardContrast_primary() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff343dff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff343dff); } @Test public void lightTheme_maxContrast_primary() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff000181); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff000181); } @Test public void lightTheme_minContrast_primaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe0e0ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff); } @Test public void lightTheme_standardContrast_primaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe0e0ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff); } @Test public void lightTheme_maxContrast_primaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0000e3); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000e3); } @Test public void lightTheme_minContrast_onPrimaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff3e47ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff3e47ff); } @Test public void lightTheme_standardContrast_onPrimaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff00006e); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff00006e); } @Test public void lightTheme_maxContrast_onPrimaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffd6d6ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffd6d6ff); } @Test public void lightTheme_minContrast_surface() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_standardContrast_surface() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void lightTheme_maxContrast_surface() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), false, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xfffbf8ff); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xfffbf8ff); } @Test public void darkTheme_minContrast_primary() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xff5660ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xff5660ff); } @Test public void darkTheme_standardContrast_primary() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xffbec2ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xffbec2ff); } @Test public void darkTheme_maxContrast_primary() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primary.getArgb(scheme)).isSameColorAs(0xfff6f4ff); + assertThat(dynamicColors.primary().getArgb(scheme)).isSameColorAs(0xfff6f4ff); } @Test public void darkTheme_minContrast_primaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0000ef); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000ef); } @Test public void darkTheme_standardContrast_primaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0000ef); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xff0000ef); } @Test public void darkTheme_maxContrast_primaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.primaryContainer.getArgb(scheme)).isSameColorAs( - 0xffc4c6ff); + assertThat(dynamicColors.primaryContainer().getArgb(scheme)).isSameColorAs(0xffc4c6ff); } @Test public void darkTheme_minContrast_onPrimaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffa9afff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffa9afff); } @Test public void darkTheme_standardContrast_onPrimaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xffe0e0ff); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xffe0e0ff); } @Test public void darkTheme_maxContrast_onPrimaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onPrimaryContainer.getArgb(scheme)).isSameColorAs( - 0xff0001c6); + assertThat(dynamicColors.onPrimaryContainer().getArgb(scheme)).isSameColorAs(0xff0001c6); } @Test public void darkTheme_minContrast_onTertiaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xffc9a9df); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xffc9a9df); } @Test public void darkTheme_standardContrast_onTertiaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xfff2daff); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xfff2daff); } @Test public void darkTheme_maxContrast_onTertiaryContainer() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.onTertiaryContainer.getArgb(scheme)).isSameColorAs( - 0xff472e5b); + assertThat(dynamicColors.onTertiaryContainer().getArgb(scheme)).isSameColorAs(0xff472e5b); } @Test public void darkTheme_minContrast_surface() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, -1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12131C); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a); } @Test public void darkTheme_standardContrast_surface() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 0.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12131C); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a); } @Test public void darkTheme_maxContrast_surface() { SchemeVibrant scheme = new SchemeVibrant(Hct.fromInt(0xff0000ff), true, 1.0); - assertThat(MaterialDynamicColors.surface.getArgb(scheme)).isSameColorAs(0xff12131C); + assertThat(dynamicColors.surface().getArgb(scheme)).isSameColorAs(0xff12131a); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt index d9428f897f0d..611c5b987d84 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt @@ -104,6 +104,9 @@ class BackPanelControllerTest : SysuiTestCase() { continueTouch(START_X + touchSlop.toFloat() + 1) // Move again to cross the back trigger threshold continueTouch(START_X + touchSlop + triggerThreshold + 1) + // Wait threshold duration and hold touch past trigger threshold + Thread.sleep((MAX_DURATION_ENTRY_BEFORE_ACTIVE_ANIMATION + 1).toLong()) + continueTouch(START_X + touchSlop + triggerThreshold + 1) assertThat(mBackPanelController.currentState) .isEqualTo(BackPanelController.GestureState.ACTIVE) @@ -114,14 +117,22 @@ class BackPanelControllerTest : SysuiTestCase() { finishTouchActionUp(START_X + touchSlop + triggerThreshold + 1) assertThat(mBackPanelController.currentState) - .isEqualTo(BackPanelController.GestureState.FLUNG) + .isEqualTo(BackPanelController.GestureState.COMMITTED) verify(backCallback).triggerBack() } @Test fun handlesBackCancelled() { startTouch() + // Move once to cross the touch slop continueTouch(START_X + touchSlop.toFloat() + 1) + // Move again to cross the back trigger threshold + continueTouch( + START_X + touchSlop + triggerThreshold - + mBackPanelController.params.deactivationTriggerThreshold + ) + // Wait threshold duration and hold touch before trigger threshold + Thread.sleep((MAX_DURATION_ENTRY_BEFORE_ACTIVE_ANIMATION + 1).toLong()) continueTouch( START_X + touchSlop + triggerThreshold - mBackPanelController.params.deactivationTriggerThreshold diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentDisableFlagsLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentDisableFlagsLoggerTest.kt index 68c10f20f6f7..aacc695ef301 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentDisableFlagsLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentDisableFlagsLoggerTest.kt @@ -20,7 +20,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.log.LogBufferFactory -import com.android.systemui.plugins.log.LogcatEchoTracker +import com.android.systemui.log.LogcatEchoTracker import com.android.systemui.statusbar.disableflags.DisableFlagsLogger import com.google.common.truth.Truth.assertThat import java.io.PrintWriter 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/LSShadeTransitionLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LSShadeTransitionLoggerTest.kt index 5fc0ffe42f55..8cb530c355bd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LSShadeTransitionLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LSShadeTransitionLoggerTest.kt @@ -4,7 +4,7 @@ import android.testing.AndroidTestingRunner import android.util.DisplayMetrics import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.log.LogBuffer import com.android.systemui.statusbar.notification.row.ExpandableView import com.android.systemui.statusbar.phone.LSShadeTransitionLogger import com.android.systemui.statusbar.phone.LockscreenGestureLogger diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java index 5431eba8441c..c7ea09cb519d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java @@ -70,7 +70,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.demomode.DemoModeController; import com.android.systemui.dump.DumpManager; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags; import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java index 9441d49d454a..d5689dcb3173 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java @@ -48,7 +48,7 @@ import com.android.settingslib.SignalIcon.MobileIconGroup; import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.net.DataUsageController; import com.android.systemui.dump.DumpManager; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.util.CarrierConfigTracker; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java index 4c1f0a8a1066..35b9814cd81d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java @@ -43,7 +43,7 @@ import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.net.DataUsageController; import com.android.systemui.R; import com.android.systemui.dump.DumpManager; -import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.log.LogBuffer; import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.util.CarrierConfigTracker; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt index bef9fcb5697c..a37c38669bfd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinatorLoggerTest.kt @@ -19,9 +19,9 @@ package com.android.systemui.statusbar.notification import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogLevel -import com.android.systemui.plugins.log.LogcatEchoTracker +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel +import com.android.systemui.log.LogcatEchoTracker import com.android.systemui.statusbar.StatusBarState import com.google.common.truth.Truth.assertThat import org.junit.Before diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java index 9186c35e2b47..4c83194783ab 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java @@ -617,24 +617,9 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { } @Test - public void applyRoundnessAndInv_should_be_immediately_applied_on_childrenContainer_legacy() - throws Exception { - ExpandableNotificationRow group = mNotificationTestHelper.createGroup(); - group.useRoundnessSourceTypes(false); - Assert.assertEquals(0f, group.getBottomRoundness(), 0.001f); - Assert.assertEquals(0f, group.getChildrenContainer().getBottomRoundness(), 0.001f); - - group.requestBottomRoundness(1f, SourceType.from(""), false); - - Assert.assertEquals(1f, group.getBottomRoundness(), 0.001f); - Assert.assertEquals(1f, group.getChildrenContainer().getBottomRoundness(), 0.001f); - } - - @Test public void applyRoundnessAndInvalidate_should_be_immediately_applied_on_childrenContainer() throws Exception { ExpandableNotificationRow group = mNotificationTestHelper.createGroup(); - group.useRoundnessSourceTypes(true); Assert.assertEquals(0f, group.getBottomRoundness(), 0.001f); Assert.assertEquals(0f, group.getChildrenContainer().getBottomRoundness(), 0.001f); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java index e41929f7d578..be976a1c9eaf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainerTest.java @@ -25,7 +25,6 @@ import android.view.View; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.notification.LegacySourceType; import com.android.systemui.statusbar.notification.SourceType; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.NotificationTestHelper; @@ -158,55 +157,7 @@ public class NotificationChildrenContainerTest extends SysuiTestCase { } @Test - public void addNotification_shouldResetOnScrollRoundness() throws Exception { - ExpandableNotificationRow row = mNotificationTestHelper.createRowWithRoundness( - /* topRoundness = */ 1f, - /* bottomRoundness = */ 1f, - /* sourceType = */ LegacySourceType.OnScroll); - - mChildrenContainer.addNotification(row, 0); - - Assert.assertEquals(0f, row.getTopRoundness(), /* delta = */ 0f); - Assert.assertEquals(0f, row.getBottomRoundness(), /* delta = */ 0f); - } - - @Test - public void addNotification_shouldNotResetOtherRoundness() throws Exception { - ExpandableNotificationRow row1 = mNotificationTestHelper.createRowWithRoundness( - /* topRoundness = */ 1f, - /* bottomRoundness = */ 1f, - /* sourceType = */ LegacySourceType.DefaultValue); - ExpandableNotificationRow row2 = mNotificationTestHelper.createRowWithRoundness( - /* topRoundness = */ 1f, - /* bottomRoundness = */ 1f, - /* sourceType = */ LegacySourceType.OnDismissAnimation); - - mChildrenContainer.addNotification(row1, 0); - mChildrenContainer.addNotification(row2, 0); - - Assert.assertEquals(1f, row1.getTopRoundness(), /* delta = */ 0f); - Assert.assertEquals(1f, row1.getBottomRoundness(), /* delta = */ 0f); - Assert.assertEquals(1f, row2.getTopRoundness(), /* delta = */ 0f); - Assert.assertEquals(1f, row2.getBottomRoundness(), /* delta = */ 0f); - } - - @Test - public void applyRoundnessAndInvalidate_should_be_immediately_applied_on_last_child_legacy() { - mChildrenContainer.useRoundnessSourceTypes(false); - List<ExpandableNotificationRow> children = mChildrenContainer.getAttachedChildren(); - ExpandableNotificationRow notificationRow = children.get(children.size() - 1); - Assert.assertEquals(0f, mChildrenContainer.getBottomRoundness(), 0.001f); - Assert.assertEquals(0f, notificationRow.getBottomRoundness(), 0.001f); - - mChildrenContainer.requestBottomRoundness(1f, SourceType.from(""), false); - - Assert.assertEquals(1f, mChildrenContainer.getBottomRoundness(), 0.001f); - Assert.assertEquals(1f, notificationRow.getBottomRoundness(), 0.001f); - } - - @Test public void applyRoundnessAndInvalidate_should_be_immediately_applied_on_last_child() { - mChildrenContainer.useRoundnessSourceTypes(true); List<ExpandableNotificationRow> children = mChildrenContainer.getAttachedChildren(); ExpandableNotificationRow notificationRow = children.get(children.size() - 1); Assert.assertEquals(0f, mChildrenContainer.getBottomRoundness(), 0.001f); @@ -220,8 +171,6 @@ public class NotificationChildrenContainerTest extends SysuiTestCase { @Test public void applyRoundnessAndInvalidate_should_be_immediately_applied_on_header() { - mChildrenContainer.useRoundnessSourceTypes(true); - NotificationHeaderViewWrapper header = mChildrenContainer.getNotificationHeaderWrapper(); Assert.assertEquals(0f, header.getTopRoundness(), 0.001f); @@ -232,7 +181,6 @@ public class NotificationChildrenContainerTest extends SysuiTestCase { @Test public void applyRoundnessAndInvalidate_should_be_immediately_applied_on_headerLowPriority() { - mChildrenContainer.useRoundnessSourceTypes(true); mChildrenContainer.setIsLowPriority(true); NotificationHeaderViewWrapper header = mChildrenContainer.getNotificationHeaderWrapper(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt index b1d3daa27eae..05b70ebfbb3e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt @@ -12,7 +12,6 @@ import com.android.systemui.flags.Flags import com.android.systemui.shade.transition.LargeScreenShadeInterpolator import com.android.systemui.statusbar.NotificationShelf import com.android.systemui.statusbar.StatusBarIconView -import com.android.systemui.statusbar.notification.LegacySourceType import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView import com.android.systemui.statusbar.notification.row.NotificationTestHelper @@ -359,39 +358,6 @@ class NotificationShelfTest : SysuiTestCase() { ) } - @Test - fun resetOnScrollRoundness_shouldSetOnScrollTo0() { - val row: ExpandableNotificationRow = notificationTestHelper.createRowWithRoundness( - /* topRoundness = */ 1f, - /* bottomRoundness = */ 1f, - /* sourceType = */ LegacySourceType.OnScroll) - - NotificationShelf.resetLegacyOnScrollRoundness(row) - - assertEquals(0f, row.topRoundness) - assertEquals(0f, row.bottomRoundness) - } - - @Test - fun resetOnScrollRoundness_shouldNotResetOtherRoundness() { - val row1: ExpandableNotificationRow = notificationTestHelper.createRowWithRoundness( - /* topRoundness = */ 1f, - /* bottomRoundness = */ 1f, - /* sourceType = */ LegacySourceType.DefaultValue) - val row2: ExpandableNotificationRow = notificationTestHelper.createRowWithRoundness( - /* topRoundness = */ 1f, - /* bottomRoundness = */ 1f, - /* sourceType = */ LegacySourceType.OnDismissAnimation) - - NotificationShelf.resetLegacyOnScrollRoundness(row1) - NotificationShelf.resetLegacyOnScrollRoundness(row2) - - assertEquals(1f, row1.topRoundness) - assertEquals(1f, row1.bottomRoundness) - assertEquals(1f, row2.topRoundness) - assertEquals(1f, row2.bottomRoundness) - } - private fun setFractionToShade(fraction: Float) { whenever(ambientState.fractionToShade).thenReturn(fraction) } 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/phone/fragment/CollapsedStatusBarFragmentLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLoggerTest.kt index 3a0a94ddd511..65e2964ea332 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentLoggerTest.kt @@ -20,7 +20,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.log.LogBufferFactory -import com.android.systemui.plugins.log.LogcatEchoTracker +import com.android.systemui.log.LogcatEchoTracker import com.android.systemui.statusbar.disableflags.DisableFlagsLogger import com.google.common.truth.Truth.assertThat import java.io.PrintWriter diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java index 2a3c775eaf54..4b1caca86bea 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java @@ -52,9 +52,9 @@ import com.android.systemui.R; import com.android.systemui.SysuiBaseFragmentTest; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.log.LogBuffer; +import com.android.systemui.log.LogcatEchoTracker; import com.android.systemui.plugins.DarkIconDispatcher; -import com.android.systemui.plugins.log.LogBuffer; -import com.android.systemui.plugins.log.LogcatEchoTracker; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shade.ShadeExpansionStateManager; import com.android.systemui.shade.ShadeViewController; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/data/model/DefaultConnectionModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/data/model/DefaultConnectionModelTest.kt index 03cd94fa9d70..c43778a4ae51 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/data/model/DefaultConnectionModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/data/model/DefaultConnectionModelTest.kt @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.pipeline.shared.data.model import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.plugins.log.LogMessageImpl +import com.android.systemui.log.LogMessageImpl import com.google.common.truth.Truth.assertThat import org.junit.Test 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/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt index 2e66b205bfd5..451424927b23 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt @@ -19,9 +19,9 @@ package com.android.systemui.temporarydisplay import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager +import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogBufferFactory -import com.android.systemui.plugins.log.LogBuffer -import com.android.systemui.plugins.log.LogcatEchoTracker +import com.android.systemui.log.LogcatEchoTracker import com.google.common.truth.Truth.assertThat import java.io.PrintWriter import java.io.StringWriter diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index 1510ee89dcd9..47a86b1fca5c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -380,7 +380,7 @@ public class BubblesTest extends SysuiTestCase { mPositioner, mock(DisplayController.class), mOneHandedOptional, - mock(DragAndDropController.class), + Optional.of(mock(DragAndDropController.class)), syncExecutor, mock(Handler.class), mTaskViewTransitions, diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java index c3bb7716d9a9..14c3f3c4ada5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/TestableBubbleController.java @@ -69,7 +69,7 @@ public class TestableBubbleController extends BubbleController { BubblePositioner positioner, DisplayController displayController, Optional<OneHandedController> oneHandedOptional, - DragAndDropController dragAndDropController, + Optional<DragAndDropController> dragAndDropController, ShellExecutor shellMainExecutor, Handler shellMainHandler, TaskViewTransitions taskViewTransitions, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFingerprintPropertyRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFingerprintPropertyRepository.kt new file mode 100644 index 000000000000..d9012a527726 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/data/repository/FakeFingerprintPropertyRepository.kt @@ -0,0 +1,58 @@ +/* + * 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.biometrics.data.repository + +import android.hardware.biometrics.SensorLocationInternal +import com.android.systemui.biometrics.shared.model.FingerprintSensorType +import com.android.systemui.biometrics.shared.model.SensorStrength +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +class FakeFingerprintPropertyRepository : FingerprintPropertyRepository { + + private val _isInitialized: MutableStateFlow<Boolean> = MutableStateFlow(false) + override val isInitialized = _isInitialized.asStateFlow() + + private val _sensorId: MutableStateFlow<Int> = MutableStateFlow(-1) + override val sensorId: StateFlow<Int> = _sensorId.asStateFlow() + + private val _strength: MutableStateFlow<SensorStrength> = + MutableStateFlow(SensorStrength.CONVENIENCE) + override val strength = _strength.asStateFlow() + + private val _sensorType: MutableStateFlow<FingerprintSensorType> = + MutableStateFlow(FingerprintSensorType.UNKNOWN) + override val sensorType: StateFlow<FingerprintSensorType> = _sensorType.asStateFlow() + + private val _sensorLocation: MutableStateFlow<SensorLocationInternal> = + MutableStateFlow(SensorLocationInternal.DEFAULT) + override val sensorLocation = _sensorLocation.asStateFlow() + + fun setProperties( + sensorId: Int, + strength: SensorStrength, + sensorType: FingerprintSensorType, + sensorLocation: SensorLocationInternal + ) { + _sensorId.value = sensorId + _strength.value = strength + _sensorType.value = sensorType + _sensorLocation.value = sensorLocation + _isInitialized.value = true + } +} 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/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index e894f1c2879e..d36c959a1b25 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -490,7 +490,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mMainHandler, context, new PolicyWarningUIController.NotificationController(context)); mSecurityPolicy = new AccessibilitySecurityPolicy(policyWarningUIController, mContext, - this, LocalServices.getService(PackageManagerInternal.class)); + this); mA11yWindowManager = new AccessibilityWindowManager(mLock, mMainHandler, mWindowManagerService, this, mSecurityPolicy, this, mTraceManager); mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java b/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java index 65c1873498a1..88656239e59b 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java @@ -29,7 +29,6 @@ import android.appwidget.AppWidgetManagerInternal; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; -import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; @@ -100,7 +99,6 @@ public class AccessibilitySecurityPolicy { private final Context mContext; private final PackageManager mPackageManager; - private final PackageManagerInternal mPackageManagerInternal; private final UserManager mUserManager; private final AppOpsManager mAppOpsManager; private final AccessibilityUserManager mAccessibilityUserManager; @@ -118,12 +116,10 @@ public class AccessibilitySecurityPolicy { */ public AccessibilitySecurityPolicy(PolicyWarningUIController policyWarningUIController, @NonNull Context context, - @NonNull AccessibilityUserManager a11yUserManager, - @NonNull PackageManagerInternal packageManagerInternal) { + @NonNull AccessibilityUserManager a11yUserManager) { mContext = context; mAccessibilityUserManager = a11yUserManager; mPackageManager = mContext.getPackageManager(); - mPackageManagerInternal = packageManagerInternal; mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mPolicyWarningUIController = policyWarningUIController; @@ -517,7 +513,12 @@ public class AccessibilitySecurityPolicy { private boolean isValidPackageForUid(String packageName, int uid) { final long token = Binder.clearCallingIdentity(); try { - return mPackageManagerInternal.isSameApp(packageName, uid, UserHandle.getUserId(uid)); + // Since we treat calls from a profile as if made by its parent, using + // MATCH_ANY_USER to query the uid of the given package name. + return uid == mPackageManager.getPackageUidAsUser( + packageName, PackageManager.MATCH_ANY_USER, UserHandle.getUserId(uid)); + } catch (PackageManager.NameNotFoundException e) { + return false; } finally { Binder.restoreCallingIdentity(token); } diff --git a/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java b/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java index dd0bbf2790ee..ac981d45561b 100644 --- a/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java +++ b/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java @@ -16,12 +16,14 @@ package com.android.server.companion.datatransfer.contextsync; +import android.annotation.NonNull; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.os.Bundle; import android.telecom.Call; import android.telecom.CallAudioState; import android.telecom.VideoProfile; @@ -46,7 +48,7 @@ public class CrossDeviceCall { private static final AtomicLong sNextId = new AtomicLong(1); private final long mId; - private final Call mCall; + private Call mCall; @VisibleForTesting boolean mIsEnterprise; @VisibleForTesting boolean mIsOtt; private final String mCallingAppPackageName; @@ -58,17 +60,23 @@ public class CrossDeviceCall { private boolean mIsMuted; private final Set<Integer> mControls = new HashSet<>(); - public CrossDeviceCall(PackageManager packageManager, Call call, + public CrossDeviceCall(PackageManager packageManager, @NonNull Call call, CallAudioState callAudioState) { - mId = sNextId.getAndIncrement(); + this(packageManager, call.getDetails(), callAudioState); mCall = call; - mCallingAppPackageName = call != null - ? call.getDetails().getAccountHandle().getComponentName().getPackageName() : null; - mIsOtt = call != null - && (call.getDetails().getCallCapabilities() & Call.Details.PROPERTY_SELF_MANAGED) + final Bundle extras = new Bundle(); + extras.putLong(EXTRA_CALL_ID, mId); + call.putExtras(extras); + } + + CrossDeviceCall(PackageManager packageManager, Call.Details callDetails, + CallAudioState callAudioState) { + mId = sNextId.getAndIncrement(); + mCallingAppPackageName = + callDetails.getAccountHandle().getComponentName().getPackageName(); + mIsOtt = (callDetails.getCallCapabilities() & Call.Details.PROPERTY_SELF_MANAGED) == Call.Details.PROPERTY_SELF_MANAGED; - mIsEnterprise = call != null - && (call.getDetails().getCallProperties() & Call.Details.PROPERTY_ENTERPRISE_CALL) + mIsEnterprise = (callDetails.getCallProperties() & Call.Details.PROPERTY_ENTERPRISE_CALL) == Call.Details.PROPERTY_ENTERPRISE_CALL; try { final ApplicationInfo applicationInfo = packageManager @@ -81,9 +89,7 @@ public class CrossDeviceCall { Slog.e(TAG, "Could not get application info for package " + mCallingAppPackageName, e); } mIsMuted = callAudioState != null && callAudioState.isMuted(); - if (call != null) { - updateCallDetails(call.getDetails()); - } + updateCallDetails(callDetails); } private byte[] renderDrawableToByteArray(Drawable drawable) { @@ -108,10 +114,10 @@ public class CrossDeviceCall { final Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight()); drawable.draw(canvas); + return renderBitmapToByteArray(bitmap); } finally { bitmap.recycle(); } - return renderBitmapToByteArray(bitmap); } private byte[] renderBitmapToByteArray(Bitmap bitmap) { diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java index f29a2e1ee7da..c687184a5a71 100644 --- a/services/core/java/com/android/server/am/AppProfiler.java +++ b/services/core/java/com/android/server/am/AppProfiler.java @@ -1199,6 +1199,9 @@ public class AppProfiler { .sendToTarget(); } + mCachedAppsWatermarkData.updateCachedAppsHighWatermarkIfNecessaryLocked( + numCached + numEmpty, now); + if (mService.mConstants.USE_MODERN_TRIM) { // Modern trim is not sent based on lowmem state // Dispatch UI_HIDDEN to processes that need it @@ -1316,8 +1319,6 @@ public class AppProfiler { profile.setTrimMemoryLevel(0); }); } - mCachedAppsWatermarkData.updateCachedAppsHighWatermarkIfNecessaryLocked( - numCached + numEmpty, now); return allChanged; } diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index 13c42eb66b69..ada92f5545c2 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -957,6 +957,10 @@ import java.util.concurrent.atomic.AtomicBoolean; } } + /*package*/ void postSetA2dpSuspended(boolean enable, String eventSource) { + sendILMsgNoDelay(MSG_IL_SET_A2DP_SUSPENDED, SENDMSG_QUEUE, (enable ? 1 : 0), eventSource); + } + /*package*/ void setA2dpSuspended(boolean enable, boolean internal, String eventSource) { if (AudioService.DEBUG_COMM_RTE) { Log.v(TAG, "setA2dpSuspended source: " + eventSource + ", enable: " @@ -985,6 +989,11 @@ import java.util.concurrent.atomic.AtomicBoolean; } } + /*package*/ void postSetLeAudioSuspended(boolean enable, String eventSource) { + sendILMsgNoDelay( + MSG_IL_SET_LEAUDIO_SUSPENDED, SENDMSG_QUEUE, (enable ? 1 : 0), eventSource); + } + /*package*/ void setLeAudioSuspended(boolean enable, boolean internal, String eventSource) { if (AudioService.DEBUG_COMM_RTE) { Log.v(TAG, "setLeAudioSuspended source: " + eventSource + ", enable: " @@ -1795,6 +1804,12 @@ import java.util.concurrent.atomic.AtomicBoolean; final int capturePreset = msg.arg1; mDeviceInventory.onSaveClearPreferredDevicesForCapturePreset(capturePreset); } break; + case MSG_IL_SET_A2DP_SUSPENDED: { + setA2dpSuspended((msg.arg1 == 1), false /*internal*/, (String) msg.obj); + } break; + case MSG_IL_SET_LEAUDIO_SUSPENDED: { + setLeAudioSuspended((msg.arg1 == 1), false /*internal*/, (String) msg.obj); + } break; default: Log.wtf(TAG, "Invalid message " + msg.what); } @@ -1869,6 +1884,8 @@ import java.util.concurrent.atomic.AtomicBoolean; private static final int MSG_IL_SAVE_NDEF_DEVICE_FOR_STRATEGY = 47; private static final int MSG_IL_SAVE_REMOVE_NDEF_DEVICE_FOR_STRATEGY = 48; private static final int MSG_IL_BTLEAUDIO_TIMEOUT = 49; + private static final int MSG_IL_SET_A2DP_SUSPENDED = 50; + private static final int MSG_IL_SET_LEAUDIO_SUSPENDED = 51; private static boolean isMessageHandledUnderWakelock(int msgId) { switch(msgId) { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 3487fc2c14be..20393250b5b7 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -6412,7 +6412,7 @@ public class AudioService extends IAudioService.Stub final String eventSource = new StringBuilder("setA2dpSuspended(").append(enable) .append(") from u/pid:").append(Binder.getCallingUid()).append("/") .append(Binder.getCallingPid()).toString(); - mDeviceBroker.setA2dpSuspended(enable, false /*internal*/, eventSource); + mDeviceBroker.postSetA2dpSuspended(enable, eventSource); } /** @see AudioManager#setA2dpSuspended(boolean) */ @@ -6422,7 +6422,7 @@ public class AudioService extends IAudioService.Stub final String eventSource = new StringBuilder("setLeAudioSuspended(").append(enable) .append(") from u/pid:").append(Binder.getCallingUid()).append("/") .append(Binder.getCallingPid()).toString(); - mDeviceBroker.setLeAudioSuspended(enable, false /*internal*/, eventSource); + mDeviceBroker.postSetLeAudioSuspended(enable, eventSource); } /** @see AudioManager#isBluetoothScoOn() 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/biometrics/AuthSession.java b/services/core/java/com/android/server/biometrics/AuthSession.java index 5127d26e6e73..bf5e8ee27157 100644 --- a/services/core/java/com/android/server/biometrics/AuthSession.java +++ b/services/core/java/com/android/server/biometrics/AuthSession.java @@ -704,7 +704,8 @@ public final class AuthSession implements IBinder.DeathRecipient { } BiometricFrameworkStatsLogger.getInstance().authenticate( - mBiometricContext.updateContext(new OperationContextExt(), isCrypto()), + mBiometricContext.updateContext(new OperationContextExt(true /* isBP */), + isCrypto()), statsModality(), BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, @@ -734,7 +735,8 @@ public final class AuthSession implements IBinder.DeathRecipient { } // Auth canceled BiometricFrameworkStatsLogger.getInstance().error( - mBiometricContext.updateContext(new OperationContextExt(), isCrypto()), + mBiometricContext.updateContext(new OperationContextExt(true /* isBP */), + isCrypto()), statsModality(), BiometricsProtoEnums.ACTION_AUTHENTICATE, BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, diff --git a/services/core/java/com/android/server/biometrics/log/OperationContextExt.java b/services/core/java/com/android/server/biometrics/log/OperationContextExt.java index d1de80b4761d..4d821e9819b4 100644 --- a/services/core/java/com/android/server/biometrics/log/OperationContextExt.java +++ b/services/core/java/com/android/server/biometrics/log/OperationContextExt.java @@ -46,15 +46,17 @@ public class OperationContextExt { private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED; @Surface.Rotation private int mOrientation = Surface.ROTATION_0; private int mFoldState = IBiometricContextListener.FoldState.UNKNOWN; + private final boolean mIsBP; - /** Create a new empty context. */ - public OperationContextExt() { - this(new OperationContext()); + /** Create a context. */ + public OperationContextExt(boolean isBP) { + this(new OperationContext(), isBP); } /** Create a wrapped context. */ - public OperationContextExt(@NonNull OperationContext context) { + public OperationContextExt(@NonNull OperationContext context, boolean isBP) { mAidlContext = context; + mIsBP = isBP; } /** @@ -268,18 +270,20 @@ public class OperationContextExt { } private void setFirstSessionId(@NonNull BiometricContext biometricContext) { - mSessionInfo = biometricContext.getKeyguardEntrySessionInfo(); - if (mSessionInfo != null) { - mAidlContext.id = mSessionInfo.getId(); - mAidlContext.reason = OperationReason.KEYGUARD; - return; - } - - mSessionInfo = biometricContext.getBiometricPromptSessionInfo(); - if (mSessionInfo != null) { - mAidlContext.id = mSessionInfo.getId(); - mAidlContext.reason = OperationReason.BIOMETRIC_PROMPT; - return; + if (mIsBP) { + mSessionInfo = biometricContext.getBiometricPromptSessionInfo(); + if (mSessionInfo != null) { + mAidlContext.id = mSessionInfo.getId(); + mAidlContext.reason = OperationReason.BIOMETRIC_PROMPT; + return; + } + } else { + mSessionInfo = biometricContext.getKeyguardEntrySessionInfo(); + if (mSessionInfo != null) { + mAidlContext.id = mSessionInfo.getId(); + mAidlContext.reason = OperationReason.KEYGUARD; + return; + } } // no session diff --git a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java index 7b9fc36e8d61..05ca6e4554fb 100644 --- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java @@ -133,10 +133,6 @@ public abstract class AuthenticationClient<T, O extends AuthenticateOptions> binderDiedInternal(clearListener); } - public boolean isBiometricPrompt() { - return getCookie() != 0; - } - public long getOperationId() { return mOperationId; } diff --git a/services/core/java/com/android/server/biometrics/sensors/HalClientMonitor.java b/services/core/java/com/android/server/biometrics/sensors/HalClientMonitor.java index d0a4807d937e..03658ce21fc2 100644 --- a/services/core/java/com/android/server/biometrics/sensors/HalClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/sensors/HalClientMonitor.java @@ -37,7 +37,7 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor { protected final Supplier<T> mLazyDaemon; @NonNull - private final OperationContextExt mOperationContext = new OperationContextExt(); + private final OperationContextExt mOperationContext; /** * @param context system_server context @@ -58,6 +58,7 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor { super(context, token, listener, userId, owner, cookie, sensorId, biometricLogger, biometricContext); mLazyDaemon = lazyDaemon; + mOperationContext = new OperationContextExt(isBiometricPrompt()); } @Nullable @@ -85,6 +86,10 @@ public abstract class HalClientMonitor<T> extends BaseClientMonitor { unsubscribeBiometricContext(); } + public boolean isBiometricPrompt() { + return getCookie() != 0; + } + protected OperationContextExt getOperationContext() { return getBiometricContext().updateContext(mOperationContext, isCryptoOperation()); } diff --git a/services/core/java/com/android/server/broadcastradio/aidl/ConversionUtils.java b/services/core/java/com/android/server/broadcastradio/aidl/ConversionUtils.java index aab815c93e1a..adea13fcc13c 100644 --- a/services/core/java/com/android/server/broadcastradio/aidl/ConversionUtils.java +++ b/services/core/java/com/android/server/broadcastradio/aidl/ConversionUtils.java @@ -102,6 +102,8 @@ final class ConversionUtils { return new UnsupportedOperationException(action + ": NOT_SUPPORTED"); case Result.TIMEOUT: return new ParcelableException(new RuntimeException(action + ": TIMEOUT")); + case Result.CANCELED: + return new IllegalStateException(action + ": CANCELED"); default: return new ParcelableException(new RuntimeException( action + ": unknown error (" + result + ")")); @@ -123,6 +125,8 @@ final class ConversionUtils { return RadioTuner.TUNER_RESULT_NOT_SUPPORTED; case Result.TIMEOUT: return RadioTuner.TUNER_RESULT_TIMEOUT; + case Result.CANCELED: + return RadioTuner.TUNER_RESULT_CANCELED; case Result.UNKNOWN_ERROR: default: return RadioTuner.TUNER_RESULT_UNKNOWN_ERROR; diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index 378363c870c7..774087c63f0f 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -366,7 +366,12 @@ public class AutomaticBrightnessController { return getAutomaticScreenBrightness(null); } - float getAutomaticScreenBrightness(BrightnessEvent brightnessEvent) { + /** + * @return The current brightness recommendation calculated from the current conditions. + * @param brightnessEvent Event object to populate with details about why the specific + * brightness was chosen. + */ + public float getAutomaticScreenBrightness(BrightnessEvent brightnessEvent) { if (brightnessEvent != null) { brightnessEvent.setLux( mAmbientLuxValid ? mAmbientLux : PowerManager.BRIGHTNESS_INVALID_FLOAT); diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java index a4bd6a699ceb..46cd496bdcd3 100644 --- a/services/core/java/com/android/server/display/ColorFade.java +++ b/services/core/java/com/android/server/display/ColorFade.java @@ -191,7 +191,7 @@ final class ColorFade { } if (!(createEglContext(isProtected) && createEglSurface(isProtected, isWideColor) - && setScreenshotTextureAndSetViewport(hardwareBuffer))) { + && setScreenshotTextureAndSetViewport(hardwareBuffer, displayInfo.rotation))) { dismiss(); return false; } @@ -500,7 +500,8 @@ final class ColorFade { } private boolean setScreenshotTextureAndSetViewport( - ScreenCapture.ScreenshotHardwareBuffer screenshotBuffer) { + ScreenCapture.ScreenshotHardwareBuffer screenshotBuffer, + @Surface.Rotation int rotation) { if (!attachEglContext()) { return false; } @@ -525,14 +526,22 @@ final class ColorFade { s.release(); st.release(); } + // if screen is rotated, map texture starting different corner + int indexDelta = (rotation == Surface.ROTATION_90) ? 2 + : (rotation == Surface.ROTATION_180) ? 4 + : (rotation == Surface.ROTATION_270) ? 6 : 0; // Set up texture coordinates for a quad. // We might need to change this if the texture ends up being // a different size from the display for some reason. - mTexCoordBuffer.put(0, 0f); mTexCoordBuffer.put(1, 0f); - mTexCoordBuffer.put(2, 0f); mTexCoordBuffer.put(3, 1f); - mTexCoordBuffer.put(4, 1f); mTexCoordBuffer.put(5, 1f); - mTexCoordBuffer.put(6, 1f); mTexCoordBuffer.put(7, 0f); + mTexCoordBuffer.put(indexDelta, 0f); + mTexCoordBuffer.put(indexDelta + 1, 0f); + mTexCoordBuffer.put((indexDelta + 2) % 8, 0f); + mTexCoordBuffer.put((indexDelta + 3) % 8, 1f); + mTexCoordBuffer.put((indexDelta + 4) % 8, 1f); + mTexCoordBuffer.put((indexDelta + 5) % 8, 1f); + mTexCoordBuffer.put((indexDelta + 6) % 8, 1f); + mTexCoordBuffer.put((indexDelta + 7) % 8, 0f); // Set up our viewport. GLES20.glViewport(0, 0, mDisplayWidth, mDisplayHeight); diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 26b6cb0ebe9b..5771a04b9607 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -2548,7 +2548,6 @@ public final class DisplayManagerService extends SystemService { final DisplayInfo displayInfo = logicalDisplay.getDisplayInfoLocked(); captureArgs = new ScreenCapture.DisplayCaptureArgs.Builder(token) .setSize(displayInfo.getNaturalWidth(), displayInfo.getNaturalHeight()) - .setUseIdentityTransform(true) .setCaptureSecureLayers(true) .setAllowProtected(true) .build(); diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 0d89ba88c1cf..0861cb59a944 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -83,6 +83,7 @@ import com.android.server.display.whitebalance.DisplayWhiteBalanceSettings; import com.android.server.policy.WindowManagerPolicy; import java.io.PrintWriter; +import java.util.Objects; /** * Controls the power state of the display. @@ -605,7 +606,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mLastBrightnessEvent = new BrightnessEvent(mDisplayId); mTempBrightnessEvent = new BrightnessEvent(mDisplayId); mThermalBrightnessThrottlingDataId = - logicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + logicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; if (mDisplayId == Display.DEFAULT_DISPLAY) { mBatteryStats = BatteryStatsService.getService(); @@ -955,7 +956,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call && mLogicalDisplay.getPrimaryDisplayDeviceLocked() .getDisplayDeviceInfoLocked().type == Display.TYPE_INTERNAL; final String thermalBrightnessThrottlingDataId = - mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; mHandler.postAtTime(() -> { boolean changed = false; if (mDisplayDevice != device) { @@ -972,8 +973,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // last command that was sent to change it's state. Let's assume it is unknown so // that we trigger a change immediately. mPowerState.resetScreenState(); - } else if ( - !mThermalBrightnessThrottlingDataId.equals(thermalBrightnessThrottlingDataId)) { + } else if (!Objects.equals(mThermalBrightnessThrottlingDataId, + thermalBrightnessThrottlingDataId)) { changed = true; mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId; mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig( @@ -2189,7 +2190,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call () -> { sendUpdatePowerState(); postBrightnessChangeRunnable(); - }, mUniqueDisplayId, mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(), + }, mUniqueDisplayId, + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId, ddConfig.getThermalBrightnessThrottlingDataMapByThrottlingId()); } diff --git a/services/core/java/com/android/server/display/DisplayPowerController2.java b/services/core/java/com/android/server/display/DisplayPowerController2.java index 9e8c47f64926..3b3d5da8396c 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController2.java +++ b/services/core/java/com/android/server/display/DisplayPowerController2.java @@ -85,6 +85,7 @@ import com.android.server.display.whitebalance.DisplayWhiteBalanceSettings; import com.android.server.policy.WindowManagerPolicy; import java.io.PrintWriter; +import java.util.Objects; /** * Controls the power state of the display. @@ -488,7 +489,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mAutomaticBrightnessStrategy = new AutomaticBrightnessStrategy(context, mDisplayId); mTag = "DisplayPowerController2[" + mDisplayId + "]"; mThermalBrightnessThrottlingDataId = - logicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + logicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; mDisplayDevice = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); mUniqueDisplayId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); @@ -760,7 +761,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal && mLogicalDisplay.getPrimaryDisplayDeviceLocked() .getDisplayDeviceInfoLocked().type == Display.TYPE_INTERNAL; final String thermalBrightnessThrottlingDataId = - mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(); + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId; mHandler.postAtTime(() -> { boolean changed = false; @@ -778,8 +779,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal // last command that was sent to change it's state. Let's assume it is unknown so // that we trigger a change immediately. mPowerState.resetScreenState(); - } else if ( - !mThermalBrightnessThrottlingDataId.equals(thermalBrightnessThrottlingDataId)) { + } else if (!Objects.equals(mThermalBrightnessThrottlingDataId, + thermalBrightnessThrottlingDataId)) { changed = true; mThermalBrightnessThrottlingDataId = thermalBrightnessThrottlingDataId; mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig( @@ -1301,7 +1302,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal int brightnessAdjustmentFlags = 0; if (Float.isNaN(brightnessState)) { if (mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()) { - brightnessState = mAutomaticBrightnessStrategy.getAutomaticScreenBrightness(); + brightnessState = mAutomaticBrightnessStrategy.getAutomaticScreenBrightness( + mTempBrightnessEvent); if (BrightnessUtils.isValidBrightnessValue(brightnessState) || brightnessState == PowerManager.BRIGHTNESS_OFF_FLOAT) { rawBrightnessState = mAutomaticBrightnessController @@ -1820,7 +1822,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal () -> { sendUpdatePowerState(); postBrightnessChangeRunnable(); - }, mUniqueDisplayId, mLogicalDisplay.getThermalBrightnessThrottlingDataIdLocked(), + }, mUniqueDisplayId, + mLogicalDisplay.getDisplayInfoLocked().thermalBrightnessThrottlingDataId, ddConfig.getThermalBrightnessThrottlingDataMapByThrottlingId()); } diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java index 0b6d1c851dc4..e5c50e61bf25 100644 --- a/services/core/java/com/android/server/display/LogicalDisplay.java +++ b/services/core/java/com/android/server/display/LogicalDisplay.java @@ -203,6 +203,7 @@ final class LogicalDisplay { mIsEnabled = true; mIsInTransition = false; mThermalBrightnessThrottlingDataId = DisplayDeviceConfig.DEFAULT_ID; + mBaseDisplayInfo.thermalBrightnessThrottlingDataId = mThermalBrightnessThrottlingDataId; } public void setDevicePositionLocked(int position) { @@ -514,6 +515,7 @@ final class LogicalDisplay { mBaseDisplayInfo.layoutLimitedRefreshRate = mLayoutLimitedRefreshRate; mBaseDisplayInfo.thermalRefreshRateThrottling = mThermalRefreshRateThrottling; + mBaseDisplayInfo.thermalBrightnessThrottlingDataId = mThermalBrightnessThrottlingDataId; mPrimaryDisplayDeviceInfo = deviceInfo; mInfo.set(null); @@ -886,19 +888,14 @@ final class LogicalDisplay { } /** - * @return The ID of the brightness throttling data that this display should use. - */ - public String getThermalBrightnessThrottlingDataIdLocked() { - return mThermalBrightnessThrottlingDataId; - } - - /** * @param brightnessThrottlingDataId The ID of the brightness throttling data that this * display should use. */ public void setThermalBrightnessThrottlingDataIdLocked(String brightnessThrottlingDataId) { - mThermalBrightnessThrottlingDataId = - brightnessThrottlingDataId; + if (!Objects.equals(brightnessThrottlingDataId, mThermalBrightnessThrottlingDataId)) { + mThermalBrightnessThrottlingDataId = brightnessThrottlingDataId; + mDirty = true; + } } /** diff --git a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java index f6cf866dfa2f..95cbf9835e0f 100644 --- a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java +++ b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java @@ -25,6 +25,7 @@ import android.view.Display; import com.android.internal.annotations.VisibleForTesting; import com.android.server.display.AutomaticBrightnessController; +import com.android.server.display.brightness.BrightnessEvent; import com.android.server.display.brightness.BrightnessReason; import com.android.server.display.brightness.BrightnessUtils; @@ -252,10 +253,12 @@ public class AutomaticBrightnessStrategy { /** * Evaluates the target automatic brightness of the associated display. + * @param brightnessEvent Event object to populate with details about why the specific + * brightness was chosen. */ - public float getAutomaticScreenBrightness() { + public float getAutomaticScreenBrightness(BrightnessEvent brightnessEvent) { float brightness = (mAutomaticBrightnessController != null) - ? mAutomaticBrightnessController.getAutomaticScreenBrightness() + ? mAutomaticBrightnessController.getAutomaticScreenBrightness(brightnessEvent) : PowerManager.BRIGHTNESS_INVALID_FLOAT; adjustAutomaticBrightnessStateIfValid(brightness); return brightness; diff --git a/services/core/java/com/android/server/infra/ServiceNameBaseResolver.java b/services/core/java/com/android/server/infra/ServiceNameBaseResolver.java index 76ea05e36141..66ce5c79663e 100644 --- a/services/core/java/com/android/server/infra/ServiceNameBaseResolver.java +++ b/services/core/java/com/android/server/infra/ServiceNameBaseResolver.java @@ -268,7 +268,7 @@ public abstract class ServiceNameBaseResolver implements ServiceNameResolver { } if (enabled) { Slog.i(TAG, "disabling default service for user " + userId); - mDefaultServicesDisabled.removeAt(userId); + mDefaultServicesDisabled.delete(userId); } else { Slog.i(TAG, "enabling default service for user " + userId); mDefaultServicesDisabled.put(userId, true); diff --git a/services/core/java/com/android/server/input/InputSettingsObserver.java b/services/core/java/com/android/server/input/InputSettingsObserver.java index 5b2166962d0d..153e9c174b85 100644 --- a/services/core/java/com/android/server/input/InputSettingsObserver.java +++ b/services/core/java/com/android/server/input/InputSettingsObserver.java @@ -52,25 +52,27 @@ class InputSettingsObserver extends ContentObserver { mHandler = handler; mNative = nativeIms; mObservers = Map.ofEntries( - Map.entry(Settings.System.getUriFor(Settings.System.POINTER_SPEED), - (reason) -> updateMousePointerSpeed()), - Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_POINTER_SPEED), - (reason) -> updateTouchpadPointerSpeed()), - Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_NATURAL_SCROLLING), - (reason) -> updateTouchpadNaturalScrollingEnabled()), - Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_TAP_TO_CLICK), - (reason) -> updateTouchpadTapToClickEnabled()), - Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_RIGHT_CLICK_ZONE), - (reason) -> updateTouchpadRightClickZoneEnabled()), - Map.entry(Settings.System.getUriFor(Settings.System.SHOW_TOUCHES), - (reason) -> updateShowTouches()), - Map.entry(Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON), - (reason) -> updateAccessibilityLargePointer()), - Map.entry(Settings.Secure.getUriFor(Settings.Secure.LONG_PRESS_TIMEOUT), - (reason) -> updateDeepPressStatus(reason)), - Map.entry( - Settings.Global.getUriFor(Settings.Global.MAXIMUM_OBSCURING_OPACITY_FOR_TOUCH), - (reason) -> updateMaximumObscuringOpacityForTouch())); + Map.entry(Settings.System.getUriFor(Settings.System.POINTER_SPEED), + (reason) -> updateMousePointerSpeed()), + Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_POINTER_SPEED), + (reason) -> updateTouchpadPointerSpeed()), + Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_NATURAL_SCROLLING), + (reason) -> updateTouchpadNaturalScrollingEnabled()), + Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_TAP_TO_CLICK), + (reason) -> updateTouchpadTapToClickEnabled()), + Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_RIGHT_CLICK_ZONE), + (reason) -> updateTouchpadRightClickZoneEnabled()), + Map.entry(Settings.System.getUriFor(Settings.System.SHOW_TOUCHES), + (reason) -> updateShowTouches()), + Map.entry( + Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON), + (reason) -> updateAccessibilityLargePointer()), + Map.entry(Settings.Secure.getUriFor(Settings.Secure.LONG_PRESS_TIMEOUT), + (reason) -> updateLongPressTimeout(reason)), + Map.entry( + Settings.Global.getUriFor( + Settings.Global.MAXIMUM_OBSCURING_OPACITY_FOR_TOUCH), + (reason) -> updateMaximumObscuringOpacityForTouch())); } /** @@ -151,8 +153,13 @@ class InputSettingsObserver extends ContentObserver { mNative.reloadPointerIcons(); } - private void updateDeepPressStatus(String reason) { - // Not using ViewConfiguration.getLongPressTimeout here because it may return a stale value + private void updateLongPressTimeout(String reason) { + // Some key gesture timeouts are based on the long press timeout, so update key gesture + // timeouts when the value changes. See ViewConfiguration#getKeyRepeatTimeout(). + mNative.notifyKeyGestureTimeoutsChanged(); + + // Update the deep press status. + // Not using ViewConfiguration.getLongPressTimeout here because it may return a stale value. final int timeout = Settings.Secure.getIntForUser(mContext.getContentResolver(), Settings.Secure.LONG_PRESS_TIMEOUT, ViewConfiguration.DEFAULT_LONG_PRESS_TIMEOUT, UserHandle.USER_CURRENT); diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java index aeb2477f8890..363bc94b49bd 100644 --- a/services/core/java/com/android/server/input/NativeInputManagerService.java +++ b/services/core/java/com/android/server/input/NativeInputManagerService.java @@ -28,6 +28,7 @@ import android.view.InputChannel; import android.view.InputEvent; import android.view.PointerIcon; import android.view.VerifiedInputEvent; +import android.view.ViewConfiguration; import java.util.List; @@ -198,8 +199,6 @@ interface NativeInputManagerService { void changeKeyboardLayoutAssociation(); - void notifyPointerDisplayIdChanged(); - void setDisplayEligibilityForPointerCapture(int displayId, boolean enabled); void setMotionClassifierEnabled(boolean enabled); @@ -243,6 +242,15 @@ interface NativeInputManagerService { */ void sysfsNodeChanged(String sysfsNodePath); + /** + * Notify there is a change in any of the key gesture timeouts, such as the key + * repeat timeout or key repeat delay. + * + * @see ViewConfiguration#getKeyRepeatTimeout() + * @see ViewConfiguration#getKeyRepeatDelay() + */ + void notifyKeyGestureTimeoutsChanged(); + /** The native implementation of InputManagerService methods. */ class NativeImpl implements NativeInputManagerService { /** Pointer to native input manager service object, used by native code. */ @@ -452,9 +460,6 @@ interface NativeInputManagerService { public native void changeKeyboardLayoutAssociation(); @Override - public native void notifyPointerDisplayIdChanged(); - - @Override public native void setDisplayEligibilityForPointerCapture(int displayId, boolean enabled); @Override @@ -493,5 +498,8 @@ interface NativeInputManagerService { @Override public native void sysfsNodeChanged(String sysfsNodePath); + + @Override + public native void notifyKeyGestureTimeoutsChanged(); } } diff --git a/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java b/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java index 48ee64f888cd..8a2888881e59 100644 --- a/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java +++ b/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java @@ -437,6 +437,16 @@ public class DefaultCrossProfileIntentFiltersUtils { .addCategory(Intent.CATEGORY_DEFAULT) .build(); + private static final DefaultCrossProfileIntentFilter CLONE_TO_PARENT_PHOTOPICKER_SELECTION = + new DefaultCrossProfileIntentFilter.Builder( + DefaultCrossProfileIntentFilter.Direction.TO_PARENT, + /* flags= */ 0x00000018, // 0x00000018 means FLAG_IS_PACKAGE_FOR_FILTER + // and FLAG_ALLOW_CHAINED_RESOLUTION set + /* letsPersonalDataIntoProfile= */ false) + .addAction(MediaStore.ACTION_USER_SELECT_IMAGES_FOR_APP) + .addCategory(Intent.CATEGORY_DEFAULT) + .build(); + /* Allowing send action from clone to parent profile to share content from clone apps to parent apps @@ -611,7 +621,8 @@ public class DefaultCrossProfileIntentFiltersUtils { CLONE_TO_PARENT_VIEW_ACTION, CLONE_TO_PARENT_PICK_INSERT_ACTION, CLONE_TO_PARENT_DIAL_DATA, - CLONE_TO_PARENT_SMS_MMS + CLONE_TO_PARENT_SMS_MMS, + CLONE_TO_PARENT_PHOTOPICKER_SELECTION ); } } diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 1e0c95ca9013..a267e8afa78d 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -118,6 +118,7 @@ import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; +import android.content.pm.ResolveInfo; import android.content.pm.SharedLibraryInfo; import android.content.pm.Signature; import android.content.pm.SigningDetails; @@ -3975,6 +3976,24 @@ final class InstallPackageHelper { mPm.mSettings.disableSystemPackageLPw(parsedPackage.getPackageName(), true); } } + + // If this is a system app we hadn't seen before, and this is a first boot or OTA, + // we need to unstop it if it doesn't have a launcher entry. + if (mPm.mShouldStopSystemPackagesByDefault && scanResult.mRequest.mPkgSetting == null + && ((scanFlags & SCAN_FIRST_BOOT_OR_UPGRADE) != 0) + && ((scanFlags & SCAN_AS_SYSTEM) != 0)) { + final Intent launcherIntent = new Intent(Intent.ACTION_MAIN); + launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER); + launcherIntent.setPackage(parsedPackage.getPackageName()); + final List<ResolveInfo> launcherActivities = + mPm.snapshotComputer().queryIntentActivitiesInternal(launcherIntent, null, + PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, 0); + if (launcherActivities.isEmpty()) { + scanResult.mPkgSetting.setStopped(false, 0); + } + } + if (mIncrementalManager != null && isIncrementalPath(parsedPackage.getPath())) { if (scanResult.mPkgSetting != null && scanResult.mPkgSetting.isLoading()) { // Continue monitoring loading progress of active incremental packages diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index ef7d41309e85..f78b611a70e3 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -928,6 +928,7 @@ class PackageManagerShellCommand extends ShellCommand { boolean showUid = false; boolean showVersionCode = false; boolean listApexOnly = false; + boolean showStopped = false; int uid = -1; int defaultUserId = UserHandle.USER_ALL; try { @@ -985,6 +986,9 @@ class PackageManagerShellCommand extends ShellCommand { case "--match-libraries": getFlags |= PackageManager.MATCH_STATIC_SHARED_AND_SDK_LIBRARIES; break; + case "--show-stopped": + showStopped = true; + break; default: pw.println("Error: Unknown option: " + opt); return -1; @@ -1077,6 +1081,12 @@ class PackageManagerShellCommand extends ShellCommand { stringBuilder.append(info.getLongVersionCode()); } } + if (showStopped) { + stringBuilder.append(" stopped="); + stringBuilder.append( + ((info.applicationInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0) + ? "true" : "false"); + } if (listInstaller) { stringBuilder.append(" installer="); stringBuilder.append(mInterface.getInstallerPackageName(info.packageName)); diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index c54b111eaa02..e0dbcbf27264 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -4293,10 +4293,23 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile // Non-Apex system apps, that are not included in the allowlist in // initialNonStoppedSystemPackages, should be marked as stopped by default. - final boolean shouldBeStopped = service.mShouldStopSystemPackagesByDefault + boolean shouldBeStopped = service.mShouldStopSystemPackagesByDefault && ps.isSystem() && !ps.isApex() && !service.mInitialNonStoppedSystemPackages.contains(ps.getPackageName()); + if (shouldBeStopped) { + final Intent launcherIntent = new Intent(Intent.ACTION_MAIN); + launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER); + launcherIntent.setPackage(ps.getPackageName()); + final List<ResolveInfo> launcherActivities = + service.snapshotComputer().queryIntentActivitiesInternal(launcherIntent, + null, + PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, 0); + if (launcherActivities.isEmpty()) { + shouldBeStopped = false; + } + } ps.setStopped(shouldBeStopped, userHandle); // If userTypeInstallablePackages is the *only* reason why we're not installing, diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 8433c47f8175..79eed644de78 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -1004,7 +1004,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { return; } - final boolean interactive = Display.isOnState(mDefaultDisplay.getState()); + final boolean interactive = mDefaultDisplayPolicy.isAwake(); Slog.d(TAG, "powerPress: eventTime=" + eventTime + " interactive=" + interactive + " count=" + count + " beganFromNonInteractive=" + beganFromNonInteractive @@ -2201,8 +2201,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Match current screen state. if (!mPowerManager.isInteractive()) { - startedGoingToSleep(PowerManager.GO_TO_SLEEP_REASON_TIMEOUT); - finishedGoingToSleep(PowerManager.GO_TO_SLEEP_REASON_TIMEOUT); + startedGoingToSleep(Display.DEFAULT_DISPLAY_GROUP, + PowerManager.GO_TO_SLEEP_REASON_TIMEOUT); + finishedGoingToSleep(Display.DEFAULT_DISPLAY_GROUP, + PowerManager.GO_TO_SLEEP_REASON_TIMEOUT); } mWindowManagerInternal.registerAppTransitionListener(new AppTransitionListener() { @@ -4095,7 +4097,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // This could prevent some wrong state in multi-displays environment, // the default display may turned off but interactive is true. - final boolean isDefaultDisplayOn = Display.isOnState(mDefaultDisplay.getState()); + final boolean isDefaultDisplayOn = mDefaultDisplayPolicy.isAwake(); final boolean interactiveAndOn = interactive && isDefaultDisplayOn; if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { handleKeyGesture(event, interactiveAndOn); @@ -4795,17 +4797,40 @@ public class PhoneWindowManager implements WindowManagerPolicy { } }; + @Override + public void startedWakingUpGlobal(@WakeReason int reason) { + + } + + @Override + public void finishedWakingUpGlobal(@WakeReason int reason) { + + } + + @Override + public void startedGoingToSleepGlobal(@PowerManager.GoToSleepReason int reason) { + mDeviceGoingToSleep = true; + } + + @Override + public void finishedGoingToSleepGlobal(@PowerManager.GoToSleepReason int reason) { + mDeviceGoingToSleep = false; + } + // Called on the PowerManager's Notifier thread. @Override - public void startedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason) { + public void startedGoingToSleep(int displayGroupId, + @PowerManager.GoToSleepReason int pmSleepReason) { if (DEBUG_WAKEUP) { - Slog.i(TAG, "Started going to sleep... (why=" + Slog.i(TAG, "Started going to sleep... (groupId=" + displayGroupId + " why=" + WindowManagerPolicyConstants.offReasonToString( WindowManagerPolicyConstants.translateSleepReasonToOffReason( pmSleepReason)) + ")"); } + if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) { + return; + } - mDeviceGoingToSleep = true; mRequestedOrSleepingDefaultDisplay = true; if (mKeyguardDelegate != null) { @@ -4815,17 +4840,20 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Called on the PowerManager's Notifier thread. @Override - public void finishedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason) { + public void finishedGoingToSleep(int displayGroupId, + @PowerManager.GoToSleepReason int pmSleepReason) { + if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) { + return; + } EventLogTags.writeScreenToggled(0); if (DEBUG_WAKEUP) { - Slog.i(TAG, "Finished going to sleep... (why=" + Slog.i(TAG, "Finished going to sleep... (groupId=" + displayGroupId + " why=" + WindowManagerPolicyConstants.offReasonToString( WindowManagerPolicyConstants.translateSleepReasonToOffReason( pmSleepReason)) + ")"); } MetricsLogger.histogram(mContext, "screen_timeout", mLockScreenTimeout / 1000); - mDeviceGoingToSleep = false; mRequestedOrSleepingDefaultDisplay = false; mDefaultDisplayPolicy.setAwake(false); @@ -4850,26 +4878,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Called on the PowerManager's Notifier thread. @Override - public void onPowerGroupWakefulnessChanged(int groupId, int wakefulness, - @PowerManager.GoToSleepReason int pmSleepReason, int globalWakefulness) { - if (wakefulness != globalWakefulness - && wakefulness != PowerManagerInternal.WAKEFULNESS_AWAKE - && groupId == Display.DEFAULT_DISPLAY_GROUP - && mKeyguardDelegate != null) { - mKeyguardDelegate.doKeyguardTimeout(null); - } - } - - // Called on the PowerManager's Notifier thread. - @Override - public void startedWakingUp(@PowerManager.WakeReason int pmWakeReason) { - EventLogTags.writeScreenToggled(1); + public void startedWakingUp(int displayGroupId, @WakeReason int pmWakeReason) { if (DEBUG_WAKEUP) { - Slog.i(TAG, "Started waking up... (why=" + Slog.i(TAG, "Started waking up... (groupId=" + displayGroupId + " why=" + WindowManagerPolicyConstants.onReasonToString( - WindowManagerPolicyConstants.translateWakeReasonToOnReason( - pmWakeReason)) + ")"); + WindowManagerPolicyConstants.translateWakeReasonToOnReason( + pmWakeReason)) + ")"); + } + if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) { + return; } + EventLogTags.writeScreenToggled(1); + mDefaultDisplayPolicy.setAwake(true); @@ -4892,13 +4912,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Called on the PowerManager's Notifier thread. @Override - public void finishedWakingUp(@PowerManager.WakeReason int pmWakeReason) { + public void finishedWakingUp(int displayGroupId, @WakeReason int pmWakeReason) { if (DEBUG_WAKEUP) { - Slog.i(TAG, "Finished waking up... (why=" + Slog.i(TAG, "Finished waking up... (groupId=" + displayGroupId + " why=" + WindowManagerPolicyConstants.onReasonToString( WindowManagerPolicyConstants.translateWakeReasonToOnReason( pmWakeReason)) + ")"); } + if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP) { + return; + } if (mKeyguardDelegate != null) { mKeyguardDelegate.onFinishedWakingUp(); @@ -5378,8 +5401,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } mSideFpsEventHandler.onFingerprintSensorReady(); - startedWakingUp(PowerManager.WAKE_REASON_UNKNOWN); - finishedWakingUp(PowerManager.WAKE_REASON_UNKNOWN); + startedWakingUp(Display.DEFAULT_DISPLAY_GROUP, PowerManager.WAKE_REASON_UNKNOWN); + finishedWakingUp(Display.DEFAULT_DISPLAY_GROUP, PowerManager.WAKE_REASON_UNKNOWN); int defaultDisplayState = mDisplayManager.getDisplay(DEFAULT_DISPLAY).getState(); boolean defaultDisplayOn = defaultDisplayState == Display.STATE_ON; 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/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index 7c3f1aad435b..887f9461bdce 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -67,10 +67,12 @@ import static java.lang.annotation.RetentionPolicy.SOURCE; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.companion.virtual.VirtualDevice; import android.content.ComponentName; import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; +import android.hardware.display.VirtualDisplay; import android.os.Bundle; import android.os.IBinder; import android.os.PowerManager; @@ -762,50 +764,84 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { void setAllowLockscreenWhenOn(int displayId, boolean allow); /** + * Called when the global wakefulness is becoming awake. + * + * @param reason One of PowerManager.WAKE_REASON_*, detailing the reason for the change. + */ + void startedWakingUpGlobal(@PowerManager.WakeReason int reason); + + /** + * Called when the global wakefulness has finished becoming awake. + * + * @param reason One of PowerManager.WAKE_REASON_*, detailing the reason for the change. + */ + void finishedWakingUpGlobal(@PowerManager.WakeReason int reason); + + /** + * Called when the global wakefulness has started going to sleep. + * + * @param reason One of PowerManager.WAKE_REASON_*, detailing the reason for the change. + */ + void startedGoingToSleepGlobal(@PowerManager.GoToSleepReason int reason); + + /** + * Called when the global wakefulness has finished going to sleep. + * + * @param reason One of PowerManager.WAKE_REASON_*, detailing the reason for the change. + */ + void finishedGoingToSleepGlobal(@PowerManager.GoToSleepReason int reason); + + /** * Called when the device has started waking up. * - * @param pmWakeReason One of PowerManager.WAKE_REASON_*, detailing the specific reason we're - * waking up, such as WAKE_REASON_POWER_BUTTON or WAKE_REASON_GESTURE. + * @param displayGroupId The id of the display group that has started waking up. This will often + * be {@link Display#DEFAULT_DISPLAY_GROUP}, but it is possible for other + * display groups to exist, for example when there is a + * {@link VirtualDevice} with one or more {@link VirtualDisplay}s. + * @param pmWakeReason One of PowerManager.WAKE_REASON_*, detailing the specific reason this + * display group is waking up, such as WAKE_REASON_POWER_BUTTON or + * WAKE_REASON_GESTURE. */ - void startedWakingUp(@PowerManager.WakeReason int pmWakeReason); + void startedWakingUp(int displayGroupId, @PowerManager.WakeReason int pmWakeReason); /** * Called when the device has finished waking up. * - * @param pmWakeReason One of PowerManager.WAKE_REASON_*, detailing the specific reason we're - * waking up, such as WAKE_REASON_POWER_BUTTON or WAKE_REASON_GESTURE. + * @param displayGroupId The id of the display group that has finished waking. This will often + * be {@link Display#DEFAULT_DISPLAY_GROUP}, but it is possible for other + * display groups to exist, for example when there is a + * {@link VirtualDevice} with one or more {@link VirtualDisplay}s. + * @param pmWakeReason One of PowerManager.WAKE_REASON_*, detailing the specific reason this + * display group is waking up, such as WAKE_REASON_POWER_BUTTON or + * WAKE_REASON_GESTURE. */ - void finishedWakingUp(@PowerManager.WakeReason int pmWakeReason); + void finishedWakingUp(int displayGroupId, @PowerManager.WakeReason int pmWakeReason); /** * Called when the device has started going to sleep. * + * @param displayGroupId The id of the display group that has started going to sleep. This + * will often be {@link Display#DEFAULT_DISPLAY_GROUP}, but it is + * possible for other display groups to exist, for example when there is a + * {@link VirtualDevice} with one or more {@link VirtualDisplay}s. * @param pmSleepReason One of PowerManager.GO_TO_SLEEP_REASON_*, detailing the specific reason - * we're going to sleep, such as GO_TO_SLEEP_REASON_POWER_BUTTON or GO_TO_SLEEP_REASON_TIMEOUT. + * this display group is going to sleep, such as + * GO_TO_SLEEP_REASON_POWER_BUTTON or GO_TO_SLEEP_REASON_TIMEOUT. */ - public void startedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason); + void startedGoingToSleep(int displayGroupId, @PowerManager.GoToSleepReason int pmSleepReason); /** * Called when the device has finished going to sleep. * + * @param displayGroupId The id of the display group that has finished going to sleep. This + * will often be {@link Display#DEFAULT_DISPLAY_GROUP}, but it is + * possible for other display groups to exist, for example when there is a + * {@link VirtualDevice} with one or more {@link VirtualDisplay}s. * @param pmSleepReason One of PowerManager.GO_TO_SLEEP_REASON_*, detailing the specific reason - * we're going to sleep, such as GO_TO_SLEEP_REASON_POWER_BUTTON or GO_TO_SLEEP_REASON_TIMEOUT. + * we're going to sleep, such as GO_TO_SLEEP_REASON_POWER_BUTTON or + * GO_TO_SLEEP_REASON_TIMEOUT. */ - public void finishedGoingToSleep(@PowerManager.GoToSleepReason int pmSleepReason); - - /** - * Called when a particular PowerGroup has changed wakefulness. - * - * @param groupId The id of the PowerGroup. - * @param wakefulness One of PowerManagerInternal.WAKEFULNESS_* indicating the wake state for - * the group - * @param pmSleepReason One of PowerManager.GO_TO_SLEEP_REASON_*, detailing the reason this - * group is going to sleep. - * @param globalWakefulness The global wakefulness, which may or may not match that of this - * group. One of PowerManagerInternal.WAKEFULNESS_* - */ - void onPowerGroupWakefulnessChanged(int groupId, int wakefulness, - @PowerManager.GoToSleepReason int pmSleepReason, int globalWakefulness); + void finishedGoingToSleep(int displayGroupId, @PowerManager.GoToSleepReason int pmSleepReason); /** * Called when the display is about to turn on to show content. diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java index d0ed9bfbb285..9bc0ee224ce0 100644 --- a/services/core/java/com/android/server/power/Notifier.java +++ b/services/core/java/com/android/server/power/Notifier.java @@ -51,6 +51,7 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.util.EventLog; import android.util.Slog; +import android.util.SparseArray; import android.view.WindowManagerPolicyConstants; import com.android.internal.annotations.VisibleForTesting; @@ -87,7 +88,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * tell the system when we go to sleep so that it can lock the keyguard if needed. * </p> */ -@VisibleForTesting +@VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED) public class Notifier { private static final String TAG = "PowerManagerNotifier"; @@ -150,14 +151,21 @@ public class Notifier { // begins charging wirelessly private final boolean mShowWirelessChargingAnimationConfig; - // The current interactive state. This is set as soon as an interactive state + // Encapsulates interactivity information about a particular display group. + private static class Interactivity { + public boolean isInteractive = true; + public int changeReason; + public long changeStartTime; // In SystemClock.uptimeMillis() + public boolean isChanging; + } + + private final SparseArray<Interactivity> mInteractivityByGroupId = new SparseArray<>(); + + // The current global interactive state. This is set as soon as an interactive state // transition begins so as to capture the reason that it happened. At some point // this state will propagate to the pending state then eventually to the // broadcasted state over the course of reporting the transition asynchronously. - private boolean mInteractive = true; - private int mInteractiveChangeReason; - private long mInteractiveChangeStartTime; // In SystemClock.uptimeMillis() - private boolean mInteractiveChanging; + private Interactivity mGlobalInteractivity = new Interactivity(); // The pending interactive state that we will eventually want to broadcast. // This is designed so that we can collapse redundant sequences of awake/sleep @@ -438,7 +446,8 @@ public class Notifier { * which case it will assume that the state did not fully converge before the * next transition began and will recover accordingly. */ - public void onWakefulnessChangeStarted(final int wakefulness, int reason, long eventTime) { + public void onGlobalWakefulnessChangeStarted(final int wakefulness, int reason, + long eventTime) { final boolean interactive = PowerManagerInternal.isInteractive(wakefulness); if (DEBUG) { Slog.d(TAG, "onWakefulnessChangeStarted: wakefulness=" + wakefulness @@ -456,10 +465,10 @@ public class Notifier { // Handle any early interactive state changes. // Finish pending incomplete ones from a previous cycle. - if (mInteractive != interactive) { + if (mGlobalInteractivity.isInteractive != interactive) { // Finish up late behaviors if needed. - if (mInteractiveChanging) { - handleLateInteractiveChange(); + if (mGlobalInteractivity.isChanging) { + handleLateGlobalInteractiveChange(); } // Start input as soon as we start waking up or going to sleep. @@ -475,11 +484,11 @@ public class Notifier { FrameworkStatsLog.INTERACTIVE_STATE_CHANGED__STATE__OFF); // Handle early behaviors. - mInteractive = interactive; - mInteractiveChangeReason = reason; - mInteractiveChangeStartTime = eventTime; - mInteractiveChanging = true; - handleEarlyInteractiveChange(); + mGlobalInteractivity.isInteractive = interactive; + mGlobalInteractivity.isChanging = true; + mGlobalInteractivity.changeReason = reason; + mGlobalInteractivity.changeStartTime = eventTime; + handleEarlyGlobalInteractiveChange(); } } @@ -490,10 +499,34 @@ public class Notifier { if (DEBUG) { Slog.d(TAG, "onWakefulnessChangeFinished"); } + for (int i = 0; i < mInteractivityByGroupId.size(); i++) { + int groupId = mInteractivityByGroupId.keyAt(i); + Interactivity interactivity = mInteractivityByGroupId.valueAt(i); + if (interactivity.isChanging) { + interactivity.isChanging = false; + handleLateInteractiveChange(groupId); + } + } + if (mGlobalInteractivity.isChanging) { + mGlobalInteractivity.isChanging = false; + handleLateGlobalInteractiveChange(); + } + } + - if (mInteractiveChanging) { - mInteractiveChanging = false; - handleLateInteractiveChange(); + private void handleEarlyInteractiveChange(int groupId) { + synchronized (mLock) { + Interactivity interactivity = mInteractivityByGroupId.get(groupId); + if (interactivity == null) { + Slog.e(TAG, "no Interactivity entry for groupId:" + groupId); + return; + } + final int changeReason = interactivity.changeReason; + if (interactivity.isInteractive) { + mHandler.post(() -> mPolicy.startedWakingUp(groupId, changeReason)); + } else { + mHandler.post(() -> mPolicy.startedGoingToSleep(groupId, changeReason)); + } } } @@ -501,13 +534,13 @@ public class Notifier { * Handle early interactive state changes such as getting applications or the lock * screen running and ready for the user to see (such as when turning on the screen). */ - private void handleEarlyInteractiveChange() { + private void handleEarlyGlobalInteractiveChange() { synchronized (mLock) { - if (mInteractive) { + if (mGlobalInteractivity.isInteractive) { // Waking up... mHandler.post(() -> { - mPolicy.startedWakingUp(mInteractiveChangeReason); mDisplayManagerInternal.onEarlyInteractivityChange(true /*isInteractive*/); + mPolicy.startedWakingUpGlobal(mGlobalInteractivity.changeReason); }); // Send interactive broadcast. @@ -516,37 +549,36 @@ public class Notifier { updatePendingBroadcastLocked(); } else { // Going to sleep... - // Tell the policy that we started going to sleep. mHandler.post(() -> { - mPolicy.startedGoingToSleep(mInteractiveChangeReason); mDisplayManagerInternal.onEarlyInteractivityChange(false /*isInteractive*/); + mPolicy.startedGoingToSleepGlobal(mGlobalInteractivity.changeReason); }); } } } /** - * Handle late interactive state changes once they are finished so that the system can - * finish pending transitions (such as turning the screen off) before causing - * applications to change state visibly. + * Handle late global interactive state changes. Also see + * {@link #handleLateInteractiveChange(int)}. */ - private void handleLateInteractiveChange() { + private void handleLateGlobalInteractiveChange() { synchronized (mLock) { final int interactiveChangeLatency = - (int) (SystemClock.uptimeMillis() - mInteractiveChangeStartTime); - if (mInteractive) { + (int) (SystemClock.uptimeMillis() - mGlobalInteractivity.changeStartTime); + if (mGlobalInteractivity.isInteractive) { // Finished waking up... mHandler.post(() -> { LogMaker log = new LogMaker(MetricsEvent.SCREEN); log.setType(MetricsEvent.TYPE_OPEN); log.setSubtype(WindowManagerPolicyConstants.translateWakeReasonToOnReason( - mInteractiveChangeReason)); + mGlobalInteractivity.changeReason)); log.setLatency(interactiveChangeLatency); - log.addTaggedData( - MetricsEvent.FIELD_SCREEN_WAKE_REASON, mInteractiveChangeReason); + log.addTaggedData(MetricsEvent.FIELD_SCREEN_WAKE_REASON, + mGlobalInteractivity.changeReason); MetricsLogger.action(log); EventLogTags.writePowerScreenState(1, 0, 0, 0, interactiveChangeLatency); - mPolicy.finishedWakingUp(mInteractiveChangeReason); + + mPolicy.finishedWakingUpGlobal(mGlobalInteractivity.changeReason); }); } else { // Finished going to sleep... @@ -563,18 +595,19 @@ public class Notifier { // Tell the policy we finished going to sleep. final int offReason = WindowManagerPolicyConstants.translateSleepReasonToOffReason( - mInteractiveChangeReason); + mGlobalInteractivity.changeReason); mHandler.post(() -> { LogMaker log = new LogMaker(MetricsEvent.SCREEN); log.setType(MetricsEvent.TYPE_CLOSE); log.setSubtype(offReason); log.setLatency(interactiveChangeLatency); - log.addTaggedData( - MetricsEvent.FIELD_SCREEN_SLEEP_REASON, mInteractiveChangeReason); + log.addTaggedData(MetricsEvent.FIELD_SCREEN_SLEEP_REASON, + mGlobalInteractivity.changeReason); MetricsLogger.action(log); EventLogTags.writePowerScreenState( 0, offReason, 0, 0, interactiveChangeLatency); - mPolicy.finishedGoingToSleep(mInteractiveChangeReason); + + mPolicy.finishedGoingToSleepGlobal(mGlobalInteractivity.changeReason); }); // Send non-interactive broadcast. @@ -586,12 +619,62 @@ public class Notifier { } /** + * Handle late interactive state changes once they are finished so that the system can + * finish pending transitions (such as turning the screen off) before causing + * applications to change state visibly. + */ + private void handleLateInteractiveChange(int groupId) { + synchronized (mLock) { + Interactivity interactivity = mInteractivityByGroupId.get(groupId); + if (interactivity == null) { + Slog.e(TAG, "no Interactivity entry for groupId:" + groupId); + return; + } + final int changeReason = interactivity.changeReason; + if (interactivity.isInteractive) { + mHandler.post(() -> mPolicy.finishedWakingUp(groupId, changeReason)); + } else { + mHandler.post(() -> mPolicy.finishedGoingToSleep(groupId, changeReason)); + } + } + } + + /** * Called when an individual PowerGroup changes wakefulness. */ - public void onPowerGroupWakefulnessChanged(int groupId, int groupWakefulness, int changeReason, - int globalWakefulness) { - mHandler.post(() -> mPolicy.onPowerGroupWakefulnessChanged(groupId, groupWakefulness, - changeReason, globalWakefulness)); + public void onGroupWakefulnessChangeStarted(int groupId, int wakefulness, int changeReason, + long eventTime) { + final boolean isInteractive = PowerManagerInternal.isInteractive(wakefulness); + + boolean isNewGroup = false; + Interactivity interactivity = mInteractivityByGroupId.get(groupId); + if (interactivity == null) { + isNewGroup = true; + interactivity = new Interactivity(); + mInteractivityByGroupId.put(groupId, interactivity); + } + if (isNewGroup || interactivity.isInteractive != isInteractive) { + // Finish up late behaviors if needed. + if (interactivity.isChanging) { + handleLateInteractiveChange(groupId); + } + + // Handle early behaviors. + interactivity.isInteractive = isInteractive; + interactivity.changeReason = changeReason; + interactivity.changeStartTime = eventTime; + interactivity.isChanging = true; + handleEarlyInteractiveChange(groupId); + } + } + + /** + * Called when a PowerGroup has been removed. + * + * @param groupId which group was removed + */ + public void onGroupRemoved(int groupId) { + mInteractivityByGroupId.remove(groupId); } /** diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index e392c24026a7..9ff98be6f5cd 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -686,6 +686,8 @@ public final class PowerManagerService extends SystemService @Override public void onWakefulnessChangedLocked(int groupId, int wakefulness, long eventTime, int reason, int uid, int opUid, String opPackageName, String details) { + mWakefulnessChanging = true; + mDirty |= DIRTY_WAKEFULNESS; if (wakefulness == WAKEFULNESS_AWAKE) { // Kick user activity to prevent newly awake group from timing out instantly. // The dream may end without user activity if the dream app crashes / is updated, @@ -696,9 +698,8 @@ public final class PowerManagerService extends SystemService PowerManager.USER_ACTIVITY_EVENT_OTHER, flags, uid); } mDirty |= DIRTY_DISPLAY_GROUP_WAKEFULNESS; + mNotifier.onGroupWakefulnessChangeStarted(groupId, wakefulness, reason, eventTime); updateGlobalWakefulnessLocked(eventTime, reason, uid, opUid, opPackageName, details); - mNotifier.onPowerGroupWakefulnessChanged(groupId, wakefulness, reason, - getGlobalWakefulnessLocked()); updatePowerStateLocked(); } } @@ -2152,7 +2153,7 @@ public final class PowerManagerService extends SystemService mDozeStartInProgress &= (newWakefulness == WAKEFULNESS_DOZING); if (mNotifier != null) { - mNotifier.onWakefulnessChangeStarted(newWakefulness, reason, eventTime); + mNotifier.onGlobalWakefulnessChangeStarted(newWakefulness, reason, eventTime); } mAttentionDetector.onWakefulnessChangeStarted(newWakefulness); @@ -2163,15 +2164,6 @@ public final class PowerManagerService extends SystemService if (sQuiescent) { mDirty |= DIRTY_QUIESCENT; } - PowerGroup defaultGroup = mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP); - if (defaultGroup.getWakefulnessLocked() == WAKEFULNESS_DOZING) { - // Workaround for b/187231320 where the AOD can get stuck in a "half on / - // half off" state when a non-default-group VirtualDisplay causes the global - // wakefulness to change to awake, even though the default display is - // dozing. We set sandman summoned to restart dreaming to get it unstuck. - // TODO(b/255688811) - fix this so that AOD never gets interrupted at all. - defaultGroup.setSandmanSummonedLocked(true); - } break; case WAKEFULNESS_ASLEEP: @@ -2248,6 +2240,8 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") void onPowerGroupEventLocked(int event, PowerGroup powerGroup) { + mWakefulnessChanging = true; + mDirty |= DIRTY_WAKEFULNESS; final int groupId = powerGroup.getGroupId(); if (event == DisplayGroupPowerChangeListener.DISPLAY_GROUP_REMOVED) { mPowerGroups.delete(groupId); @@ -2260,6 +2254,11 @@ public final class PowerManagerService extends SystemService // Kick user activity to prevent newly added group from timing out instantly. userActivityNoUpdateLocked(powerGroup, mClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_OTHER, /* flags= */ 0, Process.SYSTEM_UID); + mNotifier.onGroupWakefulnessChangeStarted(groupId, + powerGroup.getWakefulnessLocked(), WAKE_REASON_DISPLAY_GROUP_ADDED, + mClock.uptimeMillis()); + } else if (event == DisplayGroupPowerChangeListener.DISPLAY_GROUP_REMOVED) { + mNotifier.onGroupRemoved(groupId); } if (oldWakefulness != newWakefulness) { diff --git a/services/core/java/com/android/server/tv/TvInputHal.java b/services/core/java/com/android/server/tv/TvInputHal.java index b6ab35169fc4..4bbca335b8e3 100644 --- a/services/core/java/com/android/server/tv/TvInputHal.java +++ b/services/core/java/com/android/server/tv/TvInputHal.java @@ -27,9 +27,6 @@ import android.util.SparseArray; import android.util.SparseIntArray; import android.view.Surface; -import java.util.LinkedList; -import java.util.Queue; - /** * Provides access to the low-level TV input hardware abstraction layer. */ @@ -64,6 +61,8 @@ final class TvInputHal implements Handler.Callback { private static native TvStreamConfig[] nativeGetStreamConfigs(long ptr, int deviceId, int generation); private static native void nativeClose(long ptr); + private static native int nativeSetTvMessageEnabled(long ptr, int deviceId, int streamId, + int type, boolean enabled); private final Object mLock = new Object(); private long mPtr = 0; @@ -100,6 +99,25 @@ final class TvInputHal implements Handler.Callback { } } + public int setTvMessageEnabled(int deviceId, TvStreamConfig streamConfig, int type, + boolean enabled) { + synchronized (mLock) { + if (mPtr == 0) { + return ERROR_NO_INIT; + } + int generation = mStreamConfigGenerations.get(deviceId, 0); + if (generation != streamConfig.getGeneration()) { + return ERROR_STALE_CONFIG; + } + if (nativeSetTvMessageEnabled(mPtr, deviceId, streamConfig.getStreamId(), type, + enabled) == 0) { + return SUCCESS; + } else { + return ERROR_UNKNOWN; + } + } + } + public int removeStream(int deviceId, TvStreamConfig streamConfig) { synchronized (mLock) { if (mPtr == 0) { diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java index 98dfb009e4ef..077f8d527ab5 100755 --- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java +++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java @@ -459,9 +459,11 @@ class TvInputHardwareManager implements TvInputHal.Callback { private int findDeviceIdForInputIdLocked(String inputId) { for (int i = 0; i < mConnections.size(); ++i) { - Connection connection = mConnections.get(i); - if (connection.getInfoLocked().getId().equals(inputId)) { - return i; + int key = mConnections.keyAt(i); + Connection connection = mConnections.get(key); + if (connection != null && connection.getInfoLocked() != null + && connection.getInfoLocked().getId().equals(inputId)) { + return key; } } return -1; @@ -489,6 +491,27 @@ class TvInputHardwareManager implements TvInputHal.Callback { return configsList; } + public boolean setTvMessageEnabled(String inputId, int type, + boolean enabled) { + synchronized (mLock) { + int deviceId = findDeviceIdForInputIdLocked(inputId); + if (deviceId < 0) { + Slog.e(TAG, "Invalid inputId : " + inputId); + return false; + } + + Connection connection = mConnections.get(deviceId); + boolean success = true; + for (TvStreamConfig config : connection.getConfigsLocked()) { + success = success + && mHal.setTvMessageEnabled(deviceId, config, type, enabled) + == TvInputHal.SUCCESS; + } + + return success; + } + } + /** * Take a snapshot of the given TV input into the provided Surface. */ @@ -764,6 +787,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { + " mHardwareInfo: " + mHardwareInfo + ", mInfo: " + mInfo + ", mCallback: " + mCallback + + ", mHardware: " + mHardware + ", mConfigs: " + Arrays.toString(mConfigs) + ", mCallingUid: " + mCallingUid + ", mResolvedUserId: " + mResolvedUserId diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index fd203bbfe3b5..88c9042c963e 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -2154,6 +2154,9 @@ public final class TvInputManagerService extends SystemService { try { synchronized (mLock) { try { + final String inputId = + getSessionStateLocked(sessionToken, callingUid, userId).inputId; + mTvInputHardwareManager.setTvMessageEnabled(inputId, type, enabled); getSessionLocked(sessionToken, callingUid, resolvedUserId) .setTvMessageEnabled(type, enabled); } catch (RemoteException | SessionNotFoundException e) { @@ -2711,7 +2714,10 @@ public final class TvInputManagerService extends SystemService { .audioAddress("0") .hdmiPortId(0) .build(); - mTvInputHardwareManager.onDeviceAvailable(info, null); + TvStreamConfig[] configs = { + new TvStreamConfig.Builder().streamId(19001) + .generation(1).maxHeight(600).maxWidth(800).type(1).build()}; + mTvInputHardwareManager.onDeviceAvailable(info, configs); } /** diff --git a/services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java b/services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java index 1fb97f97f421..2fb98690f661 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java +++ b/services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java @@ -114,7 +114,7 @@ class DisplayWindowPolicyControllerHelper { * @see DisplayWindowPolicyController#keepActivityOnWindowFlagsChanged(ActivityInfo, int, int) */ boolean keepActivityOnWindowFlagsChanged(ActivityInfo aInfo, int flagChanges, - int privateFlagChanges) { + int privateFlagChanges, int flagValues, int privateFlagValues) { if (mDisplayWindowPolicyController == null) { return true; } @@ -125,7 +125,7 @@ class DisplayWindowPolicyControllerHelper { } return mDisplayWindowPolicyController.keepActivityOnWindowFlagsChanged( - aInfo, flagChanges, privateFlagChanges); + aInfo, flagValues, privateFlagValues); } /** Update the top activity and the uids of non-finishing activity */ diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 510e6756b8ef..a5cdd0b43eb0 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -3594,8 +3594,11 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< && !mTransitionController.useShellTransitionsRotation()) { if (deltaRotation != Surface.ROTATION_0) { updateSurfaceRotation(t, deltaRotation, null /* positionLeash */); + t.setFixedTransformHint(mSurfaceControl, + getWindowConfiguration().getDisplayRotation()); } else if (deltaRotation != mLastDeltaRotation) { t.setMatrix(mSurfaceControl, 1, 0, 0, 1); + t.unsetFixedTransformHint(mSurfaceControl); } } mLastDeltaRotation = deltaRotation; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 6cb6d9d7bcea..f9b6fc10360d 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2290,14 +2290,24 @@ public class WindowManagerService extends IWindowManager.Stub winAnimator.setColorSpaceAgnosticLocked((win.mAttrs.privateFlags & WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC) != 0); } - if (win.mActivityRecord != null - && !displayContent.mDwpcHelper.keepActivityOnWindowFlagsChanged( - win.mActivityRecord.info, flagChanges, privateFlagChanges)) { - mH.sendMessage(mH.obtainMessage(H.REPARENT_TASK_TO_DEFAULT_DISPLAY, - win.mActivityRecord.getTask())); - Slog.w(TAG_WM, "Activity " + win.mActivityRecord + " window flag changed," - + " can't remain on display " + displayContent.getDisplayId()); - return 0; + // See if the DisplayWindowPolicyController wants to keep the activity on the window + if (displayContent.mDwpcHelper.hasController() + && win.mActivityRecord != null && (!win.mRelayoutCalled || flagChanges != 0 + || privateFlagChanges != 0)) { + int newOrChangedFlags = !win.mRelayoutCalled ? win.mAttrs.flags : flagChanges; + int newOrChangedPrivateFlags = + !win.mRelayoutCalled ? win.mAttrs.privateFlags : privateFlagChanges; + + if (!displayContent.mDwpcHelper.keepActivityOnWindowFlagsChanged( + win.mActivityRecord.info, newOrChangedFlags, newOrChangedPrivateFlags, + win.mAttrs.flags, + win.mAttrs.privateFlags)) { + mH.sendMessage(mH.obtainMessage(H.REPARENT_TASK_TO_DEFAULT_DISPLAY, + win.mActivityRecord.getTask())); + Slog.w(TAG_WM, "Activity " + win.mActivityRecord + " window flag changed," + + " can't remain on display " + displayContent.getDisplayId()); + return 0; + } } } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 6f07b7719be0..032f08a92abb 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1980,19 +1980,16 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP /** * Like isOnScreen(), but we don't return true if the window is part - * of a transition but has not yet started animating. + * of a transition that has not yet been started. */ boolean isReadyForDisplay() { - if (!mHasSurface || mDestroying || !isVisibleByPolicy()) { - return false; - } - if (mToken.waitingToShow && getDisplayContent().mAppTransition.isTransitionSet() - && !isAnimating(TRANSITION | PARENTS, ANIMATION_TYPE_APP_TRANSITION)) { + if (mToken.waitingToShow && getDisplayContent().mAppTransition.isTransitionSet()) { return false; } final boolean parentAndClientVisible = !isParentWindowHidden() && mViewVisibility == View.VISIBLE && mToken.isVisible(); - return parentAndClientVisible || isAnimating(TRANSITION | PARENTS, ANIMATION_TYPE_ALL); + return mHasSurface && isVisibleByPolicy() && !mDestroying + && (parentAndClientVisible || isAnimating(TRANSITION | PARENTS)); } boolean isFullyTransparent() { diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index da54b15fd0a4..4c5efef795d8 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -596,6 +596,7 @@ class WindowToken extends WindowContainer<WindowState> { .build(); t.setPosition(leash, mLastSurfacePosition.x, mLastSurfacePosition.y); t.reparent(getSurfaceControl(), leash); + t.setFixedTransformHint(leash, getWindowConfiguration().getDisplayRotation()); mFixedRotationTransformLeash = leash; updateSurfaceRotation(t, rotation, mFixedRotationTransformLeash); return mFixedRotationTransformLeash; diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index cf57b339cc22..369c97470245 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -2567,6 +2567,11 @@ static void nativeSetStylusPointerIconEnabled(JNIEnv* env, jobject nativeImplObj im->setStylusPointerIconEnabled(enabled); } +static void nativeNotifyKeyGestureTimeoutsChanged(JNIEnv* env, jobject nativeImplObj) { + NativeInputManager* im = getNativeInputManager(env, nativeImplObj); + im->getInputManager()->getDispatcher().requestRefreshConfiguration(); +} + // ---------------------------------------------------------------------------- static const JNINativeMethod gInputManagerMethods[] = { @@ -2663,6 +2668,7 @@ static const JNINativeMethod gInputManagerMethods[] = { (void*)nativeSetStylusButtonMotionEventsEnabled}, {"getMouseCursorPosition", "()[F", (void*)nativeGetMouseCursorPosition}, {"setStylusPointerIconEnabled", "(Z)V", (void*)nativeSetStylusPointerIconEnabled}, + {"notifyKeyGestureTimeoutsChanged", "()V", (void*)nativeNotifyKeyGestureTimeoutsChanged}, }; #define FIND_CLASS(var, className) \ diff --git a/services/core/jni/com_android_server_tv_TvInputHal.cpp b/services/core/jni/com_android_server_tv_TvInputHal.cpp index a8d2f4e9be5b..a8806b5ef643 100644 --- a/services/core/jni/com_android_server_tv_TvInputHal.cpp +++ b/services/core/jni/com_android_server_tv_TvInputHal.cpp @@ -84,23 +84,26 @@ static jobjectArray nativeGetStreamConfigs(JNIEnv* env, jclass clazz, return result; } +static int nativeSetTvMessageEnabled(JNIEnv* env, jclass clazz, jlong ptr, jint deviceId, + jint streamId, jint type, jboolean enabled) { + JTvInputHal* tvInputHal = (JTvInputHal*)ptr; + return tvInputHal->setTvMessageEnabled(deviceId, streamId, type, enabled); +} + static void nativeClose(JNIEnv* env, jclass clazz, jlong ptr) { JTvInputHal* tvInputHal = (JTvInputHal*)ptr; delete tvInputHal; } static const JNINativeMethod gTvInputHalMethods[] = { - /* name, signature, funcPtr */ - { "nativeOpen", "(Landroid/os/MessageQueue;)J", - (void*) nativeOpen }, - { "nativeAddOrUpdateStream", "(JIILandroid/view/Surface;)I", - (void*) nativeAddOrUpdateStream }, - { "nativeRemoveStream", "(JII)I", - (void*) nativeRemoveStream }, - { "nativeGetStreamConfigs", "(JII)[Landroid/media/tv/TvStreamConfig;", - (void*) nativeGetStreamConfigs }, - { "nativeClose", "(J)V", - (void*) nativeClose }, + /* name, signature, funcPtr */ + {"nativeOpen", "(Landroid/os/MessageQueue;)J", (void*)nativeOpen}, + {"nativeAddOrUpdateStream", "(JIILandroid/view/Surface;)I", (void*)nativeAddOrUpdateStream}, + {"nativeRemoveStream", "(JII)I", (void*)nativeRemoveStream}, + {"nativeGetStreamConfigs", "(JII)[Landroid/media/tv/TvStreamConfig;", + (void*)nativeGetStreamConfigs}, + {"nativeSetTvMessageEnabled", "(JIIIZ)I", (void*)nativeSetTvMessageEnabled}, + {"nativeClose", "(J)V", (void*)nativeClose}, }; #define FIND_CLASS(var, className) \ diff --git a/services/core/jni/tvinput/JTvInputHal.cpp b/services/core/jni/tvinput/JTvInputHal.cpp index 98e6b19ce410..6bb52174fcb2 100644 --- a/services/core/jni/tvinput/JTvInputHal.cpp +++ b/services/core/jni/tvinput/JTvInputHal.cpp @@ -144,6 +144,17 @@ int JTvInputHal::removeStream(int deviceId, int streamId) { return NO_ERROR; } +int JTvInputHal::setTvMessageEnabled(int deviceId, int streamId, int type, bool enabled) { + Mutex::Autolock autoLock(&mLock); + if (!mTvInput->setTvMessageEnabled(deviceId, streamId, + static_cast<AidlTvMessageEventType>(type), enabled) + .isOk()) { + ALOGE("Error in setTvMessageEnabled. device id:%d stream id:%d", deviceId, streamId); + return BAD_VALUE; + } + return NO_ERROR; +} + const std::vector<AidlTvStreamConfig> JTvInputHal::getStreamConfigs(int deviceId) { std::vector<AidlTvStreamConfig> list; ::ndk::ScopedAStatus status = mTvInput->getStreamConfigurations(deviceId, &list); @@ -384,4 +395,15 @@ JTvInputHal::ITvInputWrapper::ITvInputWrapper(std::shared_ptr<AidlITvInput>& aid } } +::ndk::ScopedAStatus JTvInputHal::ITvInputWrapper::setTvMessageEnabled(int32_t deviceId, + int32_t streamId, + TvMessageEventType in_type, + bool enabled) { + if (mIsHidl) { + return ::ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); + } else { + return mAidlTvInput->setTvMessageEnabled(deviceId, streamId, in_type, enabled); + } +} + } // namespace android diff --git a/services/core/jni/tvinput/JTvInputHal.h b/services/core/jni/tvinput/JTvInputHal.h index 984407a0c37c..e29da79d62dd 100644 --- a/services/core/jni/tvinput/JTvInputHal.h +++ b/services/core/jni/tvinput/JTvInputHal.h @@ -44,6 +44,8 @@ using ::aidl::android::hardware::tv::input::BnTvInputCallback; using ::aidl::android::hardware::tv::input::CableConnectionStatus; using ::aidl::android::hardware::tv::input::TvInputEventType; using ::aidl::android::hardware::tv::input::TvInputType; +using ::aidl::android::hardware::tv::input::TvMessageEvent; +using ::aidl::android::hardware::tv::input::TvMessageEventType; using AidlAudioDevice = ::aidl::android::media::audio::common::AudioDevice; using AidlAudioDeviceAddress = ::aidl::android::media::audio::common::AudioDeviceAddress; @@ -53,6 +55,7 @@ using AidlNativeHandle = ::aidl::android::hardware::common::NativeHandle; using AidlTvInputDeviceInfo = ::aidl::android::hardware::tv::input::TvInputDeviceInfo; using AidlTvInputEvent = ::aidl::android::hardware::tv::input::TvInputEvent; using AidlTvMessageEvent = ::aidl::android::hardware::tv::input::TvMessageEvent; +using AidlTvMessageEventType = ::aidl::android::hardware::tv::input::TvMessageEventType; using AidlTvStreamConfig = ::aidl::android::hardware::tv::input::TvStreamConfig; extern gTvInputHalClassInfoType gTvInputHalClassInfo; @@ -69,6 +72,7 @@ public: static JTvInputHal* createInstance(JNIEnv* env, jobject thiz, const sp<Looper>& looper); int addOrUpdateStream(int deviceId, int streamId, const sp<Surface>& surface); + int setTvMessageEnabled(int deviceId, int streamId, int type, bool enabled); int removeStream(int deviceId, int streamId); const std::vector<AidlTvStreamConfig> getStreamConfigs(int deviceId); @@ -150,6 +154,8 @@ private: ::ndk::ScopedAStatus openStream(int32_t in_deviceId, int32_t in_streamId, AidlNativeHandle* _aidl_return); ::ndk::ScopedAStatus closeStream(int32_t in_deviceId, int32_t in_streamId); + ::ndk::ScopedAStatus setTvMessageEnabled(int32_t deviceId, int32_t streamId, + TvMessageEventType in_type, bool enabled); private: ::ndk::ScopedAStatus hidlSetCallback(const std::shared_ptr<TvInputCallback>& in_callback); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index a35f34dcde86..4f290ccc6ef1 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -521,6 +521,7 @@ import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.text.DateFormat; import java.time.LocalDate; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -533,6 +534,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.Queue; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -568,7 +570,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private static final int REQUEST_PROFILE_OFF_DEADLINE = 5572; + // Binary XML serializer doesn't support longer strings + private static final int MAX_POLICY_STRING_LENGTH = 65535; + // FrameworkParsingPackageUtils#MAX_FILE_NAME_SIZE, Android packages are used in dir names. + private static final int MAX_PACKAGE_NAME_LENGTH = 223; + private static final int MAX_PROFILE_NAME_LENGTH = 200; + private static final int MAX_LONG_SUPPORT_MESSAGE_LENGTH = 20000; + private static final int MAX_SHORT_SUPPORT_MESSAGE_LENGTH = 200; + private static final int MAX_ORG_NAME_LENGTH = 200; private static final long MS_PER_DAY = TimeUnit.DAYS.toMillis(1); @@ -864,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"; @@ -6041,7 +6051,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public void lockNow(int flags, String callerPackageName, boolean parent) { CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(callerPackageName); } else { caller = getCallerIdentity(); @@ -6053,7 +6063,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { ActiveAdmin admin; // Make sure the caller has any active admin with the right policy or // the required permission. - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { admin = enforcePermissionAndGetEnforcingAdmin( /* admin= */ null, /* permission= */ MANAGE_DEVICE_POLICY_LOCK, @@ -8907,13 +8917,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { // The effect of this policy is device-wide. enforcePermission(SET_TIME, caller.getPackageName(), UserHandle.USER_ALL); } else { @@ -8941,13 +8951,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return false; } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { enforceCanQuery(SET_TIME, caller.getPackageName(), UserHandle.USER_ALL); } else { Objects.requireNonNull(who, "ComponentName is null"); @@ -8976,7 +8986,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { caller = getCallerIdentity(who); } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { // The effect of this policy is device-wide. EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( who, @@ -9016,13 +9026,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { // The effect of this policy is device-wide. enforceCanQuery(SET_TIME_ZONE, caller.getPackageName(), UserHandle.USER_ALL); } else { @@ -9325,7 +9335,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); @@ -9335,7 +9345,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final int userHandle = caller.getUserId(); int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle; synchronized (getLockObject()) { - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { // SUPPORT USES_POLICY_DISABLE_KEYGUARD_FEATURES EnforcingAdmin admin = enforcePermissionAndGetEnforcingAdmin( who, MANAGE_DEVICE_POLICY_KEYGUARD, caller.getPackageName(), @@ -9414,7 +9424,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (getLockObject()) { if (who != null) { - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin admin = getEnforcingAdminForCaller( who, who.getPackageName()); Integer features = mDevicePolicyEngine.getLocalPolicySetByAdmin( @@ -9428,7 +9438,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { Integer features = mDevicePolicyEngine.getResolvedPolicy( PolicyDefinition.KEYGUARD_DISABLED_FEATURES, affectedUserId); @@ -11625,7 +11635,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final CallerIdentity caller = getCallerIdentity(who, callerPackage); checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_APPLICATION_RESTRICTIONS); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( who, MANAGE_DEVICE_POLICY_APP_RESTRICTIONS, @@ -11730,7 +11740,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } Objects.requireNonNull(agent, "agent is null"); - int userHandle = UserHandle.getCallingUserId(); + + enforceMaxPackageNameLength(agent.getPackageName()); + final String agentAsString = agent.flattenToString(); + enforceMaxStringLength(agentAsString, "agent name"); + if (args != null) { + enforceMaxStringLength(args, "args"); + } + + int userHandle = mInjector.userHandleGetCallingUserId(); synchronized (getLockObject()) { ActiveAdmin ap; if (isPermissionCheckFlagEnabled()) { @@ -11747,7 +11765,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { checkCanExecuteOrThrowUnsafe( DevicePolicyManager.OPERATION_SET_TRUST_AGENT_CONFIGURATION); - ap.trustAgentInfos.put(agent.flattenToString(), new TrustAgentInfo(args)); + ap.trustAgentInfos.put(agentAsString, new TrustAgentInfo(args)); saveSettingsLocked(userHandle); } } @@ -12017,6 +12035,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { isDeviceOwner(caller) || isProfileOwner(caller)); if (packageList != null) { + for (String pkg : packageList) { + enforceMaxPackageNameLength(pkg); + } + int userId = caller.getUserId(); final List<AccessibilityServiceInfo> enabledServices; long id = mInjector.binderClearCallingIdentity(); @@ -12174,7 +12196,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } CallerIdentity caller; - if (isPermissionCheckFlagEnabled()) { + if (isPolicyEngineForFinanceFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); @@ -12184,7 +12206,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { int userId = getProfileParentUserIfRequested( caller.getUserId(), calledOnParentInstance); if (calledOnParentInstance) { - if (!isPermissionCheckFlagEnabled()) { + if (!isPolicyEngineForFinanceFlagEnabled()) { Preconditions.checkCallAuthorization( isProfileOwnerOfOrganizationOwnedDevice(caller)); } @@ -12192,12 +12214,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { "Permitted input methods must allow all input methods or only " + "system input methods when called on the parent instance of an " + "organization-owned device"); - } else if (!isPermissionCheckFlagEnabled()) { + } else if (!isPolicyEngineForFinanceFlagEnabled()) { Preconditions.checkCallAuthorization( isDefaultDeviceOwner(caller) || isProfileOwner(caller)); } if (packageList != null) { + for (String pkg : packageList) { + enforceMaxPackageNameLength(pkg); + } + List<InputMethodInfo> enabledImes = mInjector.binderWithCleanCallingIdentity(() -> InputMethodManagerInternal.get().getEnabledInputMethodListAsUser(userId)); if (enabledImes != null) { @@ -12216,7 +12242,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (getLockObject()) { if (isPolicyEngineForFinanceFlagEnabled()) { - EnforcingAdmin admin = getEnforcingAdminForCaller(who, callerPackageName); + EnforcingAdmin admin = enforcePermissionAndGetEnforcingAdmin( + who, MANAGE_DEVICE_POLICY_INPUT_METHODS, + caller.getPackageName(), userId); mDevicePolicyEngine.setLocalPolicy( PolicyDefinition.PERMITTED_INPUT_METHODS, admin, @@ -13034,7 +13062,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { String packageName) { final CallerIdentity caller = getCallerIdentity(who, callerPackage); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin enforcingAdmin = enforceCanQueryAndGetEnforcingAdmin( who, MANAGE_DEVICE_POLICY_APP_RESTRICTIONS, @@ -13104,7 +13132,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final CallerIdentity caller = getCallerIdentity(who, callerPackage); ActiveAdmin admin; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( who, MANAGE_DEVICE_POLICY_PACKAGE_STATE, @@ -13201,7 +13229,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { public boolean isPackageSuspended(ComponentName who, String callerPackage, String packageName) { final CallerIdentity caller = getCallerIdentity(who, callerPackage); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { enforcePermission( MANAGE_DEVICE_POLICY_PACKAGE_STATE, caller.getPackageName(), @@ -13411,6 +13439,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { public void setUserRestrictionGlobally(String callerPackage, String key) { final CallerIdentity caller = getCallerIdentity(callerPackage); + EnforcingAdmin admin = enforcePermissionForUserRestriction( + /* who= */ null, + key, + caller.getPackageName(), + UserHandle.USER_ALL + ); + checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_SET_USER_RESTRICTION); if (!isPolicyEngineForFinanceFlagEnabled()) { @@ -13427,13 +13462,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { throw new IllegalArgumentException("Invalid restriction key: " + key); } - EnforcingAdmin admin = enforcePermissionForUserRestriction( - /* who= */ null, - key, - caller.getPackageName(), - UserHandle.USER_ALL - ); - setGlobalUserRestrictionInternal(admin, key, /* enabled= */ true); logUserRestrictionCall(key, /* enabled= */ true, /* parent= */ false, caller); @@ -13807,7 +13835,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { boolean hidden, boolean parent) { CallerIdentity caller = getCallerIdentity(who, callerPackage); final int userId = parent ? getProfileParentId(caller.getUserId()) : caller.getUserId(); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { // TODO: We need to ensure the delegate with DELEGATION_PACKAGE_ACCESS can do this enforcePermission(MANAGE_DEVICE_POLICY_PACKAGE_STATE, caller.getPackageName(), userId); } else { @@ -13826,7 +13854,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { boolean result; synchronized (getLockObject()) { if (parent) { - if (!isPolicyEngineForFinanceFlagEnabled()) { + if (!isPermissionCheckFlagEnabled()) { Preconditions.checkCallAuthorization( isProfileOwnerOfOrganizationOwnedDevice( caller.getUserId()) && isManagedProfile(caller.getUserId())); @@ -13843,7 +13871,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { Slogf.v(LOG_TAG, "calling pm.setApplicationHiddenSettingAsUser(%s, %b, %d)", packageName, hidden, userId); } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin admin = getEnforcingAdminForCaller(who, callerPackage); mDevicePolicyEngine.setLocalPolicy( PolicyDefinition.APPLICATION_HIDDEN(packageName), @@ -13882,7 +13910,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { String packageName, boolean parent) { CallerIdentity caller = getCallerIdentity(who, callerPackage); int userId = parent ? getProfileParentId(caller.getUserId()) : caller.getUserId(); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { // TODO: Also support DELEGATION_PACKAGE_ACCESS enforcePermission(MANAGE_DEVICE_POLICY_PACKAGE_STATE, caller.getPackageName(), userId); } else { @@ -13894,7 +13922,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (getLockObject()) { if (parent) { - if (!isPolicyEngineForFinanceFlagEnabled()) { + if (!isPermissionCheckFlagEnabled()) { Preconditions.checkCallAuthorization( isProfileOwnerOfOrganizationOwnedDevice(caller.getUserId()) && isManagedProfile(caller.getUserId())); @@ -14082,14 +14110,17 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return; } + + enforceMaxStringLength(accountType, "account type"); + CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); } synchronized (getLockObject()) { - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { int affectedUser = getAffectedUser(parent); EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( who, @@ -14152,7 +14183,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { CallerIdentity caller; Preconditions.checkArgumentNonnegative(userId, "Invalid userId"); final ArraySet<String> resultSet = new ArraySet<>(); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { int affectedUser = parent ? getProfileParentId(userId) : userId; caller = getCallerIdentity(callerPackageName); if (!hasPermission(MANAGE_DEVICE_POLICY_ACCOUNT_MANAGEMENT, @@ -14772,6 +14803,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { public void setLockTaskPackages(ComponentName who, String callerPackageName, String[] packages) throws SecurityException { Objects.requireNonNull(packages, "packages is null"); + for (String pkg : packages) { + enforceMaxPackageNameLength(pkg); + } + CallerIdentity caller; if (isPolicyEngineForFinanceFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); @@ -15519,12 +15554,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { public boolean setStatusBarDisabled(ComponentName who, String callerPackageName, boolean disabled) { CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); } else { caller = getCallerIdentity(who); } - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { enforcePermission(MANAGE_DEVICE_POLICY_STATUS_BAR, caller.getPackageName(), UserHandle.USER_ALL); } else { @@ -15535,7 +15570,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { int userId = caller.getUserId(); synchronized (getLockObject()) { - if (!isPolicyEngineForFinanceFlagEnabled()) { + if (!isPermissionCheckFlagEnabled()) { Preconditions.checkCallAuthorization(isUserAffiliatedWithDeviceLocked(userId), "Admin " + who + " is neither the device owner or affiliated " + "user's profile owner."); @@ -15594,7 +15629,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public boolean isStatusBarDisabled(String callerPackage) { final CallerIdentity caller = getCallerIdentity(callerPackage); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { enforceCanQuery( MANAGE_DEVICE_POLICY_STATUS_BAR, caller.getPackageName(), caller.getUserId()); } else { @@ -15604,7 +15639,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { int userId = caller.getUserId(); synchronized (getLockObject()) { - if (!isPolicyEngineForFinanceFlagEnabled()) { + if (!isPermissionCheckFlagEnabled()) { Preconditions.checkCallAuthorization(isUserAffiliatedWithDeviceLocked(userId), "Admin " + callerPackage + " is neither the device owner or affiliated user's profile owner."); @@ -16764,7 +16799,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } EnforcingAdmin enforcingAdmin; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( admin, MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS, @@ -16935,7 +16970,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { public int getPermissionGrantState(ComponentName admin, String callerPackage, String packageName, String permission) throws RemoteException { final CallerIdentity caller = getCallerIdentity(admin, callerPackage); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { enforceCanQuery(MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS, caller.getPackageName(), caller.getUserId()); } else { @@ -17374,6 +17409,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { CallerIdentity caller; ActiveAdmin admin; + message = truncateIfLonger(message, MAX_SHORT_SUPPORT_MESSAGE_LENGTH); + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(who, callerPackageName); EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( @@ -17434,6 +17471,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return; } + + message = truncateIfLonger(message, MAX_LONG_SUPPORT_MESSAGE_LENGTH); + Objects.requireNonNull(who, "ComponentName is null"); final CallerIdentity caller = getCallerIdentity(who); synchronized (getLockObject()) { @@ -17598,6 +17638,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { Preconditions.checkCallAuthorization(isDeviceOwner(caller) || isProfileOwner(caller)); } + text = truncateIfLonger(text, MAX_ORG_NAME_LENGTH); + synchronized (getLockObject()) { if (!isPermissionCheckFlagEnabled()) { admin = getProfileOwnerOrDeviceOwnerLocked(caller.getUserId()); @@ -17878,9 +17920,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { throw new IllegalArgumentException("ids must not be null"); } for (String id : ids) { - if (TextUtils.isEmpty(id)) { - throw new IllegalArgumentException("ids must not contain empty string"); - } + Preconditions.checkArgument(!TextUtils.isEmpty(id), "ids must not have empty string"); + enforceMaxStringLength(id, "affiliation id"); } final Set<String> affiliationIds = new ArraySet<>(ids); @@ -19067,14 +19108,14 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { throw new IllegalArgumentException("token must be at least 32-byte long"); } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(admin, callerPackageName); } else { caller = getCallerIdentity(admin); } final int userId = caller.getUserId(); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( admin, MANAGE_DEVICE_POLICY_RESET_PASSWORD, @@ -19130,7 +19171,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return false; } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(admin, callerPackageName); } else { caller = getCallerIdentity(admin); @@ -19138,7 +19179,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final int userId = caller.getUserId(); boolean result = false; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( admin, MANAGE_DEVICE_POLICY_RESET_PASSWORD, @@ -19177,14 +19218,14 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return false; } CallerIdentity caller; - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { caller = getCallerIdentity(admin, callerPackageName); } else { caller = getCallerIdentity(admin); } int userId = caller.getUserId(); - if (isPolicyEngineForFinanceFlagEnabled()) { + if (isPermissionCheckFlagEnabled()) { EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( admin, MANAGE_DEVICE_POLICY_RESET_PASSWORD, @@ -19393,6 +19434,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { "Provided administrator and target are the same object."); Preconditions.checkArgument(!admin.getPackageName().equals(target.getPackageName()), "Provided administrator and target have the same package name."); + if (bundle != null) { + enforceMaxStringLength(bundle, "bundle"); + } final CallerIdentity caller = getCallerIdentity(admin); Preconditions.checkCallAuthorization( @@ -22798,6 +22842,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { MANAGE_DEVICE_POLICY_DISPLAY, MANAGE_DEVICE_POLICY_FACTORY_RESET, MANAGE_DEVICE_POLICY_FUN, + MANAGE_DEVICE_POLICY_INPUT_METHODS, MANAGE_DEVICE_POLICY_INSTALL_UNKNOWN_SOURCES, MANAGE_DEVICE_POLICY_KEYGUARD, MANAGE_DEVICE_POLICY_LOCALE, @@ -22873,9 +22918,11 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { MANAGE_DEVICE_POLICY_BLUETOOTH, MANAGE_DEVICE_POLICY_CALLS, MANAGE_DEVICE_POLICY_CAMERA, + MANAGE_DEVICE_POLICY_CERTIFICATES, MANAGE_DEVICE_POLICY_DEBUGGING_FEATURES, MANAGE_DEVICE_POLICY_DISPLAY, MANAGE_DEVICE_POLICY_FACTORY_RESET, + MANAGE_DEVICE_POLICY_INPUT_METHODS, MANAGE_DEVICE_POLICY_INSTALL_UNKNOWN_SOURCES, MANAGE_DEVICE_POLICY_KEYGUARD, MANAGE_DEVICE_POLICY_LOCALE, @@ -22908,7 +22955,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { MANAGE_DEVICE_POLICY_ACROSS_USERS, MANAGE_DEVICE_POLICY_AIRPLANE_MODE, MANAGE_DEVICE_POLICY_APPS_CONTROL, - MANAGE_DEVICE_POLICY_CERTIFICATES, MANAGE_DEVICE_POLICY_COMMON_CRITERIA_MODE, MANAGE_DEVICE_POLICY_DEFAULT_SMS, MANAGE_DEVICE_POLICY_LOCALE, @@ -23033,11 +23079,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { //Map of Permission to Delegate Scope. private static final HashMap<String, String> DELEGATE_SCOPES = new HashMap<>(); { - DELEGATE_SCOPES.put(MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS, DELEGATION_PERMISSION_GRANT); DELEGATE_SCOPES.put(MANAGE_DEVICE_POLICY_APP_RESTRICTIONS, DELEGATION_APP_RESTRICTIONS); DELEGATE_SCOPES.put(MANAGE_DEVICE_POLICY_BLOCK_UNINSTALL, DELEGATION_BLOCK_UNINSTALL); - DELEGATE_SCOPES.put(MANAGE_DEVICE_POLICY_SECURITY_LOGGING, DELEGATION_SECURITY_LOGGING); + DELEGATE_SCOPES.put(MANAGE_DEVICE_POLICY_CERTIFICATES, DELEGATION_CERT_INSTALL); DELEGATE_SCOPES.put(MANAGE_DEVICE_POLICY_PACKAGE_STATE, DELEGATION_PACKAGE_ACCESS); + DELEGATE_SCOPES.put(MANAGE_DEVICE_POLICY_RUNTIME_PERMISSIONS, DELEGATION_PERMISSION_GRANT); + DELEGATE_SCOPES.put(MANAGE_DEVICE_POLICY_SECURITY_LOGGING, DELEGATION_SECURITY_LOGGING); } private static final HashMap<String, String> CROSS_USER_PERMISSIONS = @@ -24137,6 +24184,53 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { }); } + /** + * Truncates char sequence to maximum length, nulls are ignored. + */ + private static CharSequence truncateIfLonger(CharSequence input, int maxLength) { + return input == null || input.length() <= maxLength + ? input + : input.subSequence(0, maxLength); + } + + /** + * Throw if string argument is too long to be serialized. + */ + private static void enforceMaxStringLength(String str, String argName) { + Preconditions.checkArgument( + str.length() <= MAX_POLICY_STRING_LENGTH, argName + " loo long"); + } + + private static void enforceMaxPackageNameLength(String pkg) { + Preconditions.checkArgument( + pkg.length() <= MAX_PACKAGE_NAME_LENGTH, "Package name too long"); + } + + /** + * Throw if persistable bundle contains any string that we can't serialize. + */ + private static void enforceMaxStringLength(PersistableBundle bundle, String argName) { + // Persistable bundles can have other persistable bundles as values, traverse with a queue. + Queue<PersistableBundle> queue = new ArrayDeque<>(); + queue.add(bundle); + while (!queue.isEmpty()) { + PersistableBundle current = queue.remove(); + for (String key : current.keySet()) { + enforceMaxStringLength(key, "key in " + argName); + Object value = current.get(key); + if (value instanceof String) { + enforceMaxStringLength((String) value, "string value in " + argName); + } else if (value instanceof String[]) { + for (String str : (String[]) value) { + enforceMaxStringLength(str, "string value in " + argName); + } + } else if (value instanceof PersistableBundle) { + queue.add((PersistableBundle) value); + } + } + } + } + private ActiveAdmin getActiveAdminForCaller(@Nullable ComponentName who, CallerIdentity caller) { synchronized (getLockObject()) { diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java index c4aa0bbc24b5..8dc0ac6515cd 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java @@ -64,6 +64,7 @@ import com.android.server.ExtendedMockitoRule; import com.android.server.LocalServices; import com.android.server.am.BatteryStatsService; import com.android.server.display.RampAnimator.DualRampAnimator; +import com.android.server.display.brightness.BrightnessEvent; import com.android.server.display.color.ColorDisplayService; import com.android.server.display.layout.Layout; import com.android.server.display.whitebalance.DisplayWhiteBalanceController; @@ -596,17 +597,17 @@ public final class DisplayPowerController2Test { // We should still set screen state for the default display DisplayPowerRequest dpr = new DisplayPowerRequest(); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); - advanceTime(1); + advanceTime(1); // Run updatePowerState verify(mHolder.displayPowerState, times(2)).setScreenState(anyInt()); mHolder = createDisplayPowerController(42, UNIQUE_ID); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); - advanceTime(1); + advanceTime(1); // Run updatePowerState verify(mHolder.displayPowerState, never()).setScreenState(anyInt()); mHolder.dpc.onBootCompleted(); - advanceTime(1); + advanceTime(1); // Run updatePowerState verify(mHolder.displayPowerState).setScreenState(anyInt()); } @@ -632,8 +633,8 @@ public final class DisplayPowerController2Test { .thenReturn(brightness); dpr.policy = DisplayPowerRequest.POLICY_BRIGHT; when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_ON); - when(mHolder.automaticBrightnessController.getAutomaticScreenBrightness()) - .thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); + when(mHolder.automaticBrightnessController.getAutomaticScreenBrightness( + any(BrightnessEvent.class))).thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); advanceTime(1); // Run updatePowerState @@ -667,8 +668,8 @@ public final class DisplayPowerController2Test { .thenReturn(brightness); dpr.policy = DisplayPowerRequest.POLICY_BRIGHT; when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_ON); - when(mHolder.automaticBrightnessController.getAutomaticScreenBrightness()) - .thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); + when(mHolder.automaticBrightnessController.getAutomaticScreenBrightness( + any(BrightnessEvent.class))).thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); advanceTime(1); // Run updatePowerState @@ -822,6 +823,21 @@ public final class DisplayPowerController2Test { ); } + @Test + public void testUpdateBrightnessThrottlingDataId() { + mHolder.display.getDisplayInfoLocked().thermalBrightnessThrottlingDataId = + "throttling-data-id"; + clearInvocations(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()); + + mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY); + DisplayPowerRequest dpr = new DisplayPowerRequest(); + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()) + .getThermalBrightnessThrottlingDataMapByThrottlingId(); + } + /** * Creates a mock and registers it to {@link LocalServices}. */ @@ -862,8 +878,6 @@ public final class DisplayPowerController2Test { when(logicalDisplayMock.getDisplayInfoLocked()).thenReturn(info); when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled); when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false); - when(logicalDisplayMock.getThermalBrightnessThrottlingDataIdLocked()).thenReturn( - DisplayDeviceConfig.DEFAULT_ID); when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo); when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId); when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock); diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java index 415adbbac91e..5c0810fdca44 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -829,6 +829,21 @@ public final class DisplayPowerControllerTest { ); } + @Test + public void testUpdateBrightnessThrottlingDataId() { + mHolder.display.getDisplayInfoLocked().thermalBrightnessThrottlingDataId = + "throttling-data-id"; + clearInvocations(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()); + + mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY); + DisplayPowerRequest dpr = new DisplayPowerRequest(); + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.display.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig()) + .getThermalBrightnessThrottlingDataMapByThrottlingId(); + } + /** * Creates a mock and registers it to {@link LocalServices}. */ @@ -869,8 +884,6 @@ public final class DisplayPowerControllerTest { when(logicalDisplayMock.getDisplayInfoLocked()).thenReturn(info); when(logicalDisplayMock.isEnabledLocked()).thenReturn(isEnabled); when(logicalDisplayMock.isInTransitionLocked()).thenReturn(false); - when(logicalDisplayMock.getThermalBrightnessThrottlingDataIdLocked()).thenReturn( - DisplayDeviceConfig.DEFAULT_ID); when(displayDeviceMock.getDisplayDeviceInfoLocked()).thenReturn(deviceInfo); when(displayDeviceMock.getUniqueId()).thenReturn(uniqueId); when(displayDeviceMock.getDisplayDeviceConfig()).thenReturn(displayDeviceConfigMock); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java index 8f0d0144a40e..eb6670ee964c 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java @@ -146,7 +146,7 @@ public class AccessibilitySecurityPolicyTest { @Mock private PolicyWarningUIController mPolicyWarningUIController; @Mock - private PackageManagerInternal mMockPackageManagerInternal; + private PackageManagerInternal mPackageManagerInternal; @Before public void setUp() { @@ -158,8 +158,7 @@ public class AccessibilitySecurityPolicyTest { R.dimen.accessibility_focus_highlight_stroke_width, 1); mA11ySecurityPolicy = new AccessibilitySecurityPolicy( - mPolicyWarningUIController, mContext, mMockA11yUserManager, - mMockPackageManagerInternal); + mPolicyWarningUIController, mContext, mMockA11yUserManager); mA11ySecurityPolicy.setSendingNonA11yToolNotificationLocked(true); mA11ySecurityPolicy.setAccessibilityWindowManager(mMockA11yWindowManager); mA11ySecurityPolicy.setAppWidgetManager(mMockAppWidgetManager); @@ -238,8 +237,8 @@ public class AccessibilitySecurityPolicyTest { @Test public void resolveValidReportedPackage_uidAndPkgNameMatched_returnPkgName() throws PackageManager.NameNotFoundException { - when(mMockPackageManagerInternal.isSameApp(PACKAGE_NAME, APP_UID, TEST_USER_ID)) - .thenReturn(true); + when(mMockPackageManager.getPackageUidAsUser(PACKAGE_NAME, + PackageManager.MATCH_ANY_USER, TEST_USER_ID)).thenReturn(APP_UID); assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked( PACKAGE_NAME, APP_UID, TEST_USER_ID, APP_PID), @@ -258,8 +257,8 @@ public class AccessibilitySecurityPolicyTest { when(mMockAppWidgetManager.getHostedWidgetPackages(widgetHostUid)) .thenReturn(widgetPackages); - when(mMockPackageManagerInternal.isSameApp(hostPackageName, widgetHostUid, TEST_USER_ID)) - .thenReturn(true); + when(mMockPackageManager.getPackageUidAsUser(hostPackageName, TEST_USER_ID)) + .thenReturn(widgetHostUid); assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked( widgetPackageName, widgetHostUid, TEST_USER_ID, widgetHostPid), @@ -273,8 +272,8 @@ public class AccessibilitySecurityPolicyTest { final String[] uidPackages = {PACKAGE_NAME, PACKAGE_NAME2}; when(mMockPackageManager.getPackagesForUid(APP_UID)) .thenReturn(uidPackages); - when(mMockPackageManagerInternal.isSameApp(invalidPackageName, APP_UID, TEST_USER_ID)) - .thenReturn(false); + when(mMockPackageManager.getPackageUidAsUser(invalidPackageName, TEST_USER_ID)) + .thenThrow(PackageManager.NameNotFoundException.class); when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) .thenReturn(new ArraySet<>()); mContext.getTestablePermissions().setPermission( @@ -293,8 +292,8 @@ public class AccessibilitySecurityPolicyTest { final String[] uidPackages = {PACKAGE_NAME}; when(mMockPackageManager.getPackagesForUid(APP_UID)) .thenReturn(uidPackages); - when(mMockPackageManagerInternal.isSameApp(wantedPackageName, wantedUid, TEST_USER_ID)) - .thenReturn(true); + when(mMockPackageManager.getPackageUidAsUser(wantedPackageName, TEST_USER_ID)) + .thenReturn(wantedUid); when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) .thenReturn(new ArraySet<>()); mContext.getTestablePermissions().setPermission( @@ -313,8 +312,8 @@ public class AccessibilitySecurityPolicyTest { final String[] uidPackages = {PACKAGE_NAME}; when(mMockPackageManager.getPackagesForUid(APP_UID)) .thenReturn(uidPackages); - when(mMockPackageManagerInternal.isSameApp(wantedPackageName, wantedUid, TEST_USER_ID)) - .thenReturn(true); + when(mMockPackageManager.getPackageUidAsUser(wantedPackageName, TEST_USER_ID)) + .thenReturn(wantedUid); when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) .thenReturn(new ArraySet<>()); mContext.getTestablePermissions().setPermission( diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java index 07c6182569b2..fb3a5f64d808 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java @@ -80,7 +80,7 @@ public class BiometricContextProviderTest { @Mock private WindowManager mWindowManager; - private OperationContextExt mOpContext = new OperationContextExt(); + private OperationContextExt mOpContext = new OperationContextExt(true); private IBiometricContextListener mListener; private BiometricContextProvider mProvider; @@ -316,17 +316,33 @@ public class BiometricContextProviderTest { assertThat(aidlContext.isAod).isEqualTo(false); assertThat(aidlContext.isCrypto).isEqualTo(false); + context = mProvider.updateContext(mOpContext, false /* crypto */); + aidlContext = context.toAidlContext(); + assertThat(context).isSameInstanceAs(mOpContext); + assertThat(aidlContext.id).isEqualTo(0); + assertThat(aidlContext.reason).isEqualTo(OperationReason.UNKNOWN); + assertThat(aidlContext.isAod).isEqualTo(false); + assertThat(aidlContext.isCrypto).isEqualTo(false); + } + + @Test + public void testUpdateAllSessionTypes() throws RemoteException { + OperationContextExt context = mProvider.updateContext(mOpContext, false /* crypto */); + OperationContext aidlContext = context.toAidlContext(); + for (int type : List.of(StatusBarManager.SESSION_BIOMETRIC_PROMPT, StatusBarManager.SESSION_KEYGUARD)) { final int id = 40 + type; final boolean aod = (type & 1) == 0; + OperationContextExt opContext = + new OperationContextExt(type == StatusBarManager.SESSION_BIOMETRIC_PROMPT); mListener.onDisplayStateChanged(aod ? AuthenticateOptions.DISPLAY_STATE_AOD : AuthenticateOptions.DISPLAY_STATE_LOCKSCREEN); mSessionListener.onSessionStarted(type, InstanceId.fakeInstanceId(id)); - context = mProvider.updateContext(mOpContext, false /* crypto */); + context = mProvider.updateContext(opContext, false /* crypto */); aidlContext = context.toAidlContext(); - assertThat(context).isSameInstanceAs(mOpContext); + assertThat(context).isSameInstanceAs(opContext); assertThat(aidlContext.id).isEqualTo(id); assertThat(aidlContext.reason).isEqualTo(reason(type)); assertThat(aidlContext.isAod).isEqualTo(aod); @@ -334,14 +350,6 @@ public class BiometricContextProviderTest { mSessionListener.onSessionEnded(type, InstanceId.fakeInstanceId(id)); } - - context = mProvider.updateContext(mOpContext, false /* crypto */); - aidlContext = context.toAidlContext(); - assertThat(context).isSameInstanceAs(mOpContext); - assertThat(aidlContext.id).isEqualTo(0); - assertThat(aidlContext.reason).isEqualTo(OperationReason.UNKNOWN); - assertThat(aidlContext.isAod).isEqualTo(false); - assertThat(aidlContext.isCrypto).isEqualTo(false); } private static byte reason(int type) { diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricFrameworkStatsLoggerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricFrameworkStatsLoggerTest.java index 5adf391a1c32..5cff48dc3c2a 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricFrameworkStatsLoggerTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricFrameworkStatsLoggerTest.java @@ -34,7 +34,7 @@ public class BiometricFrameworkStatsLoggerTest { @Test public void testConvertsWakeReason_whenEmpty() { - final OperationContextExt ctx = new OperationContextExt(); + final OperationContextExt ctx = new OperationContextExt(false); final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx); final int[] reasonDetails = BiometricFrameworkStatsLogger @@ -48,11 +48,11 @@ public class BiometricFrameworkStatsLoggerTest { public void testConvertsWakeReason_whenPowerReason() { final OperationContext context = new OperationContext(); context.wakeReason = WakeReason.WAKE_MOTION; - final OperationContextExt ctx = new OperationContextExt(context); + final OperationContextExt ctx = new OperationContextExt(context, false); final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx); final int[] reasonDetails = BiometricFrameworkStatsLogger - .toProtoWakeReasonDetails(new OperationContextExt(context)); + .toProtoWakeReasonDetails(new OperationContextExt(context, false)); assertThat(reason).isEqualTo(BiometricsProtoEnums.WAKE_REASON_WAKE_MOTION); assertThat(reasonDetails).isEmpty(); @@ -63,7 +63,7 @@ public class BiometricFrameworkStatsLoggerTest { final OperationContext context = new OperationContext(); context.authenticateReason = AuthenticateReason.faceAuthenticateReason( AuthenticateReason.Face.ASSISTANT_VISIBLE); - final OperationContextExt ctx = new OperationContextExt(context); + final OperationContextExt ctx = new OperationContextExt(context, false); final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx); final int[] reasonDetails = BiometricFrameworkStatsLogger @@ -79,7 +79,7 @@ public class BiometricFrameworkStatsLoggerTest { final OperationContext context = new OperationContext(); context.authenticateReason = AuthenticateReason.vendorAuthenticateReason( new AuthenticateReason.Vendor()); - final OperationContextExt ctx = new OperationContextExt(context); + final OperationContextExt ctx = new OperationContextExt(context, false); final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx); final int[] reasonDetails = BiometricFrameworkStatsLogger @@ -96,7 +96,7 @@ public class BiometricFrameworkStatsLoggerTest { context.wakeReason = WakeReason.WAKE_KEY; context.authenticateReason = AuthenticateReason.faceAuthenticateReason( AuthenticateReason.Face.PRIMARY_BOUNCER_SHOWN); - final OperationContextExt ctx = new OperationContextExt(context); + final OperationContextExt ctx = new OperationContextExt(context, false); final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx); final int[] reasonDetails = BiometricFrameworkStatsLogger @@ -113,7 +113,7 @@ public class BiometricFrameworkStatsLoggerTest { context.wakeReason = WakeReason.LID; context.authenticateReason = AuthenticateReason.vendorAuthenticateReason( new AuthenticateReason.Vendor()); - final OperationContextExt ctx = new OperationContextExt(context); + final OperationContextExt ctx = new OperationContextExt(context, false); final int reason = BiometricFrameworkStatsLogger.toProtoWakeReason(ctx); final int[] reasonDetails = BiometricFrameworkStatsLogger diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricLoggerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricLoggerTest.java index 81dcf4838b07..612f717226a2 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricLoggerTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricLoggerTest.java @@ -74,7 +74,7 @@ public class BiometricLoggerTest { @Before public void setUp() { - mOpContext = new OperationContextExt(); + mOpContext = new OperationContextExt(false); mContext.addMockSystemService(SensorManager.class, mSensorManager); when(mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)).thenReturn( new Sensor(new InputSensorInfo("", "", 0, 0, Sensor.TYPE_LIGHT, 0, 0, 0, 0, 0, 0, diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/OperationContextExtTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/OperationContextExtTest.java index c652b74f5848..5cf59602a43b 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/log/OperationContextExtTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/log/OperationContextExtTest.java @@ -53,12 +53,12 @@ public class OperationContextExtTest { @Test public void hasAidlContext() { - OperationContextExt context = new OperationContextExt(); + OperationContextExt context = new OperationContextExt(false); assertThat(context.toAidlContext()).isNotNull(); final OperationContext aidlContext = newAidlContext(); - context = new OperationContextExt(aidlContext); + context = new OperationContextExt(aidlContext, false); assertThat(context.toAidlContext()).isSameInstanceAs(aidlContext); final int id = 5; @@ -79,7 +79,7 @@ public class OperationContextExtTest { @Test public void hasNoOrderWithoutSession() { - OperationContextExt context = new OperationContextExt(); + OperationContextExt context = new OperationContextExt(false); assertThat(context.getOrderAndIncrement()).isEqualTo(-1); assertThat(context.getOrderAndIncrement()).isEqualTo(-1); } @@ -96,7 +96,7 @@ public class OperationContextExtTest { ); for (Map.Entry<Integer, Integer> entry : map.entrySet()) { - final OperationContextExt context = new OperationContextExt(newAidlContext()); + final OperationContextExt context = new OperationContextExt(newAidlContext(), true); when(mBiometricContext.getDisplayState()).thenReturn(entry.getKey()); assertThat(context.update(mBiometricContext).getDisplayState()) .isEqualTo(entry.getValue()); @@ -136,7 +136,8 @@ public class OperationContextExtTest { when(mBiometricContext.isDisplayOn()).thenReturn(true); when(mBiometricContext.getDisplayState()).thenReturn(displayState); - final OperationContextExt context = new OperationContextExt(newAidlContext()); + final OperationContextExt context = new OperationContextExt(newAidlContext(), + sessionType == OperationReason.BIOMETRIC_PROMPT); assertThat(context.update(mBiometricContext)).isSameInstanceAs(context); diff --git a/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceCallTest.java b/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceCallTest.java index c7fb97fcd5a5..9d42a5bf05d2 100644 --- a/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceCallTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceCallTest.java @@ -18,9 +18,11 @@ package com.android.server.companion.datatransfer.contextsync; import static com.google.common.truth.Truth.assertWithMessage; +import android.content.ComponentName; import android.platform.test.annotations.Presubmit; import android.telecom.Call; import android.telecom.ParcelableCall; +import android.telecom.PhoneAccountHandle; import android.testing.AndroidTestingRunner; import androidx.test.InstrumentationRegistry; @@ -37,12 +39,14 @@ public class CrossDeviceCallTest { private static final String CALLER_DISPLAY_NAME = "name"; private static final String CONTACT_DISPLAY_NAME = "contact"; + private final Call.Details mUninitializedCallDetails = createCallDetails( + /* state= */ -1, /* capabilities= */ 0); @Test public void updateCallDetails_uninitialized() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); assertWithMessage("Wrong status").that(crossDeviceCall.getStatus()) .isEqualTo(android.companion.Telecom.Call.UNKNOWN_STATUS); assertWithMessage("Wrong controls").that(crossDeviceCall.getControls()).isEmpty(); @@ -51,8 +55,8 @@ public class CrossDeviceCallTest { @Test public void updateCallDetails_ringing() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails(createCallDetails(Call.STATE_RINGING, Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE)); assertWithMessage("Wrong status").that(crossDeviceCall.getStatus()) @@ -66,8 +70,8 @@ public class CrossDeviceCallTest { @Test public void updateCallDetails_ongoing() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails(createCallDetails(Call.STATE_ACTIVE, Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE)); assertWithMessage("Wrong status").that(crossDeviceCall.getStatus()) @@ -81,8 +85,8 @@ public class CrossDeviceCallTest { @Test public void updateCallDetails_holding() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails(createCallDetails(Call.STATE_HOLDING, Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE)); assertWithMessage("Wrong status").that(crossDeviceCall.getStatus()) @@ -95,8 +99,8 @@ public class CrossDeviceCallTest { @Test public void updateCallDetails_cannotHold() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails( createCallDetails(Call.STATE_ACTIVE, Call.Details.CAPABILITY_MUTE)); assertWithMessage("Wrong status").that(crossDeviceCall.getStatus()) @@ -109,8 +113,8 @@ public class CrossDeviceCallTest { @Test public void updateCallDetails_cannotMute() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails( createCallDetails(Call.STATE_ACTIVE, Call.Details.CAPABILITY_HOLD)); assertWithMessage("Wrong status").that(crossDeviceCall.getStatus()) @@ -123,8 +127,8 @@ public class CrossDeviceCallTest { @Test public void updateCallDetails_transitionRingingToOngoing() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails(createCallDetails(Call.STATE_RINGING, Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE)); assertWithMessage("Wrong status for ringing state").that(crossDeviceCall.getStatus()) @@ -146,8 +150,8 @@ public class CrossDeviceCallTest { @Test public void updateSilencedIfRinging_ringing_silenced() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails(createCallDetails(Call.STATE_RINGING, Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE)); crossDeviceCall.updateSilencedIfRinging(); @@ -161,8 +165,8 @@ public class CrossDeviceCallTest { @Test public void updateSilencedIfRinging_notRinging_notSilenced() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.updateCallDetails(createCallDetails(Call.STATE_ACTIVE, Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE)); crossDeviceCall.updateSilencedIfRinging(); @@ -177,8 +181,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_enterpriseCall_adminBlocked_ott() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = true; crossDeviceCall.mIsOtt = true; crossDeviceCall.updateCallDetails( @@ -193,8 +197,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_enterpriseCall_adminUnblocked_ott() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = true; crossDeviceCall.mIsOtt = true; crossDeviceCall.updateCallDetails( @@ -209,8 +213,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_enterpriseCall_adminBlocked_pstn() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = true; crossDeviceCall.mIsOtt = false; crossDeviceCall.updateCallDetails( @@ -225,8 +229,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_nonEnterpriseCall_adminBlocked_ott() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = false; crossDeviceCall.mIsOtt = true; crossDeviceCall.updateCallDetails( @@ -241,8 +245,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_nonEnterpriseCall_adminUnblocked_ott() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = false; crossDeviceCall.mIsOtt = true; crossDeviceCall.updateCallDetails( @@ -257,8 +261,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_nonEnterpriseCall_adminBlocked_pstn() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = false; crossDeviceCall.mIsOtt = false; crossDeviceCall.updateCallDetails( @@ -273,8 +277,8 @@ public class CrossDeviceCallTest { @Test public void getReadableCallerId_nonEnterpriseCall_adminUnblocked_pstn() { final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( - InstrumentationRegistry.getTargetContext().getPackageManager(), /* call= */ - null, /* callAudioState= */ null); + InstrumentationRegistry.getTargetContext().getPackageManager(), + mUninitializedCallDetails, /* callAudioState= */ null); crossDeviceCall.mIsEnterprise = false; crossDeviceCall.mIsOtt = false; crossDeviceCall.updateCallDetails( @@ -294,6 +298,8 @@ public class CrossDeviceCallTest { parcelableCallBuilder.setCapabilities(capabilities); parcelableCallBuilder.setState(state); parcelableCallBuilder.setConferenceableCallIds(Collections.emptyList()); + parcelableCallBuilder.setAccountHandle(new PhoneAccountHandle( + new ComponentName("com.google.test", "com.google.test.Activity"), "label")); return Call.Details.createFromParcelableCall(parcelableCallBuilder.createParcelableCall()); } } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 34b88b03547b..1e342f580745 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -130,6 +130,7 @@ import android.os.Build; import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.IpcDataCache; +import android.os.PersistableBundle; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; @@ -1511,7 +1512,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { * Validates that when the device owner is removed, the reset password token is cleared */ @Test - @Ignore("b/277916462") public void testClearDeviceOwner_clearResetPasswordToken() throws Exception { mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS); mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS); @@ -2602,7 +2602,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetApplicationHiddenWithDO() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); @@ -2628,7 +2627,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetApplicationHiddenWithPOOfOrganizationOwnedDevice() throws Exception { final int MANAGED_PROFILE_USER_ID = CALLER_USER_HANDLE; final int MANAGED_PROFILE_ADMIN_UID = @@ -4375,7 +4373,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetAutoTimeZoneEnabledModifiesSetting() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); @@ -4387,7 +4384,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetAutoTimeZoneEnabledWithPOOnUser0() throws Exception { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; setupProfileOwnerOnUser0(); @@ -4399,7 +4395,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetAutoTimeZoneEnabledFailWithPONotOnUser0() throws Exception { setupProfileOwner(); assertExpectException(SecurityException.class, null, @@ -4409,7 +4404,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetAutoTimeZoneEnabledWithPOOfOrganizationOwnedDevice() throws Exception { setupProfileOwner(); configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); @@ -5383,7 +5377,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testResetPasswordWithToken() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); @@ -5418,7 +5411,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void resetPasswordWithToken_NumericPin() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); @@ -5439,7 +5431,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void resetPasswordWithToken_EmptyPassword() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); @@ -7260,7 +7251,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testCanProfileOwnerResetPasswordWhenLocked() throws Exception { setDeviceEncryptionPerUser(); setupProfileOwner(); @@ -7324,7 +7314,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetAccountTypesWithManagementDisabledOnManagedProfile() throws Exception { setupProfileOwner(); @@ -7344,7 +7333,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - @Ignore("b/277916462") public void testSetAccountTypesWithManagementDisabledOnOrgOwnedManagedProfile() throws Exception { mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); @@ -8539,6 +8527,46 @@ public class DevicePolicyManagerTest extends DpmTestBase { eq(FUSED_PROVIDER), any(), eq(getServices().executor), any()); } + /** + * Verifies that bundles with tons of moderately long strings are persisted correctly. + * + * Policy is serialized into binary XML and there is a limit on the max string length: 65535. + * This test ensures that as long as each string in the trust agent configuration is below this + * limit, the policy can be serialized and deserialized correctly, even when the total length + * of the configuration is above that limit. This should be the case because PersistableBundle + * contents are stored as XML subtrees rather than as strings. + */ + @Test + public void testSetTrustAgentConfiguration_largeBundlePersisted() { + setAsProfileOwner(admin1); + + ComponentName agent = new ComponentName("some.trust.agent", "some.trust.agent.Agent"); + PersistableBundle configIn = new PersistableBundle(); + String kilobyteString = new String(new char[1024]).replace('\0', 'A'); + for (int i = 0; i < 1024; i++) { + configIn.putString("key-" + i, kilobyteString); + } + + runAsCaller(mAdmin1Context, dpms, dpm -> { + dpm.setTrustAgentConfiguration(admin1, agent, configIn); + }); + + // Re-read policies to see if they were serialized/deserialized correctly. + initializeDpms(); + + List<PersistableBundle> configsOut = new ArrayList<>(); + runAsCaller(mAdmin1Context, dpms, dpm -> { + configsOut.addAll(dpm.getTrustAgentConfiguration(admin1, agent)); + }); + + assertThat(configsOut.size()).isEqualTo(1); + PersistableBundle configOut = configsOut.get(0); + assertThat(configOut.size()).isEqualTo(1024); + for (int i = 0; i < 1024; i++) { + assertThat(configOut.getString("key-" + i, null)).isEqualTo(kilobyteString); + } + } + private void setupVpnAuthorization(String userVpnPackage, int userVpnUid) { final AppOpsManager.PackageOps vpnOp = new AppOpsManager.PackageOps(userVpnPackage, userVpnUid, List.of(new AppOpsManager.OpEntry( diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java index 7536c7949bcb..1eec70da3d20 100644 --- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java +++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java @@ -649,9 +649,9 @@ public class LogicalDisplayMapperTest { assertEquals(0, mLogicalDisplayMapper.getDisplayLocked(device2) .getLeadDisplayIdLocked()); assertEquals("concurrent", mLogicalDisplayMapper.getDisplayLocked(device1) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); assertEquals("concurrent", mLogicalDisplayMapper.getDisplayLocked(device2) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); mLogicalDisplayMapper.setDeviceStateLocked(1, false); advanceTime(1000); @@ -661,10 +661,10 @@ public class LogicalDisplayMapperTest { assertFalse(mLogicalDisplayMapper.getDisplayLocked(device2).isInTransitionLocked()); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device1) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device2) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); mLogicalDisplayMapper.setDeviceStateLocked(2, false); advanceTime(1000); @@ -674,10 +674,10 @@ public class LogicalDisplayMapperTest { assertFalse(mLogicalDisplayMapper.getDisplayLocked(device2).isInTransitionLocked()); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device1) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); assertEquals(DisplayDeviceConfig.DEFAULT_ID, mLogicalDisplayMapper.getDisplayLocked(device2) - .getThermalBrightnessThrottlingDataIdLocked()); + .getDisplayInfoLocked().thermalBrightnessThrottlingDataId); } @Test diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java index 5ea30298890f..f6cf57161f59 100644 --- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java +++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java @@ -205,4 +205,19 @@ public class LogicalDisplayTest { assertNotEquals(info3, info2); assertTrue(refreshRanges.contentEquals(info3.thermalRefreshRateThrottling)); } + + @Test + public void testSetThermalBrightnessThrottlingDataId() { + String brightnessThrottlingDataId = "throttling_data_id"; + DisplayInfo info1 = mLogicalDisplay.getDisplayInfoLocked(); + mLogicalDisplay.setThermalBrightnessThrottlingDataIdLocked(brightnessThrottlingDataId); + DisplayInfo info2 = mLogicalDisplay.getDisplayInfoLocked(); + // Display info should only be updated when updateLocked is called + assertEquals(info2, info1); + + mLogicalDisplay.updateLocked(mDeviceRepo); + DisplayInfo info3 = mLogicalDisplay.getDisplayInfoLocked(); + assertNotEquals(info3, info2); + assertEquals(brightnessThrottlingDataId, info3.thermalBrightnessThrottlingDataId); + } } diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java b/services/tests/servicestests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java index eb208d2e6c7f..d9cf15b35c2b 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java +++ b/services/tests/servicestests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java @@ -18,6 +18,7 @@ package com.android.server.display.brightness.strategy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -40,6 +41,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.util.test.FakeSettingsProvider; import com.android.internal.util.test.FakeSettingsProviderRule; import com.android.server.display.AutomaticBrightnessController; +import com.android.server.display.brightness.BrightnessEvent; import com.android.server.display.brightness.BrightnessReason; import org.junit.After; @@ -262,12 +264,13 @@ public class AutomaticBrightnessStrategyTest { float automaticScreenBrightness = 0.3f; AutomaticBrightnessController automaticBrightnessController = mock( AutomaticBrightnessController.class); - when(automaticBrightnessController.getAutomaticScreenBrightness()).thenReturn( - automaticScreenBrightness); + when(automaticBrightnessController.getAutomaticScreenBrightness(any(BrightnessEvent.class))) + .thenReturn(automaticScreenBrightness); mAutomaticBrightnessStrategy.setAutomaticBrightnessController( automaticBrightnessController); assertEquals(automaticScreenBrightness, - mAutomaticBrightnessStrategy.getAutomaticScreenBrightness(), 0.0f); + mAutomaticBrightnessStrategy.getAutomaticScreenBrightness( + new BrightnessEvent(DISPLAY_ID)), 0.0f); } @Test diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkManagementServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkManagementServiceTest.java index d9cd77d8cd7c..af144cf49a46 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkManagementServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkManagementServiceTest.java @@ -37,7 +37,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import android.annotation.NonNull; -import android.content.AttributionSource; import android.content.Context; import android.net.ConnectivityManager; import android.net.INetd; @@ -50,7 +49,7 @@ import android.os.IBinder; import android.os.PermissionEnforcer; import android.os.Process; import android.os.RemoteException; -import android.permission.PermissionCheckerManager; +import android.os.test.FakePermissionEnforcer; import android.platform.test.annotations.Presubmit; import android.test.suitebuilder.annotation.SmallTest; import android.util.ArrayMap; @@ -90,7 +89,6 @@ public class NetworkManagementServiceTest { private ArgumentCaptor<INetdUnsolicitedEventListener> mUnsolListenerCaptor; private final MockDependencies mDeps = new MockDependencies(); - private final MockPermissionEnforcer mPermissionEnforcer = new MockPermissionEnforcer(); private final class MockDependencies extends NetworkManagementService.Dependencies { @Override @@ -118,24 +116,6 @@ public class NetworkManagementServiceTest { } } - private static final class MockPermissionEnforcer extends PermissionEnforcer { - @Override - protected int checkPermission(@NonNull String permission, - @NonNull AttributionSource source) { - String[] granted = new String [] { - android.Manifest.permission.NETWORK_SETTINGS, - android.Manifest.permission.OBSERVE_NETWORK_POLICY, - android.Manifest.permission.SHUTDOWN - }; - for (String p : granted) { - if (p.equals(permission)) { - return PermissionCheckerManager.PERMISSION_GRANTED; - } - } - return PermissionCheckerManager.PERMISSION_HARD_DENIED; - } - } - @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); @@ -145,12 +125,15 @@ public class NetworkManagementServiceTest { eq(ConnectivityManager.class)); doReturn(mCm).when(mContext).getSystemService(eq(Context.CONNECTIVITY_SERVICE)); // The AIDL stub will use PermissionEnforcer to check permission from the caller. - // Mock the service. See MockPermissionEnforcer above. + // Mock the service and grant the expected permissions. + FakePermissionEnforcer permissionEnforcer = new FakePermissionEnforcer(); + permissionEnforcer.grant(android.Manifest.permission.NETWORK_SETTINGS); + permissionEnforcer.grant(android.Manifest.permission.OBSERVE_NETWORK_POLICY); + permissionEnforcer.grant(android.Manifest.permission.SHUTDOWN); doReturn(Context.PERMISSION_ENFORCER_SERVICE).when(mContext).getSystemServiceName( eq(PermissionEnforcer.class)); - doReturn(mPermissionEnforcer).when(mContext).getSystemService( + doReturn(permissionEnforcer).when(mContext).getSystemService( eq(Context.PERMISSION_ENFORCER_SERVICE)); - // Start the service and wait until it connects to our socket. mNMService = NetworkManagementService.create(mContext, mDeps); } diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java index 21a11bc0e49e..52bf244e99fb 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -40,6 +40,7 @@ import static org.mockito.ArgumentMatchers.isA; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.atMost; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -1611,7 +1612,8 @@ public class PowerManagerServiceTest { startSystem(); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); - verify(mNotifierMock, never()).onWakefulnessChangeStarted(anyInt(), anyInt(), anyLong()); + verify(mNotifierMock, never()).onGlobalWakefulnessChangeStarted(anyInt(), anyInt(), + anyLong()); } @Test @@ -1630,7 +1632,7 @@ public class PowerManagerServiceTest { startSystem(); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP); - verify(mNotifierMock).onWakefulnessChangeStarted(eq(WAKEFULNESS_ASLEEP), anyInt(), + verify(mNotifierMock).onGlobalWakefulnessChangeStarted(eq(WAKEFULNESS_ASLEEP), anyInt(), anyLong()); } @@ -2112,7 +2114,7 @@ public class PowerManagerServiceTest { } @Test - public void testMultiDisplay_defaultDozing_addNewDisplayDefaultGoesBackToDoze() { + public void testMultiDisplay_addNewDisplay_becomeGloballyAwakeButDefaultRemainsDozing() { final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener = @@ -2142,6 +2144,7 @@ public class PowerManagerServiceTest { assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( WAKEFULNESS_DOZING); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING); + verify(mDreamManagerInternalMock).stopDream(anyBoolean(), anyString()); verify(mDreamManagerInternalMock).startDream(eq(true), anyString()); listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId); @@ -2152,7 +2155,10 @@ public class PowerManagerServiceTest { WAKEFULNESS_AWAKE); assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( WAKEFULNESS_DOZING); - verify(mDreamManagerInternalMock, times(2)).startDream(eq(true), anyString()); + + // Make sure there were no additional calls to stopDream or startDream + verify(mDreamManagerInternalMock, atMost(1)).stopDream(anyBoolean(), anyString()); + verify(mDreamManagerInternalMock, atMost(1)).startDream(eq(true), anyString()); } @Test @@ -2169,7 +2175,7 @@ public class PowerManagerServiceTest { } @Test - public void testMultiDisplay_onlyOneDisplaySleeps_onWakefulnessChangedEventFires() { + public void testMultiDisplay_onlyOneDisplaySleeps_onWakefulnessChangedEventsFire() { createService(); startSystem(); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); @@ -2177,12 +2183,14 @@ public class PowerManagerServiceTest { assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( WAKEFULNESS_ASLEEP); - verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(Display.DEFAULT_DISPLAY_GROUP), - eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_ASLEEP)); + verify(mNotifierMock).onGroupWakefulnessChangeStarted(eq(Display.DEFAULT_DISPLAY_GROUP), + eq(WAKEFULNESS_ASLEEP), eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), anyLong()); + verify(mNotifierMock).onGlobalWakefulnessChangeStarted(eq(WAKEFULNESS_ASLEEP), + eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), anyLong()); } @Test - public void testMultiDisplay_bothDisplaysSleep_onWakefulnessChangedEventFiresCorrectly() { + public void testMultiDisplay_bothDisplaysSleep_onWakefulnessChangedEventsFireCorrectly() { final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener = @@ -2201,10 +2209,10 @@ public class PowerManagerServiceTest { assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId); - mService.setWakefulnessLocked(nonDefaultDisplayGroupId, WAKEFULNESS_ASLEEP, 0, 0, 0, 0, - null, null); - mService.setWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP, WAKEFULNESS_ASLEEP, 0, 0, 0, 0, - null, null); + mService.setWakefulnessLocked(nonDefaultDisplayGroupId, WAKEFULNESS_ASLEEP, 0, 0, + PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0, null, null); + mService.setWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP, WAKEFULNESS_ASLEEP, 0, 0, + PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0, null, null); assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP); assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( @@ -2212,14 +2220,16 @@ public class PowerManagerServiceTest { assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( WAKEFULNESS_ASLEEP); - verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(nonDefaultDisplayGroupId), - eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_AWAKE)); - verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(Display.DEFAULT_DISPLAY_GROUP), - eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_ASLEEP)); + verify(mNotifierMock).onGroupWakefulnessChangeStarted(eq(nonDefaultDisplayGroupId), + eq(WAKEFULNESS_ASLEEP), eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), anyLong()); + verify(mNotifierMock).onGroupWakefulnessChangeStarted(eq(Display.DEFAULT_DISPLAY_GROUP), + eq(WAKEFULNESS_ASLEEP), eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), anyLong()); + verify(mNotifierMock).onGlobalWakefulnessChangeStarted(eq(WAKEFULNESS_ASLEEP), + eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), anyLong()); } @Test - public void testMultiDisplay_separateWakeStates_onWakefulnessChangedEventFiresCorrectly() { + public void testMultiDisplay_separateWakeStates_onWakefulnessChangedEventsFireCorrectly() { final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener = @@ -2255,10 +2265,53 @@ public class PowerManagerServiceTest { WAKEFULNESS_ASLEEP); assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( WAKEFULNESS_AWAKE); - verify(mNotifierMock).onPowerGroupWakefulnessChanged(eq(Display.DEFAULT_DISPLAY_GROUP), - eq(WAKEFULNESS_ASLEEP), anyInt(), eq(WAKEFULNESS_AWAKE)); - verify(mNotifierMock, never()).onPowerGroupWakefulnessChanged( - eq(nonDefaultDisplayGroupId), anyInt(), anyInt(), anyInt()); + verify(mNotifierMock).onGroupWakefulnessChangeStarted(eq(nonDefaultDisplayGroupId), + eq(WAKEFULNESS_AWAKE), eq(PowerManager.WAKE_REASON_DISPLAY_GROUP_ADDED), anyLong()); + verify(mNotifierMock).onGroupWakefulnessChangeStarted(eq(Display.DEFAULT_DISPLAY_GROUP), + eq(WAKEFULNESS_ASLEEP), eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), anyLong()); + verify(mNotifierMock, never()).onGlobalWakefulnessChangeStarted(eq(WAKEFULNESS_ASLEEP), + anyInt(), anyLong()); + } + + @Test + public void testMultiDisplay_oneDisplayGroupChanges_globalDoesNotChange() { + final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; + final int nonDefaultDisplay = Display.DEFAULT_DISPLAY + 1; + final AtomicReference<DisplayManagerInternal.DisplayGroupListener> listener = + new AtomicReference<>(); + doAnswer((Answer<Void>) invocation -> { + listener.set(invocation.getArgument(0)); + return null; + }).when(mDisplayManagerInternalMock).registerDisplayGroupListener(any()); + final DisplayInfo info = new DisplayInfo(); + info.displayGroupId = nonDefaultDisplayGroupId; + when(mDisplayManagerInternalMock.getDisplayInfo(nonDefaultDisplay)).thenReturn(info); + + createService(); + startSystem(); + + listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId); + + assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( + WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( + WAKEFULNESS_AWAKE); + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + + long eventTime = mClock.now(); + mService.setWakefulnessLocked(nonDefaultDisplayGroupId, WAKEFULNESS_ASLEEP, eventTime, 0, + PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0, null, null); + + assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( + WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( + WAKEFULNESS_ASLEEP); + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + verify(mNotifierMock, never()).onGlobalWakefulnessChangeStarted(anyInt(), anyInt(), + anyLong()); + verify(mNotifierMock, atMost(1)).onGroupWakefulnessChangeStarted( + eq(nonDefaultDisplayGroupId), eq(WAKEFULNESS_ASLEEP), + eq(PowerManager.GO_TO_SLEEP_REASON_APPLICATION), eq(eventTime)); } @Test 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 2665e197f91f..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); @@ -233,8 +235,9 @@ class TestPhoneWindowManager { doNothing().when(mPhoneWindowManager).updateSettings(); doNothing().when(mPhoneWindowManager).screenTurningOn(anyInt(), any()); doNothing().when(mPhoneWindowManager).screenTurnedOn(anyInt()); - doNothing().when(mPhoneWindowManager).startedWakingUp(anyInt()); - doNothing().when(mPhoneWindowManager).finishedWakingUp(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/tests/wmtests/src/com/android/server/wm/SurfaceControlTests.java b/services/tests/wmtests/src/com/android/server/wm/SurfaceControlTests.java index 342ab83de6f0..4f45d5c2bf98 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SurfaceControlTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceControlTests.java @@ -125,9 +125,10 @@ public class SurfaceControlTests { public void testSurfaceChangedOnRotation() { final Instrumentation instrumentation = getInstrumentation(); final Context context = instrumentation.getContext(); - final Activity activity = instrumentation.startActivitySync(new Intent().setComponent( + final Intent intent = new Intent().setComponent( new ComponentName(context, ActivityOptionsTest.MainActivity.class)) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); + final Activity activity = instrumentation.startActivitySync(intent); final SurfaceView sv = new SurfaceView(activity); final AtomicInteger surfaceChangedCount = new AtomicInteger(); instrumentation.runOnMainSync(() -> activity.setContentView(sv)); @@ -157,12 +158,27 @@ public class SurfaceControlTests { instrumentation.waitForIdleSync(); final int newRotation = activity.getResources().getConfiguration() .windowConfiguration.getRotation(); + if (rotation == newRotation) { + // The device might not support requested orientation. + activity.finishAndRemoveTask(); + return; + } final int count = surfaceChangedCount.get(); + activity.moveTaskToBack(true /* nonRoot */); + instrumentation.getUiAutomation().syncInputTransactions(); + context.startActivity(intent); + instrumentation.getUiAutomation().syncInputTransactions(); + final int countAfterToFront = count - surfaceChangedCount.get(); activity.finishAndRemoveTask(); + // The first count is triggered from creation, so the target number is 2. - if (rotation != newRotation && count > 2) { + if (count > 2) { fail("More than once surfaceChanged for rotation change: " + count); } + if (countAfterToFront > 1) { + fail("More than once surfaceChanged for app transition with rotation change: " + + countAfterToFront); + } } private SurfaceControl buildTestSurface() { diff --git a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java index 32033fb7403d..adf3f3976f38 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -114,24 +114,35 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { } @Override - public void startedWakingUp(@WakeReason int wakeReason) { + public void startedWakingUpGlobal(@WakeReason int reason) { } @Override - public void finishedWakingUp(@WakeReason int wakeReason) { + public void finishedWakingUpGlobal(@WakeReason int reason) { } @Override - public void startedGoingToSleep(@GoToSleepReason int sleepReason) { + public void startedGoingToSleepGlobal(@GoToSleepReason int reason) { } @Override - public void finishedGoingToSleep(@GoToSleepReason int sleepReason) { + public void finishedGoingToSleepGlobal(@GoToSleepReason int reason) { } @Override - public void onPowerGroupWakefulnessChanged(int groupId, int wakefulness, - @GoToSleepReason int pmSleepReason, int globalWakefulness) { + public void startedWakingUp(int displayGroupId, @WakeReason int wakeReason) { + } + + @Override + public void finishedWakingUp(int displayGroupId, @WakeReason int wakeReason) { + } + + @Override + public void startedGoingToSleep(int displayGroupId, @GoToSleepReason int sleepReason) { + } + + @Override + public void finishedGoingToSleep(int displayGroupId, @GoToSleepReason int sleepReason) { } @Override diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java index ba6b3b6c9378..58bf184994e4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java @@ -27,6 +27,7 @@ import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUST import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.FLAG_OWN_FOCUS; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; +import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_SPY; import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY; @@ -65,6 +66,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.pm.ActivityInfo; import android.content.res.Resources; import android.graphics.Point; import android.graphics.Rect; @@ -89,6 +91,7 @@ import android.view.SurfaceControl; import android.view.View; import android.view.WindowInsets; import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; import android.window.ClientWindowFrames; import android.window.ScreenCapture; import android.window.WindowContainerToken; @@ -101,6 +104,7 @@ import com.android.compatibility.common.util.AdoptShellPermissionsRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; /** * Build/Install/Run: @@ -272,6 +276,124 @@ public class WindowManagerServiceTests extends WindowTestsBase { } @Test + public void testRelayout_firstLayout_dwpcHelperCalledWithCorrectFlags() { + // When doing the first layout, the initial flags should be reported as changed to + // keepActivityOnWindowFlagsChanged. + testRelayoutFlagChanges( + /*firstRelayout=*/ true, + /*startFlags=*/ FLAG_SECURE, + /*startPrivateFlags=*/ PRIVATE_FLAG_TRUSTED_OVERLAY, + /*newFlags=*/ FLAG_SECURE, + /*newPrivateFlags=*/ PRIVATE_FLAG_TRUSTED_OVERLAY, + /*expectedChangedFlags=*/ FLAG_SECURE, + /*expectedChangedPrivateFlags=*/ PRIVATE_FLAG_TRUSTED_OVERLAY, + /*expectedFlagsValue=*/ FLAG_SECURE, + /*expectedPrivateFlagsValue=*/ PRIVATE_FLAG_TRUSTED_OVERLAY); + } + + @Test + public void testRelayout_secondLayoutFlagAdded_dwpcHelperCalledWithCorrectFlags() { + testRelayoutFlagChanges( + /*firstRelayout=*/ false, + /*startFlags=*/ 0, + /*startPrivateFlags=*/ 0, + /*newFlags=*/ FLAG_SECURE, + /*newPrivateFlags=*/ 0, + /*expectedChangedFlags=*/ FLAG_SECURE, + /*expectedChangedPrivateFlags=*/ 0, + /*expectedFlagsValue=*/ FLAG_SECURE, + /*expectedPrivateFlagsValue=*/ 0); + } + + @Test + public void testRelayout_secondLayoutMultipleFlagsAddOne_dwpcHelperCalledWithCorrectFlags() { + testRelayoutFlagChanges( + /*firstRelayout=*/ false, + /*startFlags=*/ FLAG_NOT_FOCUSABLE, + /*startPrivateFlags=*/ 0, + /*newFlags=*/ FLAG_SECURE | FLAG_NOT_FOCUSABLE, + /*newPrivateFlags=*/ 0, + /*expectedChangedFlags=*/ FLAG_SECURE, + /*expectedChangedPrivateFlags=*/ 0, + /*expectedFlagsValue=*/ FLAG_SECURE | FLAG_NOT_FOCUSABLE, + /*expectedPrivateFlagsValue=*/ 0); + } + + @Test + public void testRelayout_secondLayoutPrivateFlagAdded_dwpcHelperCalledWithCorrectFlags() { + testRelayoutFlagChanges( + /*firstRelayout=*/ false, + /*startFlags=*/ 0, + /*startPrivateFlags=*/ 0, + /*newFlags=*/ 0, + /*newPrivateFlags=*/ PRIVATE_FLAG_TRUSTED_OVERLAY, + /*expectedChangedFlags=*/ 0, + /*expectedChangedPrivateFlags=*/ PRIVATE_FLAG_TRUSTED_OVERLAY, + /*expectedFlagsValue=*/ 0, + /*expectedPrivateFlagsValue=*/ PRIVATE_FLAG_TRUSTED_OVERLAY); + } + + @Test + public void testRelayout_secondLayoutFlagsRemoved_dwpcHelperCalledWithCorrectFlags() { + testRelayoutFlagChanges( + /*firstRelayout=*/ false, + /*startFlags=*/ FLAG_SECURE, + /*startPrivateFlags=*/ PRIVATE_FLAG_TRUSTED_OVERLAY, + /*newFlags=*/ 0, + /*newPrivateFlags=*/ 0, + /*expectedChangedFlags=*/ FLAG_SECURE, + /*expectedChangedPrivateFlags=*/ PRIVATE_FLAG_TRUSTED_OVERLAY, + /*expectedFlagsValue=*/ 0, + /*expectedPrivateFlagsValue=*/ 0); + } + + // Helper method to test relayout of a window, either for the initial layout, or a subsequent + // one, and makes sure that the flags and private flags changes and final values are properly + // reported to mDwpcHelper.keepActivityOnWindowFlagsChanged. + private void testRelayoutFlagChanges(boolean firstRelayout, int startFlags, + int startPrivateFlags, int newFlags, int newPrivateFlags, int expectedChangedFlags, + int expectedChangedPrivateFlags, int expectedFlagsValue, + int expectedPrivateFlagsValue) { + final WindowState win = createWindow(null, TYPE_BASE_APPLICATION, "appWin"); + win.mRelayoutCalled = !firstRelayout; + mWm.mWindowMap.put(win.mClient.asBinder(), win); + spyOn(mDisplayContent.mDwpcHelper); + when(mDisplayContent.mDwpcHelper.hasController()).thenReturn(true); + + win.mAttrs.flags = startFlags; + win.mAttrs.privateFlags = startPrivateFlags; + + LayoutParams newParams = new LayoutParams(); + newParams.copyFrom(win.mAttrs); + newParams.flags = newFlags; + newParams.privateFlags = newPrivateFlags; + + int seq = 1; + if (!firstRelayout) { + win.mRelayoutSeq = 1; + seq = 2; + } + mWm.relayoutWindow(win.mSession, win.mClient, newParams, 100, 200, View.VISIBLE, 0, seq, + 0, new ClientWindowFrames(), new MergedConfiguration(), + new SurfaceControl(), new InsetsState(), new InsetsSourceControl.Array(), + new Bundle()); + + ArgumentCaptor<Integer> changedFlags = ArgumentCaptor.forClass(Integer.class); + ArgumentCaptor<Integer> changedPrivateFlags = ArgumentCaptor.forClass(Integer.class); + ArgumentCaptor<Integer> flagsValue = ArgumentCaptor.forClass(Integer.class); + ArgumentCaptor<Integer> privateFlagsValue = ArgumentCaptor.forClass(Integer.class); + + verify(mDisplayContent.mDwpcHelper).keepActivityOnWindowFlagsChanged( + any(ActivityInfo.class), changedFlags.capture(), changedPrivateFlags.capture(), + flagsValue.capture(), privateFlagsValue.capture()); + + assertThat(changedFlags.getValue()).isEqualTo(expectedChangedFlags); + assertThat(changedPrivateFlags.getValue()).isEqualTo(expectedChangedPrivateFlags); + assertThat(flagsValue.getValue()).isEqualTo(expectedFlagsValue); + assertThat(privateFlagsValue.getValue()).isEqualTo(expectedPrivateFlagsValue); + } + + @Test public void testMoveWindowTokenToDisplay_NullToken_DoNothing() { mWm.moveWindowTokenToDisplay(null, mDisplayContent.getDisplayId()); 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(); } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index f27c23b29d67..188894339f6a 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -5773,14 +5773,15 @@ public class CarrierConfigManager { * </ul> * @hide */ - public static final String KEY_SA_DISABLE_POLICY_INT = KEY_PREFIX + "sa_disable_policy_int"; + public static final String KEY_NR_SA_DISABLE_POLICY_INT = + KEY_PREFIX + "sa_disable_policy_int"; /** @hide */ @IntDef({ - SA_DISABLE_POLICY_NONE, - SA_DISABLE_POLICY_WFC_ESTABLISHED, - SA_DISABLE_POLICY_WFC_ESTABLISHED_WHEN_VONR_DISABLED, - SA_DISABLE_POLICY_VOWIFI_REGISTERED + NR_SA_DISABLE_POLICY_NONE, + NR_SA_DISABLE_POLICY_WFC_ESTABLISHED, + NR_SA_DISABLE_POLICY_WFC_ESTABLISHED_WHEN_VONR_DISABLED, + NR_SA_DISABLE_POLICY_VOWIFI_REGISTERED }) public @interface NrSaDisablePolicy {} @@ -5788,14 +5789,14 @@ public class CarrierConfigManager { * Do not disables NR SA mode. * @hide */ - public static final int SA_DISABLE_POLICY_NONE = 0; + public static final int NR_SA_DISABLE_POLICY_NONE = 0; /** * Disables NR SA mode when VoWiFi call is established in order to improve the delay or * voice mute when the handover from ePDG to NR is not supported in UE or network. * @hide */ - public static final int SA_DISABLE_POLICY_WFC_ESTABLISHED = 1; + public static final int NR_SA_DISABLE_POLICY_WFC_ESTABLISHED = 1; /** * Disables NR SA mode when VoWiFi call is established when VoNR is disabled in order to @@ -5803,14 +5804,14 @@ public class CarrierConfigManager { * in UE or network. * @hide */ - public static final int SA_DISABLE_POLICY_WFC_ESTABLISHED_WHEN_VONR_DISABLED = 2; + public static final int NR_SA_DISABLE_POLICY_WFC_ESTABLISHED_WHEN_VONR_DISABLED = 2; /** * Disables NR SA mode when IMS is registered over WiFi in order to improve the delay or * voice mute when the handover from ePDG to NR is not supported in UE or network. * @hide */ - public static final int SA_DISABLE_POLICY_VOWIFI_REGISTERED = 3; + public static final int NR_SA_DISABLE_POLICY_VOWIFI_REGISTERED = 3; private Ims() {} @@ -5883,7 +5884,7 @@ public class CarrierConfigManager { defaults.putInt(KEY_REGISTRATION_RETRY_BASE_TIMER_MILLIS_INT, 30000); defaults.putInt(KEY_REGISTRATION_RETRY_MAX_TIMER_MILLIS_INT, 1800000); defaults.putInt(KEY_REGISTRATION_SUBSCRIBE_EXPIRY_TIMER_SEC_INT, 600000); - defaults.putInt(KEY_SA_DISABLE_POLICY_INT, SA_DISABLE_POLICY_NONE); + defaults.putInt(KEY_NR_SA_DISABLE_POLICY_INT, NR_SA_DISABLE_POLICY_NONE); defaults.putIntArray( KEY_IPSEC_AUTHENTICATION_ALGORITHMS_INT_ARRAY, diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java index 8ed60c1b8b3f..b273ba2e9f11 100644 --- a/telephony/java/com/android/internal/telephony/RILConstants.java +++ b/telephony/java/com/android/internal/telephony/RILConstants.java @@ -571,6 +571,7 @@ public interface RILConstants { int RIL_REQUEST_UPDATE_IMS_CALL_STATUS = 240; int RIL_REQUEST_SET_N1_MODE_ENABLED = 241; int RIL_REQUEST_IS_N1_MODE_ENABLED = 242; + int RIL_REQUEST_IS_NULL_CIPHER_AND_INTEGRITY_ENABLED = 259; /* Responses begin */ int RIL_RESPONSE_ACKNOWLEDGEMENT = 800; diff --git a/tests/TouchLatency/app/build.gradle b/tests/TouchLatency/app/build.gradle index 129baab5529d..07f6bcabb907 100644 --- a/tests/TouchLatency/app/build.gradle +++ b/tests/TouchLatency/app/build.gradle @@ -2,7 +2,6 @@ apply plugin: 'com.android.application' android { compileSdkVersion 33 - buildToolsVersion '28.0.3' defaultConfig { applicationId "com.prefabulated.touchlatency" diff --git a/tests/TouchLatency/app/src/main/AndroidManifest.xml b/tests/TouchLatency/app/src/main/AndroidManifest.xml index 25bb5d92f846..5743b2586416 100644 --- a/tests/TouchLatency/app/src/main/AndroidManifest.xml +++ b/tests/TouchLatency/app/src/main/AndroidManifest.xml @@ -30,12 +30,6 @@ <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> - - <activity android:name=".TouchLatencyActivityPresentation" - android:label="@string/app_name" - android:parentActivityName=".TouchLatencyActivity" - android:exported="true"> - </activity> </application> </manifest> diff --git a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java index 3a520bcdc526..7678633dfa5e 100644 --- a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java +++ b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java @@ -16,8 +16,6 @@ package com.prefabulated.touchlatency; -import android.app.ActivityOptions; -import android.content.Intent; import android.hardware.display.DisplayManager; import android.os.Bundle; import android.os.Handler; @@ -105,7 +103,6 @@ public class TouchLatencyActivity extends AppCompatActivity { updateDisplayMode(menuItem, currentMode); } updateRefreshRateMenu(mMenu.findItem(R.id.frame_rate)); - updateMultiDisplayMenu(mMenu.findItem(R.id.multi_display)); } @Override @@ -186,20 +183,6 @@ public class TouchLatencyActivity extends AppCompatActivity { mCurrentModeIndex = modeIndex; } - private void changeMultipleDisplays() { - Intent intent = new Intent(this, TouchLatencyActivityPresentation.class); - intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); - ActivityOptions options = ActivityOptions.makeBasic(); - for (int i = 1; i < mDisplayManager.getDisplays().length; ++i) { - // We assume the first display is already displaying the TouchLatencyActivity - int displayId = mDisplayManager.getDisplays()[i].getDisplayId(); - options.setLaunchDisplayId(displayId); - intent.putExtra(TouchLatencyActivityPresentation.DISPLAY_ID, displayId); - startActivity(intent, options.toBundle()); - } - } - - @Override public boolean onOptionsItemSelected(MenuItem item) { Trace.beginSection("TouchLatencyActivity onOptionsItemSelected"); @@ -218,10 +201,6 @@ public class TouchLatencyActivity extends AppCompatActivity { changeDisplayMode(item); break; } - case R.id.multi_display: { - changeMultipleDisplays(); - break; - } } Trace.endSection(); diff --git a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivityPresentation.java b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivityPresentation.java deleted file mode 100644 index 2602e6b34395..000000000000 --- a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivityPresentation.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.prefabulated.touchlatency; - -import android.app.Activity; -import android.os.Bundle; -import android.os.Trace; -import android.view.Display; -import android.view.Display.Mode; -import android.view.Menu; -import android.view.MenuItem; -import android.view.Window; -import android.view.WindowManager; - -public class TouchLatencyActivityPresentation extends Activity { - public static final String DISPLAY_ID = "DISPLAY_ID"; - private Mode[] mDisplayModes; - private int mCurrentModeIndex; - private int mDisplayId; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (getIntent().hasExtra(DISPLAY_ID)) { - mDisplayId = (int) getIntent().getExtras().get(DISPLAY_ID); - } - Trace.beginSection( - "TouchLatencyActivityPresentation::DisplayId::" + mDisplayId + " onCreate"); - setContentView(R.layout.activity_touch_latency); - - mTouchView = findViewById(R.id.canvasView); - - WindowManager wm = getWindowManager(); - Display display = wm.getDefaultDisplay(); - mDisplayModes = display.getSupportedModes(); - Mode currentMode = getWindowManager().getDefaultDisplay().getMode(); - - for (int i = 0; i < mDisplayModes.length; i++) { - if (currentMode.getModeId() == mDisplayModes[i].getModeId()) { - mCurrentModeIndex = i; - break; - } - } - Trace.endSection(); - } - - @Override - protected void onResume() { - super.onResume(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - Trace.beginSection( - "TouchLatencyActivityPresentation::DisplayId:: " - + mDisplayId + " onCreateOptionsMenu"); - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.menu_touch_latency, menu); - if (mDisplayModes.length > 1) { - MenuItem menuItem = menu.findItem(R.id.display_mode); - Mode currentMode = getWindowManager().getDefaultDisplay().getMode(); - updateDisplayMode(menuItem, currentMode); - } - Trace.endSection(); - return true; - } - - private void updateDisplayMode(MenuItem menuItem, Mode displayMode) { - int fps = (int) displayMode.getRefreshRate(); - menuItem.setTitle(fps + "hz"); - menuItem.setVisible(true); - } - - public void changeDisplayMode(MenuItem item) { - Window w = getWindow(); - WindowManager.LayoutParams params = w.getAttributes(); - - int modeIndex = (mCurrentModeIndex + 1) % mDisplayModes.length; - params.preferredDisplayModeId = mDisplayModes[modeIndex].getModeId(); - w.setAttributes(params); - - updateDisplayMode(item, mDisplayModes[modeIndex]); - mCurrentModeIndex = modeIndex; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - Trace.beginSection( - "TouchLatencyActivityPresentation::DisplayId::" - + mDisplayId + " onOptionsItemSelected"); - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - - //noinspection SimplifiableIfStatement - switch (id) { - case R.id.action_settings: { - mTouchView.changeMode(item); - break; - } - case R.id.display_mode: { - changeDisplayMode(item); - break; - } - } - - Trace.endSection(); - return super.onOptionsItemSelected(item); - } - - private TouchLatencyView mTouchView; -} diff --git a/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml b/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml index 7169021b6653..f637f71f7ef2 100644 --- a/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml +++ b/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml @@ -30,9 +30,4 @@ android:title="@string/display_mode" android:visible="false" app:showAsAction="always" /> - <item - android:id="@+id/multi_display" - android:title="@string/multi_display" - android:visible="false" - app:showAsAction="ifRoom" /> </menu> diff --git a/tests/TouchLatency/build.gradle b/tests/TouchLatency/build.gradle index 381e55e92c7d..f52935bae092 100644 --- a/tests/TouchLatency/build.gradle +++ b/tests/TouchLatency/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' + classpath 'com.android.tools.build:gradle:7.4.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/tests/TouchLatency/gradle/wrapper/gradle-wrapper.jar b/tests/TouchLatency/gradle/wrapper/gradle-wrapper.jar Binary files differindex 758de960ec79..7454180f2ae8 100644 --- a/tests/TouchLatency/gradle/wrapper/gradle-wrapper.jar +++ b/tests/TouchLatency/gradle/wrapper/gradle-wrapper.jar diff --git a/tests/TouchLatency/gradle/wrapper/gradle-wrapper.properties b/tests/TouchLatency/gradle/wrapper/gradle-wrapper.properties index 4d9ca1649142..8049c684f04f 100644 --- a/tests/TouchLatency/gradle/wrapper/gradle-wrapper.properties +++ b/tests/TouchLatency/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/tests/TouchLatency/gradlew b/tests/TouchLatency/gradlew index cccdd3d517fc..1b6c787337ff 100755 --- a/tests/TouchLatency/gradlew +++ b/tests/TouchLatency/gradlew @@ -1,78 +1,129 @@ -#!/usr/bin/env sh +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# 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 +# +# https://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. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -89,84 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/tests/TouchLatency/gradlew.bat b/tests/TouchLatency/gradlew.bat index e95643d6a2ca..ac1b06f93825 100644 --- a/tests/TouchLatency/gradlew.bat +++ b/tests/TouchLatency/gradlew.bat @@ -1,3 +1,19 @@ +@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -13,15 +29,18 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -45,28 +64,14 @@ echo location of your Java installation. goto fail
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfo.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfo.java index c6e675ade262..e207b01a364d 100644 --- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfo.java +++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfo.java @@ -185,6 +185,7 @@ public final class NetworkProviderInfo implements Parcelable { */ @NonNull public Builder setExtras(@NonNull Bundle extras) { + Objects.requireNonNull(extras); mExtras = extras; return this; } diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/HotspotNetworkConnectionStatusTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/HotspotNetworkConnectionStatusTest.java deleted file mode 100644 index b18ab5060924..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/HotspotNetworkConnectionStatusTest.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * 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 android.net.wifi.sharedconnectivity.app; - -import static android.net.wifi.WifiInfo.SECURITY_TYPE_EAP; -import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP; -import static android.net.wifi.sharedconnectivity.app.HotspotNetwork.NETWORK_TYPE_CELLULAR; -import static android.net.wifi.sharedconnectivity.app.HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT; -import static android.net.wifi.sharedconnectivity.app.HotspotNetworkConnectionStatus.CONNECTION_STATUS_TETHERING_TIMEOUT; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_TABLET; - -import static com.google.common.truth.Truth.assertThat; - -import android.os.Bundle; -import android.os.Parcel; - -import androidx.test.filters.SmallTest; - -import org.junit.Test; - -import java.util.Arrays; - -/** - * Unit tests for {@link HotspotNetworkConnectionStatus}. - */ -@SmallTest -public class HotspotNetworkConnectionStatusTest { - private static final long DEVICE_ID = 11L; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO = - new NetworkProviderInfo.Builder("TEST_NAME", "TEST_MODEL") - .setDeviceType(DEVICE_TYPE_TABLET).setConnectionStrength(2) - .setBatteryPercentage(50).build(); - private static final int NETWORK_TYPE = NETWORK_TYPE_CELLULAR; - private static final String NETWORK_NAME = "TEST_NETWORK"; - private static final String HOTSPOT_SSID = "TEST_SSID"; - private static final String HOTSPOT_BSSID = "TEST _BSSID"; - private static final int[] HOTSPOT_SECURITY_TYPES = {SECURITY_TYPE_WEP, SECURITY_TYPE_EAP}; - private static final long DEVICE_ID_1 = 111L; - private static final String BUNDLE_KEY = "INT-KEY"; - private static final int BUNDLE_VALUE = 1; - - /** - * Verifies parcel serialization/deserialization. - */ - @Test - public void testParcelOperation() { - HotspotNetworkConnectionStatus status = buildConnectionStatusBuilder().build(); - - Parcel parcelW = Parcel.obtain(); - status.writeToParcel(parcelW, 0); - byte[] bytes = parcelW.marshall(); - parcelW.recycle(); - - Parcel parcelR = Parcel.obtain(); - parcelR.unmarshall(bytes, 0, bytes.length); - parcelR.setDataPosition(0); - HotspotNetworkConnectionStatus fromParcel = - HotspotNetworkConnectionStatus.CREATOR.createFromParcel(parcelR); - - assertThat(fromParcel).isEqualTo(status); - assertThat(fromParcel.hashCode()).isEqualTo(status.hashCode()); - } - - /** - * Verifies the Equals operation - */ - @Test - public void testEqualsOperation() { - HotspotNetworkConnectionStatus status1 = buildConnectionStatusBuilder().build(); - HotspotNetworkConnectionStatus status2 = buildConnectionStatusBuilder().build(); - assertThat(status1).isEqualTo(status2); - - HotspotNetworkConnectionStatus.Builder builder = buildConnectionStatusBuilder() - .setStatus(CONNECTION_STATUS_TETHERING_TIMEOUT); - assertThat(builder.build()).isNotEqualTo(status1); - - builder = buildConnectionStatusBuilder() - .setHotspotNetwork(buildHotspotNetworkBuilder().setDeviceId(DEVICE_ID_1).build()); - assertThat(builder.build()).isNotEqualTo(status1); - } - - /** - * Verifies the get methods return the expected data. - */ - @Test - public void testGetMethods() { - HotspotNetworkConnectionStatus status = buildConnectionStatusBuilder().build(); - assertThat(status.getStatus()).isEqualTo(CONNECTION_STATUS_ENABLING_HOTSPOT); - assertThat(status.getHotspotNetwork()).isEqualTo(buildHotspotNetworkBuilder().build()); - assertThat(status.getExtras().getInt(BUNDLE_KEY)).isEqualTo(BUNDLE_VALUE); - } - - @Test - public void testHashCode() { - HotspotNetworkConnectionStatus status1 = buildConnectionStatusBuilder().build(); - HotspotNetworkConnectionStatus status2 = buildConnectionStatusBuilder().build(); - - assertThat(status1.hashCode()).isEqualTo(status2.hashCode()); - } - - private HotspotNetworkConnectionStatus.Builder buildConnectionStatusBuilder() { - return new HotspotNetworkConnectionStatus.Builder() - .setStatus(CONNECTION_STATUS_ENABLING_HOTSPOT) - .setHotspotNetwork(buildHotspotNetworkBuilder().build()) - .setExtras(buildBundle()); - } - - private Bundle buildBundle() { - Bundle bundle = new Bundle(); - bundle.putInt(BUNDLE_KEY, BUNDLE_VALUE); - return bundle; - } - - private HotspotNetwork.Builder buildHotspotNetworkBuilder() { - HotspotNetwork.Builder builder = new HotspotNetwork.Builder() - .setDeviceId(DEVICE_ID) - .setNetworkProviderInfo(NETWORK_PROVIDER_INFO) - .setHostNetworkType(NETWORK_TYPE) - .setNetworkName(NETWORK_NAME) - .setHotspotSsid(HOTSPOT_SSID) - .setHotspotBssid(HOTSPOT_BSSID); - Arrays.stream(HOTSPOT_SECURITY_TYPES).forEach(builder::addHotspotSecurityType); - return builder; - } -} diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/HotspotNetworkTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/HotspotNetworkTest.java deleted file mode 100644 index 0827ffaea482..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/HotspotNetworkTest.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * 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 android.net.wifi.sharedconnectivity.app; - -import static android.net.wifi.WifiInfo.SECURITY_TYPE_EAP; -import static android.net.wifi.WifiInfo.SECURITY_TYPE_PSK; -import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP; -import static android.net.wifi.sharedconnectivity.app.HotspotNetwork.NETWORK_TYPE_CELLULAR; -import static android.net.wifi.sharedconnectivity.app.HotspotNetwork.NETWORK_TYPE_WIFI; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_PHONE; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_TABLET; - -import static com.google.common.truth.Truth.assertThat; - -import static org.junit.Assert.assertThrows; - -import android.os.Bundle; -import android.os.Parcel; -import android.util.ArraySet; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.Arrays; - -/** - * Unit tests for {@link HotspotNetwork}. - */ -@SmallTest -@RunWith(AndroidJUnit4.class) -public class HotspotNetworkTest { - private static final long DEVICE_ID = 11L; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO = - new NetworkProviderInfo.Builder("TEST_NAME", "TEST_MODEL") - .setDeviceType(DEVICE_TYPE_TABLET).setConnectionStrength(2) - .setBatteryPercentage(50).build(); - private static final int NETWORK_TYPE = NETWORK_TYPE_CELLULAR; - private static final String NETWORK_NAME = "TEST_NETWORK"; - private static final String HOTSPOT_SSID = "TEST_SSID"; - private static final String HOTSPOT_BSSID = "TEST _BSSID"; - private static final int[] HOTSPOT_SECURITY_TYPES = {SECURITY_TYPE_WEP, SECURITY_TYPE_EAP}; - private static final String BUNDLE_KEY = "INT-KEY"; - private static final int BUNDLE_VALUE = 1; - - private static final long DEVICE_ID_1 = 111L; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO1 = - new NetworkProviderInfo.Builder("TEST_NAME", "TEST_MODEL") - .setDeviceType(DEVICE_TYPE_PHONE).setConnectionStrength(2) - .setBatteryPercentage(50).build(); - private static final int NETWORK_TYPE_1 = NETWORK_TYPE_WIFI; - private static final String NETWORK_NAME_1 = "TEST_NETWORK1"; - private static final String HOTSPOT_SSID_1 = "TEST_SSID1"; - private static final String HOTSPOT_BSSID_1 = "TEST _BSSID1"; - private static final int[] HOTSPOT_SECURITY_TYPES_1 = {SECURITY_TYPE_PSK, SECURITY_TYPE_EAP}; - - /** - * Verifies parcel serialization/deserialization. - */ - @Test - public void testParcelOperation() { - HotspotNetwork network = buildHotspotNetworkBuilder(true).build(); - - Parcel parcelW = Parcel.obtain(); - network.writeToParcel(parcelW, 0); - byte[] bytes = parcelW.marshall(); - parcelW.recycle(); - - Parcel parcelR = Parcel.obtain(); - parcelR.unmarshall(bytes, 0, bytes.length); - parcelR.setDataPosition(0); - HotspotNetwork fromParcel = HotspotNetwork.CREATOR.createFromParcel(parcelR); - - assertThat(fromParcel).isEqualTo(network); - assertThat(fromParcel.hashCode()).isEqualTo(network.hashCode()); - } - - /** - * Verifies the Equals operation - */ - @Test - public void testEqualsOperation() { - HotspotNetwork network1 = buildHotspotNetworkBuilder(true).build(); - HotspotNetwork network2 = buildHotspotNetworkBuilder(true).build(); - assertThat(network1).isEqualTo(network2); - - HotspotNetwork.Builder builder = buildHotspotNetworkBuilder(true).setDeviceId(DEVICE_ID_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildHotspotNetworkBuilder(true).setNetworkProviderInfo(NETWORK_PROVIDER_INFO1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildHotspotNetworkBuilder(true).setHostNetworkType(NETWORK_TYPE_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildHotspotNetworkBuilder(true).setNetworkName(NETWORK_NAME_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildHotspotNetworkBuilder(true).setHotspotSsid(HOTSPOT_SSID_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildHotspotNetworkBuilder(true).setHotspotBssid(HOTSPOT_BSSID_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildHotspotNetworkBuilder(true); - HotspotNetwork.Builder builder1 = buildHotspotNetworkBuilder(true); - Arrays.stream(HOTSPOT_SECURITY_TYPES_1).forEach(builder1::addHotspotSecurityType); - - assertThat(builder1.build()).isNotEqualTo(builder.build()); - } - - /** - * Verifies the get methods return the expected data. - */ - @Test - public void testGetMethods() { - HotspotNetwork network = buildHotspotNetworkBuilder(true).build(); - ArraySet<Integer> securityTypes = new ArraySet<>(); - Arrays.stream(HOTSPOT_SECURITY_TYPES).forEach(securityTypes::add); - - assertThat(network.getDeviceId()).isEqualTo(DEVICE_ID); - assertThat(network.getNetworkProviderInfo()).isEqualTo(NETWORK_PROVIDER_INFO); - assertThat(network.getHostNetworkType()).isEqualTo(NETWORK_TYPE); - assertThat(network.getNetworkName()).isEqualTo(NETWORK_NAME); - assertThat(network.getHotspotSsid()).isEqualTo(HOTSPOT_SSID); - assertThat(network.getHotspotBssid()).isEqualTo(HOTSPOT_BSSID); - assertThat(network.getHotspotSecurityTypes()).containsExactlyElementsIn(securityTypes); - assertThat(network.getExtras().getInt(BUNDLE_KEY)).isEqualTo(BUNDLE_VALUE); - } - - @Test - public void testHashCode() { - HotspotNetwork network1 = buildHotspotNetworkBuilder(true).build(); - HotspotNetwork network2 = buildHotspotNetworkBuilder(true).build(); - - assertThat(network1.hashCode()).isEqualTo(network2.hashCode()); - } - - @Test - public void networkProviderInfoNotSet_shouldThrowException() { - Exception e = assertThrows(IllegalArgumentException.class, - () -> buildHotspotNetworkBuilder(false).build()); - assertThat(e.getMessage()).contains("NetworkProviderInfo"); - } - - private HotspotNetwork.Builder buildHotspotNetworkBuilder(boolean withNetworkProviderInfo) { - HotspotNetwork.Builder builder = new HotspotNetwork.Builder() - .setDeviceId(DEVICE_ID) - .setHostNetworkType(NETWORK_TYPE) - .setNetworkName(NETWORK_NAME) - .setHotspotSsid(HOTSPOT_SSID) - .setHotspotBssid(HOTSPOT_BSSID) - .setExtras(buildBundle()); - Arrays.stream(HOTSPOT_SECURITY_TYPES).forEach(builder::addHotspotSecurityType); - if (withNetworkProviderInfo) { - builder.setNetworkProviderInfo(NETWORK_PROVIDER_INFO); - } - return builder; - } - - private Bundle buildBundle() { - Bundle bundle = new Bundle(); - bundle.putInt(BUNDLE_KEY, BUNDLE_VALUE); - return bundle; - } -} diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatusTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatusTest.java deleted file mode 100644 index f98a0fcc7574..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatusTest.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * 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 android.net.wifi.sharedconnectivity.app; - -import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP; -import static android.net.wifi.sharedconnectivity.app.KnownNetwork.NETWORK_SOURCE_NEARBY_SELF; -import static android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.CONNECTION_STATUS_SAVED; -import static android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.CONNECTION_STATUS_SAVE_FAILED; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_TABLET; - -import static com.google.common.truth.Truth.assertThat; - -import android.os.Bundle; -import android.os.Parcel; - -import androidx.test.filters.SmallTest; - -import org.junit.Test; - -import java.util.Arrays; - -/** - * Unit tests for {@link KnownNetworkConnectionStatus}. - */ -@SmallTest -public class KnownNetworkConnectionStatusTest { - private static final int NETWORK_SOURCE = NETWORK_SOURCE_NEARBY_SELF; - private static final String SSID = "TEST_SSID"; - private static final int[] SECURITY_TYPES = {SECURITY_TYPE_WEP}; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO = - new NetworkProviderInfo.Builder("TEST_NAME", "TEST_MODEL") - .setDeviceType(DEVICE_TYPE_TABLET).setConnectionStrength(2) - .setBatteryPercentage(50).build(); - private static final String SSID_1 = "TEST_SSID1"; - private static final String BUNDLE_KEY = "INT-KEY"; - private static final int BUNDLE_VALUE = 1; - - /** - * Verifies parcel serialization/deserialization. - */ - @Test - public void testParcelOperation() { - KnownNetworkConnectionStatus status = buildConnectionStatusBuilder().build(); - - Parcel parcelW = Parcel.obtain(); - status.writeToParcel(parcelW, 0); - byte[] bytes = parcelW.marshall(); - parcelW.recycle(); - - Parcel parcelR = Parcel.obtain(); - parcelR.unmarshall(bytes, 0, bytes.length); - parcelR.setDataPosition(0); - KnownNetworkConnectionStatus fromParcel = - KnownNetworkConnectionStatus.CREATOR.createFromParcel(parcelR); - - assertThat(fromParcel).isEqualTo(status); - assertThat(fromParcel.hashCode()).isEqualTo(status.hashCode()); - } - - /** - * Verifies the Equals operation - */ - @Test - public void testEqualsOperation() { - KnownNetworkConnectionStatus status1 = buildConnectionStatusBuilder().build(); - KnownNetworkConnectionStatus status2 = buildConnectionStatusBuilder().build(); - assertThat(status1).isEqualTo(status2); - - KnownNetworkConnectionStatus.Builder builder = buildConnectionStatusBuilder() - .setStatus(CONNECTION_STATUS_SAVE_FAILED); - assertThat(builder.build()).isNotEqualTo(status1); - - builder = buildConnectionStatusBuilder() - .setKnownNetwork(buildKnownNetworkBuilder().setSsid(SSID_1).build()); - assertThat(builder.build()).isNotEqualTo(status1); - } - - /** - * Verifies the get methods return the expected data. - */ - @Test - public void testGetMethods() { - KnownNetworkConnectionStatus status = buildConnectionStatusBuilder().build(); - assertThat(status.getStatus()).isEqualTo(CONNECTION_STATUS_SAVED); - assertThat(status.getKnownNetwork()).isEqualTo(buildKnownNetworkBuilder().build()); - assertThat(status.getExtras().getInt(BUNDLE_KEY)).isEqualTo(BUNDLE_VALUE); - } - - @Test - public void testHashCode() { - KnownNetworkConnectionStatus status1 = buildConnectionStatusBuilder().build(); - KnownNetworkConnectionStatus status2 = buildConnectionStatusBuilder().build(); - - assertThat(status1.hashCode()).isEqualTo(status2.hashCode()); - } - - private KnownNetworkConnectionStatus.Builder buildConnectionStatusBuilder() { - return new KnownNetworkConnectionStatus.Builder() - .setStatus(CONNECTION_STATUS_SAVED) - .setKnownNetwork(buildKnownNetworkBuilder().build()) - .setExtras(buildBundle()); - } - - private Bundle buildBundle() { - Bundle bundle = new Bundle(); - bundle.putInt(BUNDLE_KEY, BUNDLE_VALUE); - return bundle; - } - - private KnownNetwork.Builder buildKnownNetworkBuilder() { - KnownNetwork.Builder builder = new KnownNetwork.Builder().setNetworkSource(NETWORK_SOURCE) - .setSsid(SSID).setNetworkProviderInfo(NETWORK_PROVIDER_INFO); - Arrays.stream(SECURITY_TYPES).forEach(builder::addSecurityType); - return builder; - } - -} diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkTest.java deleted file mode 100644 index 81d7b44382e0..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkTest.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * 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 android.net.wifi.sharedconnectivity.app; - -import static android.net.wifi.WifiInfo.SECURITY_TYPE_PSK; -import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP; -import static android.net.wifi.sharedconnectivity.app.KnownNetwork.NETWORK_SOURCE_CLOUD_SELF; -import static android.net.wifi.sharedconnectivity.app.KnownNetwork.NETWORK_SOURCE_NEARBY_SELF; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_PHONE; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_TABLET; - -import static com.google.common.truth.Truth.assertThat; - -import android.os.Bundle; -import android.os.Parcel; -import android.util.ArraySet; - -import androidx.test.filters.SmallTest; - -import org.junit.Test; - -import java.util.Arrays; - -/** - * Unit tests for {@link KnownNetwork}. - */ -@SmallTest -public class KnownNetworkTest { - - private static final int NETWORK_SOURCE = NETWORK_SOURCE_NEARBY_SELF; - private static final String SSID = "TEST_SSID"; - private static final int[] SECURITY_TYPES = {SECURITY_TYPE_WEP}; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO = - new NetworkProviderInfo.Builder("TEST_NAME", "TEST_MODEL") - .setDeviceType(DEVICE_TYPE_TABLET).setConnectionStrength(2) - .setBatteryPercentage(50).build(); - private static final String BUNDLE_KEY = "INT-KEY"; - private static final int BUNDLE_VALUE = 1; - - private static final int NETWORK_SOURCE_1 = NETWORK_SOURCE_CLOUD_SELF; - private static final String SSID_1 = "TEST_SSID1"; - private static final int[] SECURITY_TYPES_1 = {SECURITY_TYPE_PSK}; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO1 = - new NetworkProviderInfo.Builder("TEST_NAME_1", "TEST_MODEL_1") - .setDeviceType(DEVICE_TYPE_PHONE).setConnectionStrength(3) - .setBatteryPercentage(33).build(); - - /** - * Verifies parcel serialization/deserialization. - */ - @Test - public void testParcelOperation() { - KnownNetwork network = buildKnownNetworkBuilder().build(); - - Parcel parcelW = Parcel.obtain(); - network.writeToParcel(parcelW, 0); - byte[] bytes = parcelW.marshall(); - parcelW.recycle(); - - Parcel parcelR = Parcel.obtain(); - parcelR.unmarshall(bytes, 0, bytes.length); - parcelR.setDataPosition(0); - KnownNetwork fromParcel = KnownNetwork.CREATOR.createFromParcel(parcelR); - - assertThat(fromParcel).isEqualTo(network); - assertThat(fromParcel.hashCode()).isEqualTo(network.hashCode()); - } - - /** - * Verifies the Equals operation - */ - @Test - public void testEqualsOperation() { - KnownNetwork network1 = buildKnownNetworkBuilder().build(); - KnownNetwork network2 = buildKnownNetworkBuilder().build(); - assertThat(network1).isEqualTo(network2); - - KnownNetwork.Builder builder = buildKnownNetworkBuilder() - .setNetworkSource(NETWORK_SOURCE_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildKnownNetworkBuilder().setSsid(SSID_1); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildKnownNetworkBuilder(); - Arrays.stream(SECURITY_TYPES_1).forEach(builder::addSecurityType); - assertThat(builder.build()).isNotEqualTo(network1); - - builder = buildKnownNetworkBuilder().setNetworkProviderInfo(NETWORK_PROVIDER_INFO1); - assertThat(builder.build()).isNotEqualTo(network1); - } - - /** - * Verifies the get methods return the expected data. - */ - @Test - public void testGetMethods() { - KnownNetwork network = buildKnownNetworkBuilder().build(); - ArraySet<Integer> securityTypes = new ArraySet<>(); - Arrays.stream(SECURITY_TYPES).forEach(securityTypes::add); - - assertThat(network.getNetworkSource()).isEqualTo(NETWORK_SOURCE); - assertThat(network.getSsid()).isEqualTo(SSID); - assertThat(network.getSecurityTypes()).containsExactlyElementsIn(securityTypes); - assertThat(network.getNetworkProviderInfo()).isEqualTo(NETWORK_PROVIDER_INFO); - assertThat(network.getExtras().getInt(BUNDLE_KEY)).isEqualTo(BUNDLE_VALUE); - } - - @Test - public void testHashCode() { - KnownNetwork network1 = buildKnownNetworkBuilder().build(); - KnownNetwork network2 = buildKnownNetworkBuilder().build(); - - assertThat(network1.hashCode()).isEqualTo(network2.hashCode()); - } - - private KnownNetwork.Builder buildKnownNetworkBuilder() { - KnownNetwork.Builder builder = new KnownNetwork.Builder().setNetworkSource(NETWORK_SOURCE) - .setSsid(SSID).setNetworkProviderInfo(NETWORK_PROVIDER_INFO) - .setExtras(buildBundle()); - Arrays.stream(SECURITY_TYPES).forEach(builder::addSecurityType); - return builder; - } - - private Bundle buildBundle() { - Bundle bundle = new Bundle(); - bundle.putInt(BUNDLE_KEY, BUNDLE_VALUE); - return bundle; - } -} diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfoTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfoTest.java deleted file mode 100644 index 4aa9ca684ad0..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/NetworkProviderInfoTest.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * 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 android.net.wifi.sharedconnectivity.app; - -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_LAPTOP; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_PHONE; - -import static com.google.common.truth.Truth.assertThat; - -import android.os.Bundle; -import android.os.Parcel; - -import androidx.test.filters.SmallTest; - -import org.junit.Test; - -/** - * Unit tests for {@link NetworkProviderInfo}. - */ -@SmallTest -public class NetworkProviderInfoTest { - - private static final int DEVICE_TYPE = DEVICE_TYPE_PHONE; - private static final String DEVICE_NAME = "TEST_NAME"; - private static final String DEVICE_MODEL = "TEST_MODEL"; - private static final int BATTERY_PERCENTAGE = 50; - private static final int CONNECTION_STRENGTH = 2; - private static final String BUNDLE_KEY = "INT-KEY"; - private static final int BUNDLE_VALUE = 1; - - private static final int DEVICE_TYPE_1 = DEVICE_TYPE_LAPTOP; - private static final String DEVICE_NAME_1 = "TEST_NAME1"; - private static final String DEVICE_MODEL_1 = "TEST_MODEL1"; - private static final int BATTERY_PERCENTAGE_1 = 30; - private static final int CONNECTION_STRENGTH_1 = 1; - - /** - * Verifies parcel serialization/deserialization. - */ - @Test - public void testParcelOperation() { - NetworkProviderInfo info = buildNetworkProviderInfoBuilder().build(); - - Parcel parcelW = Parcel.obtain(); - info.writeToParcel(parcelW, 0); - byte[] bytes = parcelW.marshall(); - parcelW.recycle(); - - Parcel parcelR = Parcel.obtain(); - parcelR.unmarshall(bytes, 0, bytes.length); - parcelR.setDataPosition(0); - NetworkProviderInfo fromParcel = NetworkProviderInfo.CREATOR.createFromParcel(parcelR); - - assertThat(fromParcel).isEqualTo(info); - assertThat(fromParcel.hashCode()).isEqualTo(info.hashCode()); - } - - /** - * Verifies the Equals operation - */ - @Test - public void testEqualsOperation() { - NetworkProviderInfo info1 = buildNetworkProviderInfoBuilder().build(); - NetworkProviderInfo info2 = buildNetworkProviderInfoBuilder().build(); - assertThat(info1).isEqualTo(info2); - - NetworkProviderInfo.Builder builder = buildNetworkProviderInfoBuilder().setDeviceType( - DEVICE_TYPE_1); - assertThat(builder.build()).isNotEqualTo(info1); - - builder = buildNetworkProviderInfoBuilder().setDeviceName(DEVICE_NAME_1); - assertThat(builder.build()).isNotEqualTo(info1); - - builder = buildNetworkProviderInfoBuilder().setModelName(DEVICE_MODEL_1); - assertThat(builder.build()).isNotEqualTo(info1); - - builder = buildNetworkProviderInfoBuilder() - .setBatteryPercentage(BATTERY_PERCENTAGE_1); - assertThat(builder.build()).isNotEqualTo(info1); - - builder = buildNetworkProviderInfoBuilder() - .setConnectionStrength(CONNECTION_STRENGTH_1); - assertThat(builder.build()).isNotEqualTo(info1); - } - - /** - * Verifies the get methods return the expected data. - */ - @Test - public void testGetMethods() { - NetworkProviderInfo info = buildNetworkProviderInfoBuilder().build(); - assertThat(info.getDeviceType()).isEqualTo(DEVICE_TYPE); - assertThat(info.getDeviceName()).isEqualTo(DEVICE_NAME); - assertThat(info.getModelName()).isEqualTo(DEVICE_MODEL); - assertThat(info.getBatteryPercentage()).isEqualTo(BATTERY_PERCENTAGE); - assertThat(info.getConnectionStrength()).isEqualTo(CONNECTION_STRENGTH); - assertThat(info.getExtras().getInt(BUNDLE_KEY)).isEqualTo(BUNDLE_VALUE); - } - - @Test - public void testHashCode() { - NetworkProviderInfo info1 = buildNetworkProviderInfoBuilder().build(); - NetworkProviderInfo info2 = buildNetworkProviderInfoBuilder().build(); - - assertThat(info1.hashCode()).isEqualTo(info2.hashCode()); - } - - private NetworkProviderInfo.Builder buildNetworkProviderInfoBuilder() { - return new NetworkProviderInfo.Builder(DEVICE_NAME, DEVICE_MODEL).setDeviceType(DEVICE_TYPE) - .setBatteryPercentage(BATTERY_PERCENTAGE) - .setConnectionStrength(CONNECTION_STRENGTH) - .setExtras(buildBundle()); - } - - private Bundle buildBundle() { - Bundle bundle = new Bundle(); - bundle.putInt(BUNDLE_KEY, BUNDLE_VALUE); - return bundle; - } -} diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java deleted file mode 100644 index a03a6c2fc673..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivityManagerTest.java +++ /dev/null @@ -1,566 +0,0 @@ -/* - * 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 android.net.wifi.sharedconnectivity.app; - -import static android.net.wifi.WifiInfo.SECURITY_TYPE_EAP; -import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP; -import static android.net.wifi.sharedconnectivity.app.HotspotNetwork.NETWORK_TYPE_CELLULAR; -import static android.net.wifi.sharedconnectivity.app.KnownNetwork.NETWORK_SOURCE_NEARBY_SELF; -import static android.net.wifi.sharedconnectivity.app.NetworkProviderInfo.DEVICE_TYPE_TABLET; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.content.res.Resources; -import android.net.wifi.sharedconnectivity.service.ISharedConnectivityService; -import android.os.Bundle; -import android.os.RemoteException; - -import androidx.test.filters.SmallTest; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.Executor; - -/** - * Unit tests for {@link SharedConnectivityManager}. - */ -@SmallTest -public class SharedConnectivityManagerTest { - private static final long DEVICE_ID = 11L; - private static final NetworkProviderInfo NETWORK_PROVIDER_INFO = - new NetworkProviderInfo.Builder("TEST_NAME", "TEST_MODEL") - .setDeviceType(DEVICE_TYPE_TABLET).setConnectionStrength(2) - .setBatteryPercentage(50).build(); - private static final int NETWORK_TYPE = NETWORK_TYPE_CELLULAR; - private static final String NETWORK_NAME = "TEST_NETWORK"; - private static final String HOTSPOT_SSID = "TEST_SSID"; - private static final int[] HOTSPOT_SECURITY_TYPES = {SECURITY_TYPE_WEP, SECURITY_TYPE_EAP}; - - private static final int NETWORK_SOURCE = NETWORK_SOURCE_NEARBY_SELF; - private static final String SSID = "TEST_SSID"; - private static final int[] SECURITY_TYPES = {SECURITY_TYPE_WEP}; - - private static final String SERVICE_PACKAGE_NAME = "TEST_PACKAGE"; - private static final String SERVICE_INTENT_ACTION = "TEST_INTENT_ACTION"; - - - @Mock - Context mContext; - @Mock - ISharedConnectivityService mService; - @Mock - Executor mExecutor; - @Mock - SharedConnectivityClientCallback mClientCallback, mClientCallback2; - @Mock - Resources mResources; - @Mock - ISharedConnectivityService.Stub mIBinder; - - private static final ComponentName COMPONENT_NAME = - new ComponentName("dummypkg", "dummycls"); - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - setResources(mContext); - } - - @Test - public void resourcesNotDefined_createShouldReturnNull() { - when(mResources.getString(anyInt())).thenThrow(new Resources.NotFoundException()); - - assertThat(SharedConnectivityManager.create(mContext)).isNull(); - } - - @Test - public void resourceStringsAreEmpty_createShouldReturnNull() { - when(mResources.getString(anyInt())).thenReturn(""); - - assertThat(SharedConnectivityManager.create(mContext)).isNull(); - } - - @Test - public void bindingToServiceOnFirstCallbackRegistration() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.registerCallback(mExecutor, mClientCallback); - - verify(mContext).bindService(any(Intent.class), any(ServiceConnection.class), anyInt()); - } - - @Test - public void bindIsCalledOnceOnMultipleCallbackRegistrations() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - - manager.registerCallback(mExecutor, mClientCallback); - verify(mContext, times(1)).bindService(any(Intent.class), any(ServiceConnection.class), - anyInt()); - - manager.registerCallback(mExecutor, mClientCallback2); - verify(mContext, times(1)).bindService(any(Intent.class), any(ServiceConnection.class), - anyInt()); - } - - @Test - public void unbindIsCalledOnLastCallbackUnregistrations() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - - manager.registerCallback(mExecutor, mClientCallback); - manager.registerCallback(mExecutor, mClientCallback2); - manager.unregisterCallback(mClientCallback); - verify(mContext, never()).unbindService( - any(ServiceConnection.class)); - - manager.unregisterCallback(mClientCallback2); - verify(mContext, times(1)).unbindService( - any(ServiceConnection.class)); - } - - @Test - public void registerCallback_serviceNotConnected_canUnregisterAndReregister() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - - manager.registerCallback(mExecutor, mClientCallback); - manager.unregisterCallback(mClientCallback); - manager.registerCallback(mExecutor, mClientCallback); - - verify(mClientCallback, never()).onRegisterCallbackFailed(any(Exception.class)); - } - - @Test - public void registerCallback_serviceConnected() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.registerCallback(mExecutor, mClientCallback); - - verify(mService).registerCallback(any()); - verify(mClientCallback, never()).onRegisterCallbackFailed(any(Exception.class)); - } - - @Test - public void registerCallback_doubleRegistration_shouldFail() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.registerCallback(mExecutor, mClientCallback); - manager.registerCallback(mExecutor, mClientCallback); - - verify(mClientCallback).onRegisterCallbackFailed(any(IllegalStateException.class)); - } - - @Test - public void registerCallback_remoteException_shouldFail() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).registerCallback(any()); - - manager.registerCallback(mExecutor, mClientCallback); - - verify(mClientCallback).onRegisterCallbackFailed(any(RemoteException.class)); - } - - @Test - public void unregisterCallback_withoutRegisteringFirst_serviceNotConnected_shouldFail() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.unregisterCallback(mClientCallback)).isFalse(); - } - - @Test - public void unregisterCallback_withoutRegisteringFirst_serviceConnected_shouldFail() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - assertThat(manager.unregisterCallback(mClientCallback)).isFalse(); - } - - @Test - public void unregisterCallback() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.registerCallback(mExecutor, mClientCallback); - - assertThat(manager.unregisterCallback(mClientCallback)).isTrue(); - verify(mService).unregisterCallback(any()); - } - - @Test - public void unregisterCallback_doubleUnregistration_serviceConnected_shouldFail() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.registerCallback(mExecutor, mClientCallback); - manager.unregisterCallback(mClientCallback); - - assertThat(manager.unregisterCallback(mClientCallback)).isFalse(); - } - - @Test - public void unregisterCallback_doubleUnregistration_serviceNotConnected_shouldFail() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - manager.registerCallback(mExecutor, mClientCallback); - manager.unregisterCallback(mClientCallback); - - assertThat(manager.unregisterCallback(mClientCallback)).isFalse(); - } - - @Test - public void unregisterCallback_remoteException_shouldFail() throws Exception { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - doThrow(new RemoteException()).when(mService).unregisterCallback(any()); - - assertThat(manager.unregisterCallback(mClientCallback)).isFalse(); - } - - @Test - public void onServiceConnected() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - - manager.registerCallback(mExecutor, mClientCallback); - manager.getServiceConnection().onServiceConnected(COMPONENT_NAME, mIBinder); - - verify(mClientCallback).onServiceConnected(); - } - - @Test - public void onServiceDisconnected() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - - manager.registerCallback(mExecutor, mClientCallback); - manager.getServiceConnection().onServiceConnected(COMPONENT_NAME, mIBinder); - manager.getServiceConnection().onServiceDisconnected(COMPONENT_NAME); - - verify(mClientCallback).onServiceDisconnected(); - } - - - @Test - public void connectHotspotNetwork_serviceNotConnected_shouldFail() { - HotspotNetwork network = buildHotspotNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.connectHotspotNetwork(network)).isFalse(); - } - - @Test - public void connectHotspotNetwork() throws RemoteException { - HotspotNetwork network = buildHotspotNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.connectHotspotNetwork(network); - - verify(mService).connectHotspotNetwork(network); - } - - @Test - public void connectHotspotNetwork_remoteException_shouldFail() throws RemoteException { - HotspotNetwork network = buildHotspotNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).connectHotspotNetwork(network); - - assertThat(manager.connectHotspotNetwork(network)).isFalse(); - } - - @Test - public void disconnectHotspotNetwork_serviceNotConnected_shouldFail() { - HotspotNetwork network = buildHotspotNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.disconnectHotspotNetwork(network)).isFalse(); - } - - @Test - public void disconnectHotspotNetwork() throws RemoteException { - HotspotNetwork network = buildHotspotNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.disconnectHotspotNetwork(network); - - verify(mService).disconnectHotspotNetwork(network); - } - - @Test - public void disconnectHotspotNetwork_remoteException_shouldFail() throws RemoteException { - HotspotNetwork network = buildHotspotNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).disconnectHotspotNetwork(any()); - - assertThat(manager.disconnectHotspotNetwork(network)).isFalse(); - } - - @Test - public void connectKnownNetwork_serviceNotConnected_shouldFail() throws RemoteException { - KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.connectKnownNetwork(network)).isFalse(); - } - - @Test - public void connectKnownNetwork() throws RemoteException { - KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.connectKnownNetwork(network); - - verify(mService).connectKnownNetwork(network); - } - - @Test - public void connectKnownNetwork_remoteException_shouldFail() throws RemoteException { - KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).connectKnownNetwork(network); - - assertThat(manager.connectKnownNetwork(network)).isFalse(); - } - - @Test - public void forgetKnownNetwork_serviceNotConnected_shouldFail() { - KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.forgetKnownNetwork(network)).isFalse(); - } - - @Test - public void forgetKnownNetwork_serviceConnected() throws RemoteException { - KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - - manager.forgetKnownNetwork(network); - - verify(mService).forgetKnownNetwork(network); - } - - @Test - public void forgetKnownNetwork_remoteException_shouldFail() throws RemoteException { - KnownNetwork network = buildKnownNetwork(); - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).forgetKnownNetwork(network); - - assertThat(manager.forgetKnownNetwork(network)).isFalse(); - } - - @Test - public void getHotspotNetworks_serviceNotConnected_shouldReturnNull() { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.getHotspotNetworks()).isNull(); - } - - @Test - public void getHotspotNetworks_remoteException_shouldReturnNull() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).getHotspotNetworks(); - - assertThat(manager.getHotspotNetworks()).isNull(); - } - - @Test - public void getHotspotNetworks_shouldReturnNetworksList() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - List<HotspotNetwork> networks = List.of(buildHotspotNetwork()); - manager.setService(mService); - when(mService.getHotspotNetworks()).thenReturn(networks); - - assertThat(manager.getHotspotNetworks()).containsExactly(buildHotspotNetwork()); - } - - @Test - public void getKnownNetworks_serviceNotConnected_shouldReturnNull() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.getKnownNetworks()).isNull(); - } - - @Test - public void getKnownNetworks_remoteException_shouldReturnNull() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).getKnownNetworks(); - - assertThat(manager.getKnownNetworks()).isNull(); - } - - @Test - public void getKnownNetworks_shouldReturnNetworksList() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - List<KnownNetwork> networks = List.of(buildKnownNetwork()); - manager.setService(mService); - when(mService.getKnownNetworks()).thenReturn(networks); - - assertThat(manager.getKnownNetworks()).containsExactly(buildKnownNetwork()); - } - - @Test - public void getSettingsState_serviceNotConnected_shouldReturnNull() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.getSettingsState()).isNull(); - } - - @Test - public void getSettingsState_remoteException_shouldReturnNull() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).getSettingsState(); - - assertThat(manager.getSettingsState()).isNull(); - } - - @Test - public void getSettingsState_serviceConnected_shouldReturnState() throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - SharedConnectivitySettingsState state = - new SharedConnectivitySettingsState.Builder().setInstantTetherEnabled(true) - .setExtras(new Bundle()).build(); - manager.setService(mService); - when(mService.getSettingsState()).thenReturn(state); - - assertThat(manager.getSettingsState()).isEqualTo(state); - } - - @Test - public void getHotspotNetworkConnectionStatus_serviceNotConnected_shouldReturnNull() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.getHotspotNetworkConnectionStatus()).isNull(); - } - - @Test - public void getHotspotNetworkConnectionStatus_remoteException_shouldReturnNull() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).getHotspotNetworkConnectionStatus(); - - assertThat(manager.getHotspotNetworkConnectionStatus()).isNull(); - } - - @Test - public void getHotspotNetworkConnectionStatus_serviceConnected_shouldReturnStatus() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - HotspotNetworkConnectionStatus status = new HotspotNetworkConnectionStatus.Builder() - .setStatus(HotspotNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT) - .setExtras(new Bundle()).build(); - manager.setService(mService); - when(mService.getHotspotNetworkConnectionStatus()).thenReturn(status); - - assertThat(manager.getHotspotNetworkConnectionStatus()).isEqualTo(status); - } - - @Test - public void getKnownNetworkConnectionStatus_serviceNotConnected_shouldReturnNull() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(null); - - assertThat(manager.getKnownNetworkConnectionStatus()).isNull(); - } - - @Test - public void getKnownNetworkConnectionStatus_remoteException_shouldReturnNull() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - manager.setService(mService); - doThrow(new RemoteException()).when(mService).getKnownNetworkConnectionStatus(); - - assertThat(manager.getKnownNetworkConnectionStatus()).isNull(); - } - - @Test - public void getKnownNetworkConnectionStatus_serviceConnected_shouldReturnStatus() - throws RemoteException { - SharedConnectivityManager manager = SharedConnectivityManager.create(mContext); - KnownNetworkConnectionStatus status = new KnownNetworkConnectionStatus.Builder() - .setStatus(KnownNetworkConnectionStatus.CONNECTION_STATUS_SAVED) - .setExtras(new Bundle()).build(); - manager.setService(mService); - when(mService.getKnownNetworkConnectionStatus()).thenReturn(status); - - assertThat(manager.getKnownNetworkConnectionStatus()).isEqualTo(status); - } - - private void setResources(@Mock Context context) { - when(context.getResources()).thenReturn(mResources); - when(mResources.getString(anyInt())) - .thenReturn(SERVICE_PACKAGE_NAME, SERVICE_INTENT_ACTION); - } - - private HotspotNetwork buildHotspotNetwork() { - HotspotNetwork.Builder builder = new HotspotNetwork.Builder() - .setDeviceId(DEVICE_ID) - .setNetworkProviderInfo(NETWORK_PROVIDER_INFO) - .setHostNetworkType(NETWORK_TYPE) - .setNetworkName(NETWORK_NAME) - .setHotspotSsid(HOTSPOT_SSID); - Arrays.stream(HOTSPOT_SECURITY_TYPES).forEach(builder::addHotspotSecurityType); - return builder.build(); - } - - private KnownNetwork buildKnownNetwork() { - KnownNetwork.Builder builder = new KnownNetwork.Builder().setNetworkSource(NETWORK_SOURCE) - .setSsid(SSID).setNetworkProviderInfo(NETWORK_PROVIDER_INFO); - Arrays.stream(SECURITY_TYPES).forEach(builder::addSecurityType); - return builder.build(); - } -} diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsStateTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsStateTest.java deleted file mode 100644 index d6e7138dee2c..000000000000 --- a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsStateTest.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * 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 android.net.wifi.sharedconnectivity.app; - -import static com.google.common.truth.Truth.assertThat; - -import static org.junit.Assert.assertThrows; - -import android.app.PendingIntent; -import android.content.ComponentName; -import android.content.Intent; -import android.os.Parcel; - -import androidx.test.core.app.ApplicationProvider; -import androidx.test.filters.SmallTest; - -import org.junit.Test; - -/** - * Unit tests for {@link SharedConnectivitySettingsState}. - */ -@SmallTest -public class SharedConnectivitySettingsStateTest { - private static final boolean INSTANT_TETHER_STATE = true; - private static final String INTENT_ACTION = "instant.tether.settings"; - - private static final boolean INSTANT_TETHER_STATE_1 = false; - private static final String INTENT_ACTION_1 = "instant.tether.settings1"; - - @Test - public void pendingIntentMutable_buildShouldThrow() { - SharedConnectivitySettingsState.Builder builder = - new SharedConnectivitySettingsState.Builder() - .setInstantTetherEnabled(INSTANT_TETHER_STATE) - .setInstantTetherSettingsPendingIntent(PendingIntent.getActivity( - ApplicationProvider.getApplicationContext(), 0, - new Intent(INTENT_ACTION).setComponent(new ComponentName( - "com.test.package", "TestClass")), - PendingIntent.FLAG_MUTABLE)); - - Exception e = assertThrows(IllegalArgumentException.class, builder::build); - assertThat(e.getMessage()).contains("Pending intent must be immutable"); - } - - @Test - public void parcelOperation() { - SharedConnectivitySettingsState state = buildSettingsStateBuilder(INTENT_ACTION).build(); - - Parcel parcel = Parcel.obtain(); - state.writeToParcel(parcel, 0); - parcel.setDataPosition(0); - SharedConnectivitySettingsState fromParcel = - SharedConnectivitySettingsState.CREATOR.createFromParcel(parcel); - - assertThat(fromParcel).isEqualTo(state); - assertThat(fromParcel.hashCode()).isEqualTo(state.hashCode()); - } - - @Test - public void equalsOperation() { - SharedConnectivitySettingsState state1 = buildSettingsStateBuilder(INTENT_ACTION).build(); - SharedConnectivitySettingsState state2 = buildSettingsStateBuilder(INTENT_ACTION).build(); - assertThat(state1).isEqualTo(state2); - - SharedConnectivitySettingsState.Builder builder = buildSettingsStateBuilder(INTENT_ACTION) - .setInstantTetherEnabled(INSTANT_TETHER_STATE_1); - assertThat(builder.build()).isNotEqualTo(state1); - - builder = buildSettingsStateBuilder(INTENT_ACTION_1); - assertThat(builder.build()).isNotEqualTo(state1); - } - - @Test - public void getMethods() { - SharedConnectivitySettingsState state = buildSettingsStateBuilder(INTENT_ACTION).build(); - - assertThat(state.isInstantTetherEnabled()).isEqualTo(INSTANT_TETHER_STATE); - assertThat(state.getInstantTetherSettingsPendingIntent()) - .isEqualTo(buildPendingIntent(INTENT_ACTION)); - } - - @Test - public void hashCodeCalculation() { - SharedConnectivitySettingsState state1 = buildSettingsStateBuilder(INTENT_ACTION).build(); - SharedConnectivitySettingsState state2 = buildSettingsStateBuilder(INTENT_ACTION).build(); - - assertThat(state1.hashCode()).isEqualTo(state2.hashCode()); - } - - private SharedConnectivitySettingsState.Builder buildSettingsStateBuilder(String intentAction) { - return new SharedConnectivitySettingsState.Builder() - .setInstantTetherEnabled(INSTANT_TETHER_STATE) - .setInstantTetherSettingsPendingIntent(buildPendingIntent(intentAction)); - } - - private PendingIntent buildPendingIntent(String intentAction) { - return PendingIntent.getActivity( - ApplicationProvider.getApplicationContext(), 0, - new Intent(intentAction), PendingIntent.FLAG_IMMUTABLE); - } -} |