diff options
121 files changed, 4355 insertions, 5043 deletions
diff --git a/Android.bp b/Android.bp index fe0d5dd82940..b80ef889d1a8 100644 --- a/Android.bp +++ b/Android.bp @@ -25,30 +25,105 @@ // // READ ME: ######################################################## +// TODO(b/70046217): make these as filegroups where the base directory for aidl files +// is given as 'path'. Eliminate the need for aidl_local_include_dirs. +framework_srcs = [ + // java sources under this directory + "core/java/**/*.java", + "drm/java/**/*.java", + "graphics/java/**/*.java", + "keystore/java/**/*.java", + "location/java/**/*.java", + "lowpan/java/**/*.java", + "media/java/**/*.java", + "media/mca/effect/java/**/*.java", + "media/mca/filterfw/java/**/*.java", + "media/mca/filterpacks/java/**/*.java", + "opengl/java/**/*.java", + "rs/java/**/*.java", + "sax/java/**/*.java", + "telecomm/java/**/*.java", + "telephony/java/**/*.java", + "wifi/java/**/*.java", + + // aidl under this directory + // b/70046217#comment15 These MUST come after all java srcs. + // TODO(b/70046217) remove the above requirement + "core/java/**/*.aidl", + "graphics/java/**/*.aidl", + "keystore/java/**/*.aidl", + "location/java/**/*.aidl", + "lowpan/java/**/*.aidl", + "media/java/**/*.aidl", + "packages/services/PacProcessor/**/*.aidl", + "packages/services/Proxy/**/*.aidl", + "telecomm/java/**/*.aidl", + "telephony/java/**/*.aidl", + "wifi/java/**/*.aidl", + + // aidl from external directories + ":dumpstate_aidl", + ":gatekeeper_aidl", + ":gsiservice_aidl", + ":incidentcompanion_aidl", + ":installd_aidl", + ":keystore_aidl", + ":libaudioclient_aidl", + ":libbinder_aidl", + ":libbluetooth-binder-aidl", + ":libcamera_client_aidl", + ":libcamera_client_framework_aidl", + ":libupdate_engine_aidl", + ":storaged_aidl", + ":vold_aidl", + + // etc. + "core/java/**/*.logtags", + ":framework-javastream-protos", + ":framework-statslog-gen", +] + +framework_aidl_local_include_dirs = [ + "core/java", + "drm/java", + "graphics/java", + "keystore/java", + "location/java", + "lowpan/java", + "media/java", + "media/apex/java", + "media/mca/effect/java", + "media/mca/filterfw/java", + "media/mca/filterpacks/java", + "opengl/java", + "rs/java", + "sax/java", + "telecomm/java", + "telephony/java", + "wifi/java", +] + +framework_aidl_external_include_dirs = [ + "frameworks/av/camera/aidl", + "frameworks/av/media/libaudioclient/aidl", + "frameworks/native/aidl/binder", + "frameworks/native/aidl/gui", + "frameworks/native/cmds/dumpstate/binder", + "frameworks/native/libs/incidentcompanion/binder", + "system/bt/binder", + "system/core/gatekeeperd/binder", + "system/core/storaged/binder", + "system/gsid/aidl", + "system/security/keystore/binder", + "system/update_engine/binder_bindings", + "system/vold/binder", +] + java_defaults { name: "framework-aidl-export-defaults", aidl: { - export_include_dirs: [ - // From build/make/core/pathmap.mk FRAMEWORK_BASE_SUBDIRS - "core/java", - "graphics/java", - "location/java", - "lowpan/java", - "media/java", - "media/apex/java", - "media/mca/effect/java", - "media/mca/filterfw/java", - "media/mca/filterpacks/java", - "drm/java", - "opengl/java", - "sax/java", - "telecomm/java", - "telephony/java", - "wifi/java", - "keystore/java", - "rs/java", - ], + export_include_dirs: framework_aidl_local_include_dirs, }, } @@ -57,691 +132,11 @@ java_defaults { defaults: ["framework-aidl-export-defaults"], installable: true, - srcs: [ - // From build/make/core/pathmap.mk FRAMEWORK_BASE_SUBDIRS - "core/java/**/*.java", - "graphics/java/**/*.java", - "location/java/**/*.java", - "lowpan/java/**/*.java", - "media/java/**/*.java", - "media/mca/effect/java/**/*.java", - "media/mca/filterfw/java/**/*.java", - "media/mca/filterpacks/java/**/*.java", - "drm/java/**/*.java", - "opengl/java/**/*.java", - "sax/java/**/*.java", - "telecomm/java/**/*.java", - "telephony/java/**/*.java", - "wifi/java/**/*.java", - "keystore/java/**/*.java", - "rs/java/**/*.java", - - ":framework-javastream-protos", - - "core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl", - "core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl", - "core/java/android/accounts/IAccountManager.aidl", - "core/java/android/accounts/IAccountManagerResponse.aidl", - "core/java/android/accounts/IAccountAuthenticator.aidl", - "core/java/android/accounts/IAccountAuthenticatorResponse.aidl", - "core/java/android/app/IActivityController.aidl", - "core/java/android/app/IActivityManager.aidl", - "core/java/android/app/IActivityPendingResult.aidl", - "core/java/android/app/IActivityTaskManager.aidl", - "core/java/android/app/IAlarmCompleteListener.aidl", - "core/java/android/app/IAlarmListener.aidl", - "core/java/android/app/IAlarmManager.aidl", - "core/java/android/app/IAppTask.aidl", - "core/java/android/app/IApplicationThread.aidl", - "core/java/android/app/IAssistDataReceiver.aidl", - "core/java/android/app/ITaskStackListener.aidl", - "core/java/android/app/IBackupAgent.aidl", - "core/java/android/app/IEphemeralResolver.aidl", - "core/java/android/app/IInstantAppResolver.aidl", - "core/java/android/app/IInstrumentationWatcher.aidl", - "core/java/android/app/INotificationManager.aidl", - "core/java/android/app/IProcessObserver.aidl", - "core/java/android/app/IRequestFinishCallback.aidl", - "core/java/android/app/ISearchManager.aidl", - "core/java/android/app/ISearchManagerCallback.aidl", - "core/java/android/app/IServiceConnection.aidl", - "core/java/android/app/IStopUserCallback.aidl", - "core/java/android/app/ITransientNotification.aidl", - "core/java/android/app/IUidObserver.aidl", - "core/java/android/app/IUiAutomationConnection.aidl", - "core/java/android/app/IUiModeManager.aidl", - "core/java/android/app/IUriGrantsManager.aidl", - "core/java/android/app/IUserSwitchObserver.aidl", - "core/java/android/app/IWallpaperManager.aidl", - "core/java/android/app/IWallpaperManagerCallback.aidl", - "core/java/android/app/admin/IDeviceAdminService.aidl", - "core/java/android/app/admin/IDevicePolicyManager.aidl", - "core/java/android/app/admin/StartInstallingUpdateCallback.aidl", - "core/java/android/app/trust/IStrongAuthTracker.aidl", - "core/java/android/app/trust/ITrustManager.aidl", - "core/java/android/app/trust/ITrustListener.aidl", - "core/java/android/app/backup/IBackupCallback.aidl", - "core/java/android/app/backup/IBackupManager.aidl", - "core/java/android/app/backup/IBackupObserver.aidl", - "core/java/android/app/backup/IBackupManagerMonitor.aidl", - "core/java/android/app/backup/IFullBackupRestoreObserver.aidl", - "core/java/android/app/backup/IRestoreObserver.aidl", - "core/java/android/app/backup/IRestoreSession.aidl", - "core/java/android/app/backup/ISelectBackupTransportCallback.aidl", - "core/java/android/app/contentsuggestions/IClassificationsCallback.aidl", - "core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl", - "core/java/android/app/contentsuggestions/ISelectionsCallback.aidl", - "core/java/android/app/prediction/IPredictionCallback.aidl", - "core/java/android/app/prediction/IPredictionManager.aidl", - "core/java/android/app/role/IOnRoleHoldersChangedListener.aidl", - "core/java/android/app/role/IRoleController.aidl", - "core/java/android/app/role/IRoleManager.aidl", - "core/java/android/app/slice/ISliceManager.aidl", - "core/java/android/app/slice/ISliceListener.aidl", - "core/java/android/app/timedetector/ITimeDetectorService.aidl", - "core/java/android/app/timezone/ICallback.aidl", - "core/java/android/app/timezone/IRulesManager.aidl", - "core/java/android/app/usage/ICacheQuotaService.aidl", - "core/java/android/app/usage/IStorageStatsManager.aidl", - "core/java/android/app/usage/IUsageStatsManager.aidl", - ":libbluetooth-binder-aidl", - "core/java/android/content/IClipboard.aidl", - "core/java/android/content/IContentService.aidl", - "core/java/android/content/IIntentReceiver.aidl", - "core/java/android/content/IIntentSender.aidl", - "core/java/android/content/IOnPrimaryClipChangedListener.aidl", - "core/java/android/content/IRestrictionsManager.aidl", - "core/java/android/content/ISyncAdapter.aidl", - "core/java/android/content/ISyncAdapterUnsyncableAccountCallback.aidl", - "core/java/android/content/ISyncContext.aidl", - "core/java/android/content/ISyncServiceAdapter.aidl", - "core/java/android/content/ISyncStatusObserver.aidl", - "core/java/android/content/om/IOverlayManager.aidl", - "core/java/android/content/pm/ICrossProfileApps.aidl", - "core/java/android/content/pm/IDexModuleRegisterCallback.aidl", - "core/java/android/content/pm/ILauncherApps.aidl", - "core/java/android/content/pm/IOnAppsChangedListener.aidl", - "core/java/android/content/pm/IOtaDexopt.aidl", - "core/java/android/content/pm/IPackageDataObserver.aidl", - "core/java/android/content/pm/IPackageDeleteObserver.aidl", - "core/java/android/content/pm/IPackageDeleteObserver2.aidl", - "core/java/android/content/pm/IPackageInstallObserver2.aidl", - "core/java/android/content/pm/IPackageInstaller.aidl", - "core/java/android/content/pm/IPackageInstallerCallback.aidl", - "core/java/android/content/pm/IPackageInstallerSession.aidl", - "core/java/android/content/pm/IPackageManager.aidl", - ":libbinder_aidl", - "core/java/android/content/pm/IPackageMoveObserver.aidl", - "core/java/android/content/pm/IPackageStatsObserver.aidl", - "core/java/android/content/pm/IPinItemRequest.aidl", - "core/java/android/content/pm/IShortcutService.aidl", - "core/java/android/content/pm/dex/IArtManager.aidl", - "core/java/android/content/pm/dex/ISnapshotRuntimeProfileCallback.aidl", - "core/java/android/content/pm/permission/IRuntimePermissionPresenter.aidl", - "core/java/android/content/rollback/IRollbackManager.aidl", - "core/java/android/database/IContentObserver.aidl", - "core/java/android/debug/IAdbManager.aidl", - "core/java/android/debug/IAdbTransport.aidl", - ":libcamera_client_aidl", - ":libcamera_client_framework_aidl", - "core/java/android/hardware/IConsumerIrService.aidl", - "core/java/android/hardware/ISerialManager.aidl", - "core/java/android/hardware/biometrics/IBiometricConfirmDeviceCredentialCallback.aidl", - "core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl", - "core/java/android/hardware/biometrics/IBiometricService.aidl", - "core/java/android/hardware/biometrics/IBiometricServiceReceiver.aidl", - "core/java/android/hardware/biometrics/IBiometricServiceReceiverInternal.aidl", - "core/java/android/hardware/biometrics/IBiometricServiceLockoutResetCallback.aidl", - "core/java/android/hardware/display/IColorDisplayManager.aidl", - "core/java/android/hardware/display/IDisplayManager.aidl", - "core/java/android/hardware/display/IDisplayManagerCallback.aidl", - "core/java/android/hardware/display/IVirtualDisplayCallback.aidl", - "core/java/android/hardware/fingerprint/IFingerprintClientActiveCallback.aidl", - "core/java/android/hardware/face/IFaceService.aidl", - "core/java/android/hardware/face/IFaceServiceReceiver.aidl", - "core/java/android/hardware/fingerprint/IFingerprintService.aidl", - "core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl", - "core/java/android/hardware/hdmi/IHdmiControlCallback.aidl", - "core/java/android/hardware/hdmi/IHdmiControlService.aidl", - "core/java/android/hardware/hdmi/IHdmiDeviceEventListener.aidl", - "core/java/android/hardware/hdmi/IHdmiHotplugEventListener.aidl", - "core/java/android/hardware/hdmi/IHdmiInputChangeListener.aidl", - "core/java/android/hardware/hdmi/IHdmiMhlVendorCommandListener.aidl", - "core/java/android/hardware/hdmi/IHdmiRecordListener.aidl", - "core/java/android/hardware/hdmi/IHdmiSystemAudioModeChangeListener.aidl", - "core/java/android/hardware/hdmi/IHdmiVendorCommandListener.aidl", - "core/java/android/hardware/input/IInputManager.aidl", - "core/java/android/hardware/input/IInputDevicesChangedListener.aidl", - "core/java/android/hardware/input/ITabletModeChangedListener.aidl", - "core/java/android/hardware/iris/IIrisService.aidl", - "core/java/android/hardware/location/IActivityRecognitionHardware.aidl", - "core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl", - "core/java/android/hardware/location/IActivityRecognitionHardwareSink.aidl", - "core/java/android/hardware/location/IActivityRecognitionHardwareWatcher.aidl", - "core/java/android/hardware/location/IGeofenceHardware.aidl", - "core/java/android/hardware/location/IGeofenceHardwareCallback.aidl", - "core/java/android/hardware/location/IGeofenceHardwareMonitorCallback.aidl", - "core/java/android/hardware/location/IContextHubCallback.aidl", - "core/java/android/hardware/location/IContextHubClient.aidl", - "core/java/android/hardware/location/IContextHubClientCallback.aidl", - "core/java/android/hardware/location/IContextHubService.aidl", - "core/java/android/hardware/location/IContextHubTransactionCallback.aidl", - "core/java/android/hardware/radio/IAnnouncementListener.aidl", - "core/java/android/hardware/radio/ICloseHandle.aidl", - "core/java/android/hardware/radio/IRadioService.aidl", - "core/java/android/hardware/radio/ITuner.aidl", - "core/java/android/hardware/radio/ITunerCallback.aidl", - "core/java/android/hardware/soundtrigger/IRecognitionStatusCallback.aidl", - "core/java/android/hardware/usb/IUsbManager.aidl", - "core/java/android/hardware/usb/IUsbSerialReader.aidl", - "core/java/android/net/ICaptivePortal.aidl", - "core/java/android/net/IConnectivityManager.aidl", - "core/java/android/hardware/ISensorPrivacyListener.aidl", - "core/java/android/hardware/ISensorPrivacyManager.aidl", - "core/java/android/net/IIpConnectivityMetrics.aidl", - "core/java/android/net/IEthernetManager.aidl", - "core/java/android/net/IEthernetServiceListener.aidl", - "core/java/android/net/INetdEventCallback.aidl", - "core/java/android/net/IIpSecService.aidl", - "core/java/android/net/INetworkManagementEventObserver.aidl", - "core/java/android/net/INetworkPolicyListener.aidl", - "core/java/android/net/INetworkPolicyManager.aidl", - "core/java/android/net/INetworkRecommendationProvider.aidl", - "core/java/android/net/INetworkScoreCache.aidl", - "core/java/android/net/INetworkScoreService.aidl", - "core/java/android/net/INetworkStatsService.aidl", - "core/java/android/net/INetworkStatsSession.aidl", - "core/java/android/net/ISocketKeepaliveCallback.aidl", - "core/java/android/net/ITestNetworkManager.aidl", - "core/java/android/net/ITetheringEventCallback.aidl", - "core/java/android/net/ITetheringStatsProvider.aidl", - "core/java/android/net/nsd/INsdManager.aidl", - "core/java/android/nfc/IAppCallback.aidl", - "core/java/android/nfc/INfcAdapter.aidl", - "core/java/android/nfc/INfcAdapterExtras.aidl", - "core/java/android/nfc/INfcTag.aidl", - "core/java/android/nfc/INfcCardEmulation.aidl", - "core/java/android/nfc/INfcFCardEmulation.aidl", - "core/java/android/nfc/INfcUnlockHandler.aidl", - "core/java/android/nfc/INfcDta.aidl", - "core/java/android/nfc/ITagRemovedCallback.aidl", - "core/java/android/se/omapi/ISecureElementService.aidl", - "core/java/android/se/omapi/ISecureElementListener.aidl", - "core/java/android/se/omapi/ISecureElementChannel.aidl", - "core/java/android/se/omapi/ISecureElementReader.aidl", - "core/java/android/se/omapi/ISecureElementSession.aidl", - "core/java/android/os/IBatteryPropertiesRegistrar.aidl", - "core/java/android/os/ICancellationSignal.aidl", - "core/java/android/os/IDeviceIdentifiersPolicyService.aidl", - "core/java/android/os/IDeviceIdleController.aidl", - "core/java/android/os/IHardwarePropertiesManager.aidl", - ":libincident_aidl", - "core/java/android/os/IMaintenanceActivityListener.aidl", - "core/java/android/os/IMessenger.aidl", - "core/java/android/os/INetworkActivityListener.aidl", - "core/java/android/os/INetworkManagementService.aidl", - "core/java/android/os/IPermissionController.aidl", - "core/java/android/os/IProcessInfoService.aidl", - "core/java/android/os/IProgressListener.aidl", - "core/java/android/os/IPowerManager.aidl", - "core/java/android/os/IRecoverySystem.aidl", - "core/java/android/os/IRecoverySystemProgressListener.aidl", - "core/java/android/os/IRemoteCallback.aidl", - "core/java/android/os/ISchedulingPolicyService.aidl", - ":statsd_aidl", - "core/java/android/os/ISystemUpdateManager.aidl", - "core/java/android/os/IThermalEventListener.aidl", - "core/java/android/os/IThermalStatusListener.aidl", - "core/java/android/os/IThermalService.aidl", - "core/java/android/os/IUpdateLock.aidl", - "core/java/android/os/IUserManager.aidl", - ":libvibrator_aidl", - "core/java/android/os/IVibratorService.aidl", - "core/java/android/os/image/IDynamicSystemService.aidl", - "core/java/android/os/storage/IStorageManager.aidl", - "core/java/android/os/storage/IStorageEventListener.aidl", - "core/java/android/os/storage/IStorageShutdownObserver.aidl", - "core/java/android/os/storage/IObbActionListener.aidl", - "core/java/android/permission/IOnPermissionsChangeListener.aidl", - "core/java/android/permission/IPermissionController.aidl", - "core/java/android/permission/IPermissionManager.aidl", - ":keystore_aidl", - "core/java/android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl", - "core/java/android/service/appprediction/IPredictionService.aidl", - "core/java/android/service/autofill/augmented/IAugmentedAutofillService.aidl", - "core/java/android/service/autofill/augmented/IFillCallback.aidl", - "core/java/android/service/autofill/IAutoFillService.aidl", - "core/java/android/service/autofill/IAutofillFieldClassificationService.aidl", - "core/java/android/service/autofill/IFillCallback.aidl", - "core/java/android/service/autofill/ISaveCallback.aidl", - "core/java/android/service/carrier/ICarrierService.aidl", - "core/java/android/service/carrier/ICarrierMessagingCallback.aidl", - "core/java/android/service/carrier/ICarrierMessagingService.aidl", - "core/java/android/service/carrier/ICarrierMessagingClientService.aidl", - "core/java/android/service/contentsuggestions/IContentSuggestionsService.aidl", - "core/java/android/service/euicc/IDeleteSubscriptionCallback.aidl", - "core/java/android/service/euicc/IDownloadSubscriptionCallback.aidl", - "core/java/android/service/euicc/IEraseSubscriptionsCallback.aidl", - "core/java/android/service/euicc/IEuiccService.aidl", - "core/java/android/service/euicc/IGetDefaultDownloadableSubscriptionListCallback.aidl", - "core/java/android/service/euicc/IGetDownloadableSubscriptionMetadataCallback.aidl", - "core/java/android/service/euicc/IGetEidCallback.aidl", - "core/java/android/service/euicc/IGetEuiccInfoCallback.aidl", - "core/java/android/service/euicc/IGetEuiccProfileInfoListCallback.aidl", - "core/java/android/service/euicc/IGetOtaStatusCallback.aidl", - "core/java/android/service/euicc/IOtaStatusChangedCallback.aidl", - "core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl", - "core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl", - "core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl", - ":gatekeeper_aidl", - "core/java/android/service/contentcapture/IContentCaptureService.aidl", - "core/java/android/service/contentcapture/IContentCaptureServiceCallback.aidl", - "core/java/android/service/notification/INotificationListener.aidl", - "core/java/android/service/notification/IStatusBarNotificationHolder.aidl", - "core/java/android/service/notification/IConditionListener.aidl", - "core/java/android/service/notification/IConditionProvider.aidl", - "core/java/android/service/settings/suggestions/ISuggestionService.aidl", - "core/java/android/service/sms/IFinancialSmsService.aidl", - "core/java/android/service/vr/IPersistentVrStateCallbacks.aidl", - "core/java/android/service/vr/IVrListener.aidl", - "core/java/android/service/vr/IVrManager.aidl", - "core/java/android/service/vr/IVrStateCallbacks.aidl", - "core/java/android/service/watchdog/IExplicitHealthCheckService.aidl", - "core/java/android/service/watchdog/PackageConfig.aidl", - "core/java/android/print/ILayoutResultCallback.aidl", - "core/java/android/print/IPrinterDiscoveryObserver.aidl", - "core/java/android/print/IPrintDocumentAdapter.aidl", - "core/java/android/print/IPrintDocumentAdapterObserver.aidl", - "core/java/android/print/IPrintJobStateChangeListener.aidl", - "core/java/android/print/IPrintServicesChangeListener.aidl", - "core/java/android/printservice/recommendation/IRecommendationsChangeListener.aidl", - "core/java/android/print/IPrintManager.aidl", - "core/java/android/print/IPrintSpooler.aidl", - "core/java/android/print/IPrintSpoolerCallbacks.aidl", - "core/java/android/print/IPrintSpoolerClient.aidl", - "core/java/android/printservice/recommendation/IRecommendationServiceCallbacks.aidl", - "core/java/android/printservice/recommendation/IRecommendationService.aidl", - "core/java/android/print/IWriteResultCallback.aidl", - "core/java/android/printservice/IPrintService.aidl", - "core/java/android/printservice/IPrintServiceClient.aidl", - "core/java/android/companion/ICompanionDeviceManager.aidl", - "core/java/android/companion/ICompanionDeviceDiscoveryService.aidl", - "core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl", - "core/java/android/companion/IFindDeviceCallback.aidl", - "core/java/android/service/dreams/IDreamManager.aidl", - "core/java/android/service/dreams/IDreamService.aidl", - "core/java/android/service/oemlock/IOemLockService.aidl", - "core/java/android/service/persistentdata/IPersistentDataBlockService.aidl", - "core/java/android/service/trust/ITrustAgentService.aidl", - "core/java/android/service/trust/ITrustAgentServiceCallback.aidl", - "core/java/android/service/voice/IVoiceInteractionService.aidl", - "core/java/android/service/voice/IVoiceInteractionSession.aidl", - "core/java/android/service/voice/IVoiceInteractionSessionService.aidl", - "core/java/android/service/wallpaper/IWallpaperConnection.aidl", - "core/java/android/service/wallpaper/IWallpaperEngine.aidl", - "core/java/android/service/wallpaper/IWallpaperService.aidl", - "core/java/android/service/chooser/IChooserTargetService.aidl", - "core/java/android/service/chooser/IChooserTargetResult.aidl", - "core/java/android/service/resolver/IResolverRankerService.aidl", - "core/java/android/service/resolver/IResolverRankerResult.aidl", - "core/java/android/service/textclassifier/ITextClassifierCallback.aidl", - "core/java/android/service/textclassifier/ITextClassifierService.aidl", - "core/java/android/service/attention/IAttentionService.aidl", - "core/java/android/service/attention/IAttentionCallback.aidl", - "core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl", - "core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl", - "core/java/android/view/accessibility/IAccessibilityManager.aidl", - "core/java/android/view/accessibility/IAccessibilityManagerClient.aidl", - "core/java/android/view/autofill/IAutoFillManager.aidl", - "core/java/android/view/autofill/IAutoFillManagerClient.aidl", - "core/java/android/view/autofill/IAugmentedAutofillManagerClient.aidl", - "core/java/android/view/autofill/IAutofillWindowPresenter.aidl", - "core/java/android/view/contentcapture/IContentCaptureDirectManager.aidl", - "core/java/android/view/contentcapture/IContentCaptureManager.aidl", - "core/java/android/view/IApplicationToken.aidl", - "core/java/android/view/IAppTransitionAnimationSpecsFuture.aidl", - "core/java/android/view/IDockedStackListener.aidl", - "core/java/android/view/IDisplayFoldListener.aidl", - "core/java/android/view/IGraphicsStats.aidl", - "core/java/android/view/IGraphicsStatsCallback.aidl", - "core/java/android/view/IInputMonitorHost.aidl", - "core/java/android/view/IInputFilter.aidl", - "core/java/android/view/IInputFilterHost.aidl", - "core/java/android/view/IOnKeyguardExitResult.aidl", - "core/java/android/view/IPinnedStackController.aidl", - "core/java/android/view/IPinnedStackListener.aidl", - "core/java/android/view/IRemoteAnimationRunner.aidl", - "core/java/android/view/IRecentsAnimationController.aidl", - "core/java/android/view/IRecentsAnimationRunner.aidl", - "core/java/android/view/IRemoteAnimationFinishedCallback.aidl", - "core/java/android/view/IRotationWatcher.aidl", - "core/java/android/view/ISystemGestureExclusionListener.aidl", - "core/java/android/view/IWallpaperVisibilityListener.aidl", - "core/java/android/view/IWindow.aidl", - "core/java/android/view/IWindowFocusObserver.aidl", - "core/java/android/view/IWindowId.aidl", - "core/java/android/view/IWindowManager.aidl", - "core/java/android/view/IWindowSession.aidl", - "core/java/android/view/IWindowSessionCallback.aidl", - "core/java/android/webkit/IWebViewUpdateService.aidl", - "core/java/android/speech/IRecognitionListener.aidl", - "core/java/android/speech/IRecognitionService.aidl", - "core/java/android/speech/tts/ITextToSpeechCallback.aidl", - "core/java/android/speech/tts/ITextToSpeechService.aidl", - "core/java/com/android/internal/app/IAppOpsActiveCallback.aidl", - "core/java/com/android/internal/app/IAppOpsCallback.aidl", - "core/java/com/android/internal/app/IAppOpsNotedCallback.aidl", - "core/java/com/android/internal/app/IAppOpsService.aidl", - "core/java/com/android/internal/app/IBatteryStats.aidl", - "core/java/com/android/internal/app/ISoundTriggerService.aidl", - "core/java/com/android/internal/app/IVoiceActionCheckCallback.aidl", - "core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl", - "core/java/com/android/internal/app/IVoiceInteractionSessionListener.aidl", - "core/java/com/android/internal/app/IVoiceInteractionSessionShowCallback.aidl", - "core/java/com/android/internal/app/IVoiceInteractor.aidl", - "core/java/com/android/internal/app/IVoiceInteractorCallback.aidl", - "core/java/com/android/internal/app/IVoiceInteractorRequest.aidl", - "core/java/com/android/internal/app/IMediaContainerService.aidl", - "core/java/com/android/internal/app/procstats/IProcessStats.aidl", - "core/java/com/android/internal/appwidget/IAppWidgetService.aidl", - "core/java/com/android/internal/appwidget/IAppWidgetHost.aidl", - "core/java/com/android/internal/backup/IBackupTransport.aidl", - "core/java/com/android/internal/backup/IObbBackupService.aidl", - "core/java/com/android/internal/infra/IAndroidFuture.aidl", - "core/java/com/android/internal/inputmethod/IInputContentUriToken.aidl", - "core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl", - "core/java/com/android/internal/inputmethod/IMultiClientInputMethod.aidl", - "core/java/com/android/internal/inputmethod/IMultiClientInputMethodPrivilegedOperations.aidl", - "core/java/com/android/internal/inputmethod/IMultiClientInputMethodSession.aidl", - "core/java/com/android/internal/net/INetworkWatchlistManager.aidl", - "core/java/com/android/internal/policy/IKeyguardDrawnCallback.aidl", - "core/java/com/android/internal/policy/IKeyguardDismissCallback.aidl", - "core/java/com/android/internal/policy/IKeyguardExitCallback.aidl", - "core/java/com/android/internal/policy/IKeyguardService.aidl", - "core/java/com/android/internal/policy/IKeyguardStateCallback.aidl", - "core/java/com/android/internal/policy/IShortcutService.aidl", - "core/java/com/android/internal/os/IDropBoxManagerService.aidl", - "core/java/com/android/internal/os/IParcelFileDescriptorFactory.aidl", - "core/java/com/android/internal/os/IResultReceiver.aidl", - "core/java/com/android/internal/os/IShellCallback.aidl", - "core/java/com/android/internal/statusbar/IStatusBar.aidl", - "core/java/com/android/internal/statusbar/IStatusBarService.aidl", - "core/java/com/android/internal/statusbar/RegisterStatusBarResult.aidl", - "core/java/com/android/internal/textservice/ISpellCheckerService.aidl", - "core/java/com/android/internal/textservice/ISpellCheckerServiceCallback.aidl", - "core/java/com/android/internal/textservice/ISpellCheckerSession.aidl", - "core/java/com/android/internal/textservice/ISpellCheckerSessionListener.aidl", - "core/java/com/android/internal/textservice/ITextServicesManager.aidl", - "core/java/com/android/internal/textservice/ITextServicesSessionListener.aidl", - "core/java/com/android/internal/view/IDragAndDropPermissions.aidl", - "core/java/com/android/internal/view/IInputContext.aidl", - "core/java/com/android/internal/view/IInputContextCallback.aidl", - "core/java/com/android/internal/view/IInputMethod.aidl", - "core/java/com/android/internal/view/IInputMethodClient.aidl", - "core/java/com/android/internal/view/IInputMethodManager.aidl", - "core/java/com/android/internal/view/IInputMethodSession.aidl", - "core/java/com/android/internal/view/IInputSessionCallback.aidl", - "core/java/com/android/internal/widget/ICheckCredentialProgressCallback.aidl", - "core/java/com/android/internal/widget/ILockSettings.aidl", - "core/java/com/android/internal/widget/IRemoteViewsFactory.aidl", - "keystore/java/android/security/IKeyChainAliasCallback.aidl", - "keystore/java/android/security/IKeyChainService.aidl", - "location/java/android/location/IBatchedLocationCallback.aidl", - "location/java/android/location/ICountryDetector.aidl", - "location/java/android/location/ICountryListener.aidl", - "location/java/android/location/IGeocodeProvider.aidl", - "location/java/android/location/IGeofenceProvider.aidl", - "location/java/android/location/IGnssStatusListener.aidl", - "location/java/android/location/IGnssMeasurementsListener.aidl", - "location/java/android/location/IGnssNavigationMessageListener.aidl", - "location/java/android/location/ILocationListener.aidl", - "location/java/android/location/ILocationManager.aidl", - "location/java/android/location/IFusedGeofenceHardware.aidl", - "location/java/android/location/IGpsGeofenceHardware.aidl", - "location/java/android/location/INetInitiatedListener.aidl", - "location/java/com/android/internal/location/ILocationProvider.aidl", - "location/java/com/android/internal/location/ILocationProviderManager.aidl", - "media/java/android/media/IAudioFocusDispatcher.aidl", - "media/java/android/media/IAudioRoutesObserver.aidl", - "media/java/android/media/IAudioService.aidl", - "media/java/android/media/IAudioServerStateDispatcher.aidl", - "media/java/android/media/IMediaHTTPConnection.aidl", - "media/java/android/media/IMediaHTTPService.aidl", - "media/java/android/media/IMediaResourceMonitor.aidl", - "media/java/android/media/IMediaRoute2Provider.aidl", - "media/java/android/media/IMediaRoute2ProviderClient.aidl", - "media/java/android/media/IMediaRouter2Client.aidl", - "media/java/android/media/IMediaRouter2Manager.aidl", - "media/java/android/media/IMediaRouterClient.aidl", - "media/java/android/media/IMediaRouterService.aidl", - "media/java/android/media/IMediaScannerListener.aidl", - "media/java/android/media/IMediaScannerService.aidl", - "media/java/android/media/IPlaybackConfigDispatcher.aidl", - ":libaudioclient_aidl", - "media/java/android/media/IRecordingConfigDispatcher.aidl", - "media/java/android/media/IRemoteDisplayCallback.aidl", - "media/java/android/media/IRemoteDisplayProvider.aidl", - "media/java/android/media/IRemoteVolumeController.aidl", - "media/java/android/media/IRemoteVolumeObserver.aidl", - "media/java/android/media/IRingtonePlayer.aidl", - "media/java/android/media/IVolumeController.aidl", - "media/java/android/media/audiopolicy/IAudioPolicyCallback.aidl", - "media/java/android/media/midi/IBluetoothMidiService.aidl", - "media/java/android/media/midi/IMidiDeviceListener.aidl", - "media/java/android/media/midi/IMidiDeviceOpenCallback.aidl", - "media/java/android/media/midi/IMidiDeviceServer.aidl", - "media/java/android/media/midi/IMidiManager.aidl", - "media/java/android/media/projection/IMediaProjection.aidl", - "media/java/android/media/projection/IMediaProjectionCallback.aidl", - "media/java/android/media/projection/IMediaProjectionManager.aidl", - "media/java/android/media/projection/IMediaProjectionWatcherCallback.aidl", - "media/java/android/media/session/IActiveSessionsListener.aidl", - "media/java/android/media/session/ICallback.aidl", - "media/java/android/media/session/IOnMediaKeyListener.aidl", - "media/java/android/media/session/IOnVolumeKeyLongPressListener.aidl", - "media/java/android/media/session/ISession.aidl", - "media/java/android/media/session/ISession2TokensListener.aidl", - "media/java/android/media/session/ISessionCallback.aidl", - "media/java/android/media/session/ISessionController.aidl", - "media/java/android/media/session/ISessionControllerCallback.aidl", - "media/java/android/media/session/ISessionManager.aidl", - "media/java/android/media/soundtrigger/ISoundTriggerDetectionService.aidl", - "media/java/android/media/soundtrigger/ISoundTriggerDetectionServiceClient.aidl", - "media/java/android/media/tv/ITvInputClient.aidl", - "media/java/android/media/tv/ITvInputHardware.aidl", - "media/java/android/media/tv/ITvInputHardwareCallback.aidl", - "media/java/android/media/tv/ITvInputManager.aidl", - "media/java/android/media/tv/ITvInputManagerCallback.aidl", - "media/java/android/media/tv/ITvInputService.aidl", - "media/java/android/media/tv/ITvInputServiceCallback.aidl", - "media/java/android/media/tv/ITvInputSession.aidl", - "media/java/android/media/tv/ITvInputSessionCallback.aidl", - "media/java/android/media/tv/ITvRemoteProvider.aidl", - "media/java/android/media/tv/ITvRemoteServiceInput.aidl", - "media/java/android/service/media/IMediaBrowserService.aidl", - "media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl", - "telecomm/java/com/android/internal/telecom/ICallRedirectionAdapter.aidl", - "telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl", - "telecomm/java/com/android/internal/telecom/ICallScreeningAdapter.aidl", - "telecomm/java/com/android/internal/telecom/ICallScreeningService.aidl", - "telecomm/java/com/android/internal/telecom/IVideoCallback.aidl", - "telecomm/java/com/android/internal/telecom/IVideoProvider.aidl", - "telecomm/java/com/android/internal/telecom/IConnectionService.aidl", - "telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl", - "telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl", - "telecomm/java/com/android/internal/telecom/IInCallService.aidl", - "telecomm/java/com/android/internal/telecom/IPhoneAccountSuggestionCallback.aidl", - "telecomm/java/com/android/internal/telecom/IPhoneAccountSuggestionService.aidl", - "telecomm/java/com/android/internal/telecom/ITelecomService.aidl", - "telecomm/java/com/android/internal/telecom/RemoteServiceCallback.aidl", - "telephony/java/android/telephony/data/IDataService.aidl", - "telephony/java/android/telephony/data/IDataServiceCallback.aidl", - "telephony/java/android/telephony/data/IQualifiedNetworksService.aidl", - "telephony/java/android/telephony/data/IQualifiedNetworksServiceCallback.aidl", - "telephony/java/android/telephony/ims/aidl/IImsCallSessionListener.aidl", - "telephony/java/android/telephony/ims/aidl/IImsCapabilityCallback.aidl", - "telephony/java/android/telephony/ims/aidl/IImsConfig.aidl", - "telephony/java/android/telephony/ims/aidl/IImsConfigCallback.aidl", - "telephony/java/android/telephony/ims/aidl/IImsMmTelFeature.aidl", - "telephony/java/android/telephony/ims/aidl/IImsMmTelListener.aidl", - "telephony/java/android/telephony/ims/aidl/IImsRegistration.aidl", - "telephony/java/android/telephony/ims/aidl/IImsRegistrationCallback.aidl", - "telephony/java/android/telephony/ims/aidl/IImsRcsFeature.aidl", - "telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl", - "telephony/java/android/telephony/ims/aidl/IImsServiceControllerListener.aidl", - "telephony/java/android/telephony/ims/aidl/IImsSmsListener.aidl", - "telephony/java/android/telephony/ims/aidl/IRcsMessage.aidl", - "telephony/java/android/telephony/ims/aidl/IRcsFeatureListener.aidl", - "telephony/java/android/telephony/mbms/IMbmsDownloadSessionCallback.aidl", - "telephony/java/android/telephony/mbms/IMbmsStreamingSessionCallback.aidl", - "telephony/java/android/telephony/mbms/IMbmsGroupCallSessionCallback.aidl", - "telephony/java/android/telephony/mbms/IDownloadStatusListener.aidl", - "telephony/java/android/telephony/mbms/IDownloadProgressListener.aidl", - "telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl", - "telephony/java/android/telephony/mbms/IGroupCallCallback.aidl", - "telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl", - "telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl", - "telephony/java/android/telephony/mbms/vendor/IMbmsGroupCallService.aidl", - "telephony/java/android/telephony/ICellInfoCallback.aidl", - "telephony/java/android/telephony/IFinancialSmsCallback.aidl", - "telephony/java/android/telephony/INetworkService.aidl", - "telephony/java/android/telephony/INetworkServiceCallback.aidl", - "telephony/java/com/android/ims/internal/IImsCallSession.aidl", - "telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl", - "telephony/java/com/android/ims/internal/IImsConfig.aidl", - "telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl", - "telephony/java/com/android/ims/internal/IImsEcbm.aidl", - "telephony/java/com/android/ims/internal/IImsEcbmListener.aidl", - "telephony/java/com/android/ims/internal/IImsExternalCallStateListener.aidl", - "telephony/java/com/android/ims/internal/IImsFeatureStatusCallback.aidl", - "telephony/java/com/android/ims/internal/IImsMMTelFeature.aidl", - "telephony/java/com/android/ims/internal/IImsMultiEndpoint.aidl", - "telephony/java/com/android/ims/internal/IImsRcsFeature.aidl", - "telephony/java/com/android/ims/internal/IImsService.aidl", - "telephony/java/com/android/ims/internal/IImsServiceController.aidl", - "telephony/java/com/android/ims/internal/IImsServiceFeatureCallback.aidl", - "telephony/java/com/android/ims/internal/IImsStreamMediaSession.aidl", - "telephony/java/com/android/ims/internal/IImsUt.aidl", - "telephony/java/com/android/ims/internal/IImsUtListener.aidl", - "telephony/java/com/android/ims/internal/IImsVideoCallCallback.aidl", - "telephony/java/com/android/ims/internal/IImsVideoCallProvider.aidl", - "telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl", - "telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl", - "telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl", - "telephony/java/com/android/ims/internal/uce/options/IOptionsListener.aidl", - "telephony/java/com/android/ims/internal/uce/presence/IPresenceService.aidl", - "telephony/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl", - "telephony/java/com/android/ims/ImsConfigListener.aidl", - "telephony/java/com/android/internal/telephony/IApnSourceService.aidl", - "telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl", - "telephony/java/com/android/internal/telephony/IIntegerConsumer.aidl", - "telephony/java/com/android/internal/telephony/IMms.aidl", - "telephony/java/com/android/internal/telephony/INumberVerificationCallback.aidl", - "telephony/java/com/android/internal/telephony/IOnSubscriptionsChangedListener.aidl", - "telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl", - "telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl", - "telephony/java/com/android/internal/telephony/ISetOpportunisticDataCallback.aidl", - "telephony/java/com/android/internal/telephony/ISms.aidl", - "telephony/java/com/android/internal/telephony/ISub.aidl", - "telephony/java/com/android/internal/telephony/IOns.aidl", - "telephony/java/com/android/internal/telephony/ITelephony.aidl", - "telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl", - "telephony/java/com/android/internal/telephony/IUpdateAvailableNetworksCallback.aidl", - "telephony/java/com/android/internal/telephony/IWapPushManager.aidl", - "telephony/java/com/android/internal/telephony/euicc/IAuthenticateServerCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/ICancelSessionCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IDeleteProfileCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IDisableProfileCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IEuiccCardController.aidl", - "telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl", - "telephony/java/com/android/internal/telephony/euicc/IGetAllProfilesCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IGetDefaultSmdpAddressCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IGetEuiccChallengeCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IGetEuiccInfo1Callback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IGetEuiccInfo2Callback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IGetProfileCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IGetRulesAuthTableCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IGetSmdsAddressCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IListNotificationsCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/ILoadBoundProfilePackageCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IPrepareDownloadCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IRemoveNotificationFromListCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IResetMemoryCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IRetrieveNotificationCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/IRetrieveNotificationListCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/ISetDefaultSmdpAddressCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/ISetNicknameCallback.aidl", - "telephony/java/com/android/internal/telephony/euicc/ISwitchToProfileCallback.aidl", - "wifi/java/android/net/wifi/INetworkRequestMatchCallback.aidl", - "wifi/java/android/net/wifi/INetworkRequestUserSelectionCallback.aidl", - "wifi/java/android/net/wifi/ISoftApCallback.aidl", - "wifi/java/android/net/wifi/ITrafficStateCallback.aidl", - "wifi/java/android/net/wifi/IWifiManager.aidl", - "wifi/java/android/net/wifi/IOnWifiUsabilityStatsListener.aidl", - "wifi/java/android/net/wifi/aware/IWifiAwareDiscoverySessionCallback.aidl", - "wifi/java/android/net/wifi/aware/IWifiAwareEventCallback.aidl", - "wifi/java/android/net/wifi/aware/IWifiAwareMacAddressProvider.aidl", - "wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl", - "wifi/java/android/net/wifi/p2p/IWifiP2pManager.aidl", - "wifi/java/android/net/wifi/rtt/IRttCallback.aidl", - "wifi/java/android/net/wifi/rtt/IWifiRttManager.aidl", - "wifi/java/android/net/wifi/hotspot2/IProvisioningCallback.aidl", - "wifi/java/android/net/wifi/IDppCallback.aidl", - "wifi/java/android/net/wifi/IWifiScanner.aidl", - "packages/services/PacProcessor/com/android/net/IProxyService.aidl", - "packages/services/Proxy/com/android/net/IProxyCallback.aidl", - "packages/services/Proxy/com/android/net/IProxyPortListener.aidl", - "core/java/android/service/quicksettings/IQSService.aidl", - "core/java/android/service/quicksettings/IQSTileService.aidl", - - ":libupdate_engine_aidl", - - ":storaged_aidl", - ":vold_aidl", - ":gsiservice_aidl", - ":installd_aidl", - ":dumpstate_aidl", - ":incidentcompanion_aidl", - - "lowpan/java/android/net/lowpan/ILowpanEnergyScanCallback.aidl", - "lowpan/java/android/net/lowpan/ILowpanNetScanCallback.aidl", - "lowpan/java/android/net/lowpan/ILowpanInterfaceListener.aidl", - "lowpan/java/android/net/lowpan/ILowpanInterface.aidl", - "lowpan/java/android/net/lowpan/ILowpanManagerListener.aidl", - "lowpan/java/android/net/lowpan/ILowpanManager.aidl", - - "core/java/android/app/admin/SecurityLogTags.logtags", - "core/java/android/content/EventLogTags.logtags", - "core/java/android/speech/tts/EventLogTags.logtags", - "core/java/android/net/EventLogTags.logtags", - "core/java/android/os/EventLogTags.logtags", - "core/java/android/webkit/EventLogTags.logtags", - "core/java/com/android/internal/app/EventLogTags.logtags", - "core/java/com/android/internal/logging/EventLogTags.logtags", - "core/java/com/android/server/DropboxLogTags.logtags", - "core/java/org/chromium/arc/EventLogTags.logtags", - - ":framework-statslog-gen", - ], + srcs: framework_srcs, aidl: { - include_dirs: [ - "system/update_engine/binder_bindings", - "frameworks/native/aidl/binder", - "frameworks/native/cmds/dumpstate/binder", - "frameworks/native/libs/incidentcompanion/binder", - "frameworks/av/camera/aidl", - "frameworks/av/media/libaudioclient/aidl", - "frameworks/native/aidl/gui", - "frameworks/native/libs/incidentcompanion/binder", - "system/core/gatekeeperd/binder", - "system/core/storaged/binder", - "system/vold/binder", - "system/gsid/aidl", - "system/bt/binder", - "system/security/keystore/binder", - ], - + local_include_dirs: framework_aidl_local_include_dirs, + include_dirs: framework_aidl_external_include_dirs, generate_get_transaction_name: true, }, @@ -1909,7 +1304,9 @@ filegroup { // annotations to private apis aidl_mapping { name: "framework-aidl-mappings", - srcs: [":framework-defaults"], + srcs: framework_srcs, + local_include_dirs: framework_aidl_local_include_dirs, + include_dirs: framework_aidl_external_include_dirs, output: "framework-aidl-mappings.txt", } diff --git a/apex/jobscheduler/service/java/com/android/server/job/GrantedUriPermissions.java b/apex/jobscheduler/service/java/com/android/server/job/GrantedUriPermissions.java index 005b1892f6a6..b7e8cf6e3fc8 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/GrantedUriPermissions.java +++ b/apex/jobscheduler/service/java/com/android/server/job/GrantedUriPermissions.java @@ -16,7 +16,6 @@ package com.android.server.job; -import android.app.IActivityManager; import android.app.UriGrantsManager; import android.content.ClipData; import android.content.ContentProvider; @@ -40,7 +39,7 @@ public final class GrantedUriPermissions { private final IBinder mPermissionOwner; private final ArrayList<Uri> mUris = new ArrayList<>(); - private GrantedUriPermissions(IActivityManager am, int grantFlags, int uid, String tag) + private GrantedUriPermissions(int grantFlags, int uid, String tag) throws RemoteException { mGrantFlags = grantFlags; mSourceUserId = UserHandle.getUserId(uid); @@ -49,7 +48,7 @@ public final class GrantedUriPermissions { .getService(UriGrantsManagerInternal.class).newUriPermissionOwner("job: " + tag); } - public void revoke(IActivityManager am) { + public void revoke() { for (int i = mUris.size()-1; i >= 0; i--) { LocalServices.getService(UriGrantsManagerInternal.class).revokeUriPermissionFromOwner( mPermissionOwner, mUris.get(i), mGrantFlags, mSourceUserId); @@ -62,7 +61,7 @@ public final class GrantedUriPermissions { |Intent.FLAG_GRANT_READ_URI_PERMISSION)) != 0; } - public static GrantedUriPermissions createFromIntent(IActivityManager am, Intent intent, + public static GrantedUriPermissions createFromIntent(Intent intent, int sourceUid, String targetPackage, int targetUserId, String tag) { int grantFlags = intent.getFlags(); if (!checkGrantFlags(grantFlags)) { @@ -73,44 +72,44 @@ public final class GrantedUriPermissions { Uri data = intent.getData(); if (data != null) { - perms = grantUri(am, data, sourceUid, targetPackage, targetUserId, grantFlags, tag, + perms = grantUri(data, sourceUid, targetPackage, targetUserId, grantFlags, tag, perms); } ClipData clip = intent.getClipData(); if (clip != null) { - perms = grantClip(am, clip, sourceUid, targetPackage, targetUserId, grantFlags, tag, + perms = grantClip(clip, sourceUid, targetPackage, targetUserId, grantFlags, tag, perms); } return perms; } - public static GrantedUriPermissions createFromClip(IActivityManager am, ClipData clip, + public static GrantedUriPermissions createFromClip(ClipData clip, int sourceUid, String targetPackage, int targetUserId, int grantFlags, String tag) { if (!checkGrantFlags(grantFlags)) { return null; } GrantedUriPermissions perms = null; if (clip != null) { - perms = grantClip(am, clip, sourceUid, targetPackage, targetUserId, grantFlags, + perms = grantClip(clip, sourceUid, targetPackage, targetUserId, grantFlags, tag, perms); } return perms; } - private static GrantedUriPermissions grantClip(IActivityManager am, ClipData clip, + private static GrantedUriPermissions grantClip(ClipData clip, int sourceUid, String targetPackage, int targetUserId, int grantFlags, String tag, GrantedUriPermissions curPerms) { final int N = clip.getItemCount(); for (int i = 0; i < N; i++) { - curPerms = grantItem(am, clip.getItemAt(i), sourceUid, targetPackage, targetUserId, + curPerms = grantItem(clip.getItemAt(i), sourceUid, targetPackage, targetUserId, grantFlags, tag, curPerms); } return curPerms; } - private static GrantedUriPermissions grantUri(IActivityManager am, Uri uri, + private static GrantedUriPermissions grantUri(Uri uri, int sourceUid, String targetPackage, int targetUserId, int grantFlags, String tag, GrantedUriPermissions curPerms) { try { @@ -118,7 +117,7 @@ public final class GrantedUriPermissions { UserHandle.getUserId(sourceUid)); uri = ContentProvider.getUriWithoutUserId(uri); if (curPerms == null) { - curPerms = new GrantedUriPermissions(am, grantFlags, sourceUid, tag); + curPerms = new GrantedUriPermissions(grantFlags, sourceUid, tag); } UriGrantsManager.getService().grantUriPermissionFromOwner(curPerms.mPermissionOwner, sourceUid, targetPackage, uri, grantFlags, sourceUserId, targetUserId); @@ -129,16 +128,16 @@ public final class GrantedUriPermissions { return curPerms; } - private static GrantedUriPermissions grantItem(IActivityManager am, ClipData.Item item, + private static GrantedUriPermissions grantItem(ClipData.Item item, int sourceUid, String targetPackage, int targetUserId, int grantFlags, String tag, GrantedUriPermissions curPerms) { if (item.getUri() != null) { - curPerms = grantUri(am, item.getUri(), sourceUid, targetPackage, targetUserId, + curPerms = grantUri(item.getUri(), sourceUid, targetPackage, targetUserId, grantFlags, tag, curPerms); } Intent intent = item.getIntent(); if (intent != null && intent.getData() != null) { - curPerms = grantUri(am, intent.getData(), sourceUid, targetPackage, targetUserId, + curPerms = grantUri(intent.getData(), sourceUid, targetPackage, targetUserId, grantFlags, tag, curPerms); } return curPerms; diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java index 5ba563c20b57..a633350996cd 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -89,7 +89,7 @@ import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.server.AppStateTracker; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerServiceDumpProto.ActiveJob; @@ -207,7 +207,7 @@ public class JobSchedulerService extends com.android.server.SystemService PackageManagerInternal mLocalPM; ActivityManagerInternal mActivityManagerInternal; IBatteryStats mBatteryStats; - DeviceIdleController.LocalService mLocalDeviceIdleController; + DeviceIdleInternal mLocalDeviceIdleController; AppStateTracker mAppStateTracker; final UsageStatsManagerInternal mUsageStats; @@ -963,7 +963,7 @@ public class JobSchedulerService extends com.android.server.SystemService // changing. We can just directly enqueue this work in to the job. if (toCancel.getJob().equals(job)) { - toCancel.enqueueWorkLocked(ActivityManager.getService(), work); + toCancel.enqueueWorkLocked(work); // If any of work item is enqueued when the source is in the foreground, // exempt the entire job. @@ -992,11 +992,11 @@ public class JobSchedulerService extends com.android.server.SystemService } // This may throw a SecurityException. - jobStatus.prepareLocked(ActivityManager.getService()); + jobStatus.prepareLocked(); if (work != null) { // If work has been supplied, enqueue it into the new job. - jobStatus.enqueueWorkLocked(ActivityManager.getService(), work); + jobStatus.enqueueWorkLocked(work); } if (toCancel != null) { @@ -1144,7 +1144,7 @@ public class JobSchedulerService extends com.android.server.SystemService */ private void cancelJobImplLocked(JobStatus cancelled, JobStatus incomingJob, String reason) { if (DEBUG) Slog.d(TAG, "CANCEL: " + cancelled.toShortString()); - cancelled.unprepareLocked(ActivityManager.getService()); + cancelled.unprepareLocked(); stopTrackingJobLocked(cancelled, incomingJob, true /* writeBack */); // Remove from pending queue. if (mPendingJobs.remove(cancelled)) { @@ -1399,8 +1399,8 @@ public class JobSchedulerService extends com.android.server.SystemService mReadyToRock = true; mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService( BatteryStats.SERVICE_NAME)); - mLocalDeviceIdleController - = LocalServices.getService(DeviceIdleController.LocalService.class); + mLocalDeviceIdleController = + LocalServices.getService(DeviceIdleInternal.class); // Create the "runners". for (int i = 0; i < MAX_JOB_CONTEXTS_COUNT; i++) { mActiveServices.add( @@ -1449,7 +1449,7 @@ public class JobSchedulerService extends com.android.server.SystemService private boolean stopTrackingJobLocked(JobStatus jobStatus, JobStatus incomingJob, boolean removeFromPersisted) { // Deal with any remaining work items in the old job. - jobStatus.stopTrackingJobLocked(ActivityManager.getService(), incomingJob); + jobStatus.stopTrackingJobLocked(incomingJob); // Remove from store as well as controllers. final boolean removed = mJobs.remove(jobStatus, removeFromPersisted); @@ -1705,7 +1705,7 @@ public class JobSchedulerService extends com.android.server.SystemService if (rescheduledJob != null) { try { - rescheduledJob.prepareLocked(ActivityManager.getService()); + rescheduledJob.prepareLocked(); } catch (SecurityException e) { Slog.w(TAG, "Unable to regrant job permissions for " + rescheduledJob); } @@ -1713,13 +1713,13 @@ public class JobSchedulerService extends com.android.server.SystemService } else if (jobStatus.getJob().isPeriodic()) { JobStatus rescheduledPeriodic = getRescheduleJobForPeriodic(jobStatus); try { - rescheduledPeriodic.prepareLocked(ActivityManager.getService()); + rescheduledPeriodic.prepareLocked(); } catch (SecurityException e) { Slog.w(TAG, "Unable to regrant job permissions for " + rescheduledPeriodic); } startTrackingJobLocked(rescheduledPeriodic, jobStatus); } - jobStatus.unprepareLocked(ActivityManager.getService()); + jobStatus.unprepareLocked(); reportActiveLocked(); mHandler.obtainMessage(MSG_CHECK_JOB_GREEDY).sendToTarget(); } diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java index 4d9f1331e6ff..782e6463d845 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java @@ -18,7 +18,6 @@ package com.android.server.job; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; -import android.app.ActivityManager; import android.app.job.IJobCallback; import android.app.job.IJobService; import android.app.job.JobInfo; @@ -389,7 +388,7 @@ public final class JobServiceContext implements ServiceConnection { try { synchronized (mLock) { assertCallerLocked(cb); - return mRunningJob.completeWorkLocked(ActivityManager.getService(), workId); + return mRunningJob.completeWorkLocked(workId); } } finally { Binder.restoreCallingIdentity(ident); diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java index 4321fc716b4d..c2bdb6caffd3 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java @@ -20,8 +20,6 @@ import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import static com.android.server.job.JobSchedulerService.sSystemClock; import android.annotation.Nullable; -import android.app.ActivityManager; -import android.app.IActivityManager; import android.app.job.JobInfo; import android.content.ComponentName; import android.content.Context; @@ -180,7 +178,6 @@ public final class JobStore { public void getRtcCorrectedJobsLocked(final ArrayList<JobStatus> toAdd, final ArrayList<JobStatus> toRemove) { final long elapsedNow = sElapsedRealtimeClock.millis(); - final IActivityManager am = ActivityManager.getService(); // Find the jobs that need to be fixed up, collecting them for post-iteration // replacement with their new versions @@ -192,7 +189,7 @@ public final class JobStore { JobStatus newJob = new JobStatus(job, elapsedRuntimes.first, elapsedRuntimes.second, 0, job.getLastSuccessfulRunTime(), job.getLastFailedRunTime()); - newJob.prepareLocked(am); + newJob.prepareLocked(); toAdd.add(newJob); toRemove.add(job); } @@ -667,10 +664,9 @@ public final class JobStore { jobs = readJobMapImpl(fis, rtcGood); if (jobs != null) { long now = sElapsedRealtimeClock.millis(); - IActivityManager am = ActivityManager.getService(); for (int i=0; i<jobs.size(); i++) { JobStatus js = jobs.get(i); - js.prepareLocked(am); + js.prepareLocked(); js.enqueueTime = now; this.jobSet.add(js); diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/DeviceIdleJobsController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/DeviceIdleJobsController.java index 0b6797139eac..01f5fa62f889 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/DeviceIdleJobsController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/DeviceIdleJobsController.java @@ -34,7 +34,7 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.util.ArrayUtils; import com.android.internal.util.IndentingPrintWriter; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerService; import com.android.server.job.StateControllerProto; @@ -66,7 +66,7 @@ public final class DeviceIdleJobsController extends StateController { private final DeviceIdleUpdateFunctor mDeviceIdleUpdateFunctor; private final DeviceIdleJobsDelayHandler mHandler; private final PowerManager mPowerManager; - private final DeviceIdleController.LocalService mLocalDeviceIdleController; + private final DeviceIdleInternal mLocalDeviceIdleController; /** * True when in device idle mode, so we don't want to schedule any jobs. @@ -123,7 +123,7 @@ public final class DeviceIdleJobsController extends StateController { // Register for device idle mode changes mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mLocalDeviceIdleController = - LocalServices.getService(DeviceIdleController.LocalService.class); + LocalServices.getService(DeviceIdleInternal.class); mDeviceIdleWhitelistAppIds = mLocalDeviceIdleController.getPowerSaveWhitelistUserAppIds(); mPowerSaveTempWhitelistAppIds = mLocalDeviceIdleController.getPowerSaveTempWhitelistAppIds(); diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java index 1133f7b851a4..adb43141b9c1 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java @@ -20,7 +20,6 @@ import static com.android.server.job.JobSchedulerService.ACTIVE_INDEX; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import android.app.AppGlobals; -import android.app.IActivityManager; import android.app.job.JobInfo; import android.app.job.JobWorkItem; import android.content.ClipData; @@ -528,7 +527,7 @@ public final class JobStatus { /*innerFlags=*/ 0); } - public void enqueueWorkLocked(IActivityManager am, JobWorkItem work) { + public void enqueueWorkLocked(JobWorkItem work) { if (pendingWork == null) { pendingWork = new ArrayList<>(); } @@ -536,7 +535,7 @@ public final class JobStatus { nextPendingWorkId++; if (work.getIntent() != null && GrantedUriPermissions.checkGrantFlags(work.getIntent().getFlags())) { - work.setGrants(GrantedUriPermissions.createFromIntent(am, work.getIntent(), sourceUid, + work.setGrants(GrantedUriPermissions.createFromIntent(work.getIntent(), sourceUid, sourcePackageName, sourceUserId, toShortString())); } pendingWork.add(work); @@ -567,20 +566,20 @@ public final class JobStatus { return executingWork != null && executingWork.size() > 0; } - private static void ungrantWorkItem(IActivityManager am, JobWorkItem work) { + private static void ungrantWorkItem(JobWorkItem work) { if (work.getGrants() != null) { - ((GrantedUriPermissions)work.getGrants()).revoke(am); + ((GrantedUriPermissions)work.getGrants()).revoke(); } } - public boolean completeWorkLocked(IActivityManager am, int workId) { + public boolean completeWorkLocked(int workId) { if (executingWork != null) { final int N = executingWork.size(); for (int i = 0; i < N; i++) { JobWorkItem work = executingWork.get(i); if (work.getWorkId() == workId) { executingWork.remove(i); - ungrantWorkItem(am, work); + ungrantWorkItem(work); return true; } } @@ -588,16 +587,16 @@ public final class JobStatus { return false; } - private static void ungrantWorkList(IActivityManager am, ArrayList<JobWorkItem> list) { + private static void ungrantWorkList(ArrayList<JobWorkItem> list) { if (list != null) { final int N = list.size(); for (int i = 0; i < N; i++) { - ungrantWorkItem(am, list.get(i)); + ungrantWorkItem(list.get(i)); } } } - public void stopTrackingJobLocked(IActivityManager am, JobStatus incomingJob) { + public void stopTrackingJobLocked(JobStatus incomingJob) { if (incomingJob != null) { // We are replacing with a new job -- transfer the work! We do any executing // work first, since that was originally at the front of the pending work. @@ -615,15 +614,15 @@ public final class JobStatus { incomingJob.updateEstimatedNetworkBytesLocked(); } else { // We are completely stopping the job... need to clean up work. - ungrantWorkList(am, pendingWork); + ungrantWorkList(pendingWork); pendingWork = null; - ungrantWorkList(am, executingWork); + ungrantWorkList(executingWork); executingWork = null; } updateEstimatedNetworkBytesLocked(); } - public void prepareLocked(IActivityManager am) { + public void prepareLocked() { if (prepared) { Slog.wtf(TAG, "Already prepared: " + this); return; @@ -634,12 +633,12 @@ public final class JobStatus { } final ClipData clip = job.getClipData(); if (clip != null) { - uriPerms = GrantedUriPermissions.createFromClip(am, clip, sourceUid, sourcePackageName, + uriPerms = GrantedUriPermissions.createFromClip(clip, sourceUid, sourcePackageName, sourceUserId, job.getClipGrantFlags(), toShortString()); } } - public void unprepareLocked(IActivityManager am) { + public void unprepareLocked() { if (!prepared) { Slog.wtf(TAG, "Hasn't been prepared: " + this); if (DEBUG_PREPARE && unpreparedPoint != null) { @@ -652,7 +651,7 @@ public final class JobStatus { unpreparedPoint = new Throwable().fillInStackTrace(); } if (uriPerms != null) { - uriPerms.revoke(am); + uriPerms.revoke(); uriPerms = null; } } diff --git a/cmds/idmap2/Android.bp b/cmds/idmap2/Android.bp index 3bb99298debf..d4d587108a54 100644 --- a/cmds/idmap2/Android.bp +++ b/cmds/idmap2/Android.bp @@ -18,6 +18,7 @@ cc_defaults { tidy_checks: [ "modernize-*", "-modernize-avoid-c-arrays", + "-modernize-use-trailing-return-type", "android-*", "misc-*", "readability-*", diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 663cd55834cf..96522f7f8ea1 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -6875,6 +6875,9 @@ message TextSelectionEvent { // Relative word (exclusive) index of the end of the smart selection. optional int32 relative_suggested_word_end_index = 10; + + // Name of source package. + optional string package_name = 11; } /** @@ -6912,6 +6915,9 @@ message TextLinkifyEvent { // Time spent on generating links in ms. optional int64 latency_millis = 10; + + // Name of source package. + optional string package_name = 11; } /** @@ -6943,6 +6949,9 @@ message ConversationActionsEvent { // The score of the first entity type. optional float score = 8; + + // Name of source package. + optional string package_name = 9; } /** @@ -6971,6 +6980,9 @@ message LanguageDetectionEvent { // Position of this action. optional int32 action_index = 7; + + // Name of source package. + optional string package_name = 8; } /** diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt index eb53b7c20dbc..9f48f8a12b13 100644 --- a/config/hiddenapi-greylist.txt +++ b/config/hiddenapi-greylist.txt @@ -1174,214 +1174,11 @@ Lcom/android/internal/statusbar/IStatusBar$Stub;->asInterface(Landroid/os/IBinde Lcom/android/internal/statusbar/IStatusBarService$Stub;-><init>()V Lcom/android/internal/statusbar/IStatusBarService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/statusbar/IStatusBarService; Lcom/android/internal/telecom/ITelecomService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telecom/ITelecomService; -Lcom/android/internal/telephony/Call$State;->ALERTING:Lcom/android/internal/telephony/Call$State; -Lcom/android/internal/telephony/Call$State;->DIALING:Lcom/android/internal/telephony/Call$State; -Lcom/android/internal/telephony/Call$State;->DISCONNECTED:Lcom/android/internal/telephony/Call$State; -Lcom/android/internal/telephony/Call$State;->DISCONNECTING:Lcom/android/internal/telephony/Call$State; -Lcom/android/internal/telephony/Call$State;->HOLDING:Lcom/android/internal/telephony/Call$State; -Lcom/android/internal/telephony/Call$State;->IDLE:Lcom/android/internal/telephony/Call$State; -Lcom/android/internal/telephony/Call$State;->INCOMING:Lcom/android/internal/telephony/Call$State; -Lcom/android/internal/telephony/Call$State;->values()[Lcom/android/internal/telephony/Call$State; -Lcom/android/internal/telephony/Call$State;->WAITING:Lcom/android/internal/telephony/Call$State; -Lcom/android/internal/telephony/Call;-><init>()V -Lcom/android/internal/telephony/CallerInfoAsyncQuery$CallerInfoAsyncQueryHandler;-><init>(Lcom/android/internal/telephony/CallerInfoAsyncQuery;Landroid/content/Context;)V -Lcom/android/internal/telephony/CallerInfoAsyncQuery$CookieWrapper;-><init>()V -Lcom/android/internal/telephony/CallerInfoAsyncQuery;->release()V -Lcom/android/internal/telephony/CallForwardInfo;-><init>()V -Lcom/android/internal/telephony/CallTracker;-><init>()V -Lcom/android/internal/telephony/cat/AppInterface$CommandType;->values()[Lcom/android/internal/telephony/cat/AppInterface$CommandType; -Lcom/android/internal/telephony/cat/ResponseData;-><init>()V -Lcom/android/internal/telephony/cat/ResultCode;->values()[Lcom/android/internal/telephony/cat/ResultCode; -Lcom/android/internal/telephony/cat/RilMessageDecoder;->mCurrentRilMessage:Lcom/android/internal/telephony/cat/RilMessage; -Lcom/android/internal/telephony/cat/RilMessageDecoder;->sendCmdForExecution(Lcom/android/internal/telephony/cat/RilMessage;)V -Lcom/android/internal/telephony/cat/RilMessageDecoder;->sendStartDecodingMessageParams(Lcom/android/internal/telephony/cat/RilMessage;)V -Lcom/android/internal/telephony/cat/ValueObject;-><init>()V -Lcom/android/internal/telephony/cat/ValueParser;->retrieveDeviceIdentities(Lcom/android/internal/telephony/cat/ComprehensionTlv;)Lcom/android/internal/telephony/cat/DeviceIdentities; -Lcom/android/internal/telephony/cdma/sms/BearerData$CodingException;-><init>(Ljava/lang/String;)V -Lcom/android/internal/telephony/cdma/sms/BearerData$TimeStamp;-><init>()V -Lcom/android/internal/telephony/cdma/sms/BearerData;-><init>()V -Lcom/android/internal/telephony/cdma/sms/BearerData;->countAsciiSeptets(Ljava/lang/CharSequence;Z)I -Lcom/android/internal/telephony/cdma/sms/BearerData;->decodeUserDataPayload(Lcom/android/internal/telephony/cdma/sms/UserData;Z)V -Lcom/android/internal/telephony/cdma/sms/BearerData;->displayMode:I -Lcom/android/internal/telephony/cdma/sms/BearerData;->encode(Lcom/android/internal/telephony/cdma/sms/BearerData;)[B -Lcom/android/internal/telephony/cdma/sms/BearerData;->encode7bitAscii(Ljava/lang/String;Z)[B -Lcom/android/internal/telephony/cdma/sms/BearerData;->getBitsForNumFields(II)I -Lcom/android/internal/telephony/cdma/sms/BearerData;->hasUserDataHeader:Z -Lcom/android/internal/telephony/cdma/sms/BearerData;->messageId:I -Lcom/android/internal/telephony/cdma/sms/BearerData;->msgCenterTimeStamp:Lcom/android/internal/telephony/cdma/sms/BearerData$TimeStamp; -Lcom/android/internal/telephony/cdma/sms/BearerData;->priority:I -Lcom/android/internal/telephony/cdma/sms/BearerData;->priorityIndicatorSet:Z -Lcom/android/internal/telephony/cdma/sms/BearerData;->userData:Lcom/android/internal/telephony/cdma/sms/UserData; -Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress;-><init>()V -Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress;->digitMode:I -Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress;->numberMode:I -Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress;->numberOfDigits:I -Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress;->numberPlan:I -Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress;->parse(Ljava/lang/String;)Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress; -Lcom/android/internal/telephony/cdma/sms/SmsEnvelope;-><init>()V -Lcom/android/internal/telephony/cdma/sms/SmsEnvelope;->bearerData:[B -Lcom/android/internal/telephony/cdma/sms/SmsEnvelope;->serviceCategory:I -Lcom/android/internal/telephony/cdma/sms/SmsEnvelope;->teleService:I -Lcom/android/internal/telephony/cdma/sms/UserData;-><init>()V -Lcom/android/internal/telephony/cdma/sms/UserData;->charToAscii:Landroid/util/SparseIntArray; -Lcom/android/internal/telephony/cdma/sms/UserData;->msgEncoding:I -Lcom/android/internal/telephony/cdma/sms/UserData;->msgEncodingSet:Z -Lcom/android/internal/telephony/cdma/sms/UserData;->numFields:I -Lcom/android/internal/telephony/cdma/sms/UserData;->payload:[B -Lcom/android/internal/telephony/cdma/sms/UserData;->payloadStr:Ljava/lang/String; -Lcom/android/internal/telephony/cdma/sms/UserData;->userDataHeader:Lcom/android/internal/telephony/SmsHeader; -Lcom/android/internal/telephony/cdma/SmsMessage$SubmitPdu;-><init>()V -Lcom/android/internal/telephony/cdma/SmsMessage;-><init>()V -Lcom/android/internal/telephony/cdma/SmsMessage;->calculateLength(Ljava/lang/CharSequence;ZZ)Lcom/android/internal/telephony/GsmAlphabet$TextEncodingDetails; -Lcom/android/internal/telephony/cdma/SmsMessage;->createFromEfRecord(I[B)Lcom/android/internal/telephony/cdma/SmsMessage; -Lcom/android/internal/telephony/cdma/SmsMessage;->createFromPdu([B)Lcom/android/internal/telephony/cdma/SmsMessage; -Lcom/android/internal/telephony/cdma/SmsMessage;->getIncomingSmsFingerprint()[B -Lcom/android/internal/telephony/cdma/SmsMessage;->getMessageType()I -Lcom/android/internal/telephony/cdma/SmsMessage;->getNextMessageId()I -Lcom/android/internal/telephony/cdma/SmsMessage;->getNumOfVoicemails()I -Lcom/android/internal/telephony/cdma/SmsMessage;->getSubmitPdu(Ljava/lang/String;Lcom/android/internal/telephony/cdma/sms/UserData;Z)Lcom/android/internal/telephony/cdma/SmsMessage$SubmitPdu; -Lcom/android/internal/telephony/cdma/SmsMessage;->getSubmitPdu(Ljava/lang/String;Lcom/android/internal/telephony/cdma/sms/UserData;ZI)Lcom/android/internal/telephony/cdma/SmsMessage$SubmitPdu; -Lcom/android/internal/telephony/cdma/SmsMessage;->getSubmitPdu(Ljava/lang/String;Ljava/lang/String;I[BZ)Lcom/android/internal/telephony/cdma/SmsMessage$SubmitPdu; -Lcom/android/internal/telephony/cdma/SmsMessage;->getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLcom/android/internal/telephony/SmsHeader;)Lcom/android/internal/telephony/cdma/SmsMessage$SubmitPdu; -Lcom/android/internal/telephony/cdma/SmsMessage;->getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLcom/android/internal/telephony/SmsHeader;I)Lcom/android/internal/telephony/cdma/SmsMessage$SubmitPdu; -Lcom/android/internal/telephony/cdma/SmsMessage;->getTeleService()I -Lcom/android/internal/telephony/cdma/SmsMessage;->isStatusReportMessage()Z -Lcom/android/internal/telephony/cdma/SmsMessage;->mBearerData:Lcom/android/internal/telephony/cdma/sms/BearerData; -Lcom/android/internal/telephony/cdma/SmsMessage;->mEnvelope:Lcom/android/internal/telephony/cdma/sms/SmsEnvelope; -Lcom/android/internal/telephony/cdma/SmsMessage;->parseSms()V -Lcom/android/internal/telephony/cdma/SmsMessage;->privateGetSubmitPdu(Ljava/lang/String;ZLcom/android/internal/telephony/cdma/sms/UserData;)Lcom/android/internal/telephony/cdma/SmsMessage$SubmitPdu; -Lcom/android/internal/telephony/DctConstants$Activity;->DATAIN:Lcom/android/internal/telephony/DctConstants$Activity; -Lcom/android/internal/telephony/DctConstants$Activity;->DATAINANDOUT:Lcom/android/internal/telephony/DctConstants$Activity; -Lcom/android/internal/telephony/DctConstants$Activity;->DATAOUT:Lcom/android/internal/telephony/DctConstants$Activity; -Lcom/android/internal/telephony/DctConstants$Activity;->DORMANT:Lcom/android/internal/telephony/DctConstants$Activity; -Lcom/android/internal/telephony/DctConstants$Activity;->values()[Lcom/android/internal/telephony/DctConstants$Activity; -Lcom/android/internal/telephony/DctConstants$State;->CONNECTED:Lcom/android/internal/telephony/DctConstants$State; -Lcom/android/internal/telephony/DctConstants$State;->CONNECTING:Lcom/android/internal/telephony/DctConstants$State; -Lcom/android/internal/telephony/DctConstants$State;->DISCONNECTING:Lcom/android/internal/telephony/DctConstants$State; -Lcom/android/internal/telephony/DctConstants$State;->FAILED:Lcom/android/internal/telephony/DctConstants$State; -Lcom/android/internal/telephony/DctConstants$State;->IDLE:Lcom/android/internal/telephony/DctConstants$State; -Lcom/android/internal/telephony/DctConstants$State;->RETRYING:Lcom/android/internal/telephony/DctConstants$State; -Lcom/android/internal/telephony/DctConstants$State;->values()[Lcom/android/internal/telephony/DctConstants$State; -Lcom/android/internal/telephony/DriverCall$State;->values()[Lcom/android/internal/telephony/DriverCall$State; -Lcom/android/internal/telephony/gsm/GsmCellBroadcastHandler$SmsCbConcatInfo;-><init>(Lcom/android/internal/telephony/gsm/SmsCbHeader;Landroid/telephony/SmsCbLocation;)V -Lcom/android/internal/telephony/gsm/GsmCellBroadcastHandler$SmsCbConcatInfo;->matchesLocation(Ljava/lang/String;II)Z -Lcom/android/internal/telephony/gsm/GsmCellBroadcastHandler;->mSmsCbPageMap:Ljava/util/HashMap; -Lcom/android/internal/telephony/gsm/GsmInboundSmsHandler;->acknowledgeLastIncomingSms(ZILandroid/os/Message;)V -Lcom/android/internal/telephony/gsm/GsmMmiCode;-><init>(Lcom/android/internal/telephony/GsmCdmaPhone;Lcom/android/internal/telephony/uicc/UiccCardApplication;)V -Lcom/android/internal/telephony/gsm/GsmMmiCode;->getCLIRMode()I -Lcom/android/internal/telephony/gsm/GsmMmiCode;->getScString()Ljava/lang/CharSequence; -Lcom/android/internal/telephony/gsm/GsmMmiCode;->isActivate()Z -Lcom/android/internal/telephony/gsm/GsmMmiCode;->isDeactivate()Z -Lcom/android/internal/telephony/gsm/GsmMmiCode;->isErasure()Z -Lcom/android/internal/telephony/gsm/GsmMmiCode;->isInterrogate()Z -Lcom/android/internal/telephony/gsm/GsmMmiCode;->isRegister()Z -Lcom/android/internal/telephony/gsm/GsmMmiCode;->isServiceCodeCallBarring(Ljava/lang/String;)Z -Lcom/android/internal/telephony/gsm/GsmMmiCode;->isServiceCodeCallForwarding(Ljava/lang/String;)Z -Lcom/android/internal/telephony/gsm/GsmMmiCode;->isTemporaryModeCLIR()Z -Lcom/android/internal/telephony/gsm/GsmMmiCode;->makeEmptyNull(Ljava/lang/String;)Ljava/lang/String; -Lcom/android/internal/telephony/gsm/GsmMmiCode;->mContext:Landroid/content/Context; -Lcom/android/internal/telephony/gsm/GsmMmiCode;->mDialingNumber:Ljava/lang/String; -Lcom/android/internal/telephony/gsm/GsmMmiCode;->mIccRecords:Lcom/android/internal/telephony/uicc/IccRecords; -Lcom/android/internal/telephony/gsm/GsmMmiCode;->mPhone:Lcom/android/internal/telephony/GsmCdmaPhone; -Lcom/android/internal/telephony/gsm/GsmMmiCode;->mSc:Ljava/lang/String; -Lcom/android/internal/telephony/gsm/GsmMmiCode;->mSia:Ljava/lang/String; -Lcom/android/internal/telephony/gsm/GsmMmiCode;->mSib:Ljava/lang/String; -Lcom/android/internal/telephony/gsm/GsmMmiCode;->mSic:Ljava/lang/String; -Lcom/android/internal/telephony/gsm/GsmMmiCode;->newFromDialString(Ljava/lang/String;Lcom/android/internal/telephony/GsmCdmaPhone;Lcom/android/internal/telephony/uicc/UiccCardApplication;)Lcom/android/internal/telephony/gsm/GsmMmiCode; -Lcom/android/internal/telephony/gsm/GsmMmiCode;->processCode()V -Lcom/android/internal/telephony/gsm/GsmMmiCode;->siToServiceClass(Ljava/lang/String;)I -Lcom/android/internal/telephony/gsm/GsmMmiCode;->sPatternSuppService:Ljava/util/regex/Pattern; -Lcom/android/internal/telephony/gsm/GsmSmsAddress;-><init>([BII)V -Lcom/android/internal/telephony/gsm/GsmSmsAddress;->isCphsVoiceMessageClear()Z -Lcom/android/internal/telephony/gsm/GsmSmsAddress;->isCphsVoiceMessageSet()Z -Lcom/android/internal/telephony/gsm/GsmSMSDispatcher;->getFormat()Ljava/lang/String; -Lcom/android/internal/telephony/gsm/GsmSMSDispatcher;->mGsmInboundSmsHandler:Lcom/android/internal/telephony/gsm/GsmInboundSmsHandler; -Lcom/android/internal/telephony/gsm/GsmSMSDispatcher;->sendSms(Lcom/android/internal/telephony/SMSDispatcher$SmsTracker;)V -Lcom/android/internal/telephony/gsm/SimTlv;-><init>([BII)V -Lcom/android/internal/telephony/gsm/SimTlv;->getData()[B -Lcom/android/internal/telephony/gsm/SimTlv;->getTag()I -Lcom/android/internal/telephony/gsm/SimTlv;->isValidObject()Z -Lcom/android/internal/telephony/gsm/SimTlv;->mHasValidTlvObject:Z -Lcom/android/internal/telephony/gsm/SimTlv;->nextObject()Z -Lcom/android/internal/telephony/gsm/SmsCbHeader;-><init>([B)V -Lcom/android/internal/telephony/gsm/SmsCbHeader;->getGeographicalScope()I -Lcom/android/internal/telephony/gsm/SmsCbHeader;->getNumberOfPages()I -Lcom/android/internal/telephony/gsm/SmsCbHeader;->getPageIndex()I -Lcom/android/internal/telephony/gsm/SmsCbHeader;->getSerialNumber()I -Lcom/android/internal/telephony/gsm/SmsCbHeader;->getServiceCategory()I -Lcom/android/internal/telephony/gsm/SmsCbHeader;->mMessageIdentifier:I -Lcom/android/internal/telephony/gsm/SmsMessage$PduParser;-><init>([B)V -Lcom/android/internal/telephony/gsm/SmsMessage$PduParser;->getByte()I -Lcom/android/internal/telephony/gsm/SmsMessage$PduParser;->getUserData()[B -Lcom/android/internal/telephony/gsm/SmsMessage$PduParser;->getUserDataUCS2(I)Ljava/lang/String; -Lcom/android/internal/telephony/gsm/SmsMessage$PduParser;->mCur:I -Lcom/android/internal/telephony/gsm/SmsMessage$PduParser;->mPdu:[B -Lcom/android/internal/telephony/gsm/SmsMessage$PduParser;->mUserDataSeptetPadding:I -Lcom/android/internal/telephony/gsm/SmsMessage$SubmitPdu;-><init>()V -Lcom/android/internal/telephony/gsm/SmsMessage;-><init>()V -Lcom/android/internal/telephony/gsm/SmsMessage;->calculateLength(Ljava/lang/CharSequence;Z)Lcom/android/internal/telephony/GsmAlphabet$TextEncodingDetails; -Lcom/android/internal/telephony/gsm/SmsMessage;->createFromEfRecord(I[B)Lcom/android/internal/telephony/gsm/SmsMessage; -Lcom/android/internal/telephony/gsm/SmsMessage;->createFromPdu([B)Lcom/android/internal/telephony/gsm/SmsMessage; -Lcom/android/internal/telephony/gsm/SmsMessage;->encodeUCS2(Ljava/lang/String;[B)[B -Lcom/android/internal/telephony/gsm/SmsMessage;->getStatus()I -Lcom/android/internal/telephony/gsm/SmsMessage;->getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Lcom/android/internal/telephony/gsm/SmsMessage$SubmitPdu; -Lcom/android/internal/telephony/gsm/SmsMessage;->getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZI)Lcom/android/internal/telephony/gsm/SmsMessage$SubmitPdu; -Lcom/android/internal/telephony/gsm/SmsMessage;->getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z[B)Lcom/android/internal/telephony/gsm/SmsMessage$SubmitPdu; -Lcom/android/internal/telephony/gsm/SmsMessage;->getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z[BIII)Lcom/android/internal/telephony/gsm/SmsMessage$SubmitPdu; -Lcom/android/internal/telephony/gsm/SmsMessage;->getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z[BIIII)Lcom/android/internal/telephony/gsm/SmsMessage$SubmitPdu; -Lcom/android/internal/telephony/gsm/SmsMessage;->getSubmitPduHead(Ljava/lang/String;Ljava/lang/String;BZLcom/android/internal/telephony/gsm/SmsMessage$SubmitPdu;)Ljava/io/ByteArrayOutputStream; -Lcom/android/internal/telephony/gsm/SmsMessage;->isMWIClearMessage()Z -Lcom/android/internal/telephony/gsm/SmsMessage;->isMwiDontStore()Z -Lcom/android/internal/telephony/gsm/SmsMessage;->isMWISetMessage()Z -Lcom/android/internal/telephony/gsm/SmsMessage;->isStatusReportMessage()Z -Lcom/android/internal/telephony/gsm/UsimPhoneBookManager;->loadEfFilesFromUsim()Ljava/util/ArrayList; -Lcom/android/internal/telephony/gsm/UsimPhoneBookManager;->log(Ljava/lang/String;)V -Lcom/android/internal/telephony/gsm/UsimPhoneBookManager;->mFh:Lcom/android/internal/telephony/uicc/IccFileHandler; -Lcom/android/internal/telephony/gsm/UsimPhoneBookManager;->mLock:Ljava/lang/Object; -Lcom/android/internal/telephony/gsm/UsimPhoneBookManager;->mPhoneBookRecords:Ljava/util/ArrayList; -Lcom/android/internal/telephony/gsm/UsimPhoneBookManager;->reset()V -Lcom/android/internal/telephony/GsmAlphabet$TextEncodingDetails;-><init>()V -Lcom/android/internal/telephony/GsmCdmaConnection$MyHandler;-><init>(Lcom/android/internal/telephony/GsmCdmaConnection;Landroid/os/Looper;)V -Lcom/android/internal/telephony/IccCardConstants$State;->ABSENT:Lcom/android/internal/telephony/IccCardConstants$State; -Lcom/android/internal/telephony/IccCardConstants$State;->CARD_IO_ERROR:Lcom/android/internal/telephony/IccCardConstants$State; -Lcom/android/internal/telephony/IccCardConstants$State;->NETWORK_LOCKED:Lcom/android/internal/telephony/IccCardConstants$State; -Lcom/android/internal/telephony/IccCardConstants$State;->NOT_READY:Lcom/android/internal/telephony/IccCardConstants$State; -Lcom/android/internal/telephony/IccCardConstants$State;->PERM_DISABLED:Lcom/android/internal/telephony/IccCardConstants$State; -Lcom/android/internal/telephony/IccCardConstants$State;->PIN_REQUIRED:Lcom/android/internal/telephony/IccCardConstants$State; -Lcom/android/internal/telephony/IccCardConstants$State;->PUK_REQUIRED:Lcom/android/internal/telephony/IccCardConstants$State; -Lcom/android/internal/telephony/IccCardConstants$State;->READY:Lcom/android/internal/telephony/IccCardConstants$State; -Lcom/android/internal/telephony/IccCardConstants$State;->UNKNOWN:Lcom/android/internal/telephony/IccCardConstants$State; -Lcom/android/internal/telephony/IccCardConstants$State;->values()[Lcom/android/internal/telephony/IccCardConstants$State; -Lcom/android/internal/telephony/IccProvider;-><init>()V Lcom/android/internal/telephony/IIccPhoneBook$Stub$Proxy;->mRemote:Landroid/os/IBinder; Lcom/android/internal/telephony/IIccPhoneBook$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IIccPhoneBook; -Lcom/android/internal/telephony/IIccPhoneBook;->getAdnRecordsInEf(I)Ljava/util/List; -Lcom/android/internal/telephony/IIccPhoneBook;->getAdnRecordsInEfForSubscriber(II)Ljava/util/List; -Lcom/android/internal/telephony/IIccPhoneBook;->getAdnRecordsSize(I)[I -Lcom/android/internal/telephony/IIccPhoneBook;->getAdnRecordsSizeForSubscriber(II)[I -Lcom/android/internal/telephony/IIccPhoneBook;->updateAdnRecordsInEfBySearch(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z Lcom/android/internal/telephony/IMms$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IMms; -Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker$ExternalCallStateListener;-><init>(Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker;)V -Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker$ExternalConnectionListener;-><init>(Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker;)V -Lcom/android/internal/telephony/imsphone/ImsPhone;->notifyCallForwardingIndicator()V -Lcom/android/internal/telephony/imsphone/ImsPhone;->notifyPreciseCallStateChanged()V -Lcom/android/internal/telephony/imsphone/ImsPhoneCall;->getImsCall()Lcom/android/ims/ImsCall; -Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker;->findConnection(Lcom/android/ims/ImsCall;)Lcom/android/internal/telephony/imsphone/ImsPhoneConnection; -Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker;->getEcbmInterface()Lcom/android/ims/ImsEcbm; -Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker;->mCallExpectedToResume:Lcom/android/ims/ImsCall; -Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker;->mImsCallListener:Lcom/android/ims/ImsCall$Listener; -Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker;->mImsManager:Lcom/android/ims/ImsManager; -Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker;->mUssdSession:Lcom/android/ims/ImsCall; -Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker;->processCallStateChange(Lcom/android/ims/ImsCall;Lcom/android/internal/telephony/Call$State;I)V -Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker;->processCallStateChange(Lcom/android/ims/ImsCall;Lcom/android/internal/telephony/Call$State;IZ)V -Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker;->setVideoCallProvider(Lcom/android/internal/telephony/imsphone/ImsPhoneConnection;Lcom/android/ims/ImsCall;)V -Lcom/android/internal/telephony/imsphone/ImsPhoneConnection$MyHandler;-><init>(Lcom/android/internal/telephony/imsphone/ImsPhoneConnection;Landroid/os/Looper;)V -Lcom/android/internal/telephony/imsphone/ImsPhoneConnection;->mImsCall:Lcom/android/ims/ImsCall; -Lcom/android/internal/telephony/imsphone/ImsPhoneConnection;->update(Lcom/android/ims/ImsCall;Lcom/android/internal/telephony/Call$State;)Z -Lcom/android/internal/telephony/InboundSmsHandler$SmsBroadcastReceiver;-><init>(Lcom/android/internal/telephony/InboundSmsHandler;Lcom/android/internal/telephony/InboundSmsTracker;)V Lcom/android/internal/telephony/IPhoneStateListener$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IPhoneStateListener; Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;-><init>(Landroid/os/IBinder;)V -Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;->getDeviceId(Ljava/lang/String;)Ljava/lang/String; Lcom/android/internal/telephony/IPhoneSubInfo$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IPhoneSubInfo; Lcom/android/internal/telephony/IPhoneSubInfo$Stub;->TRANSACTION_getDeviceId:I Lcom/android/internal/telephony/ISms$Stub;-><init>()V @@ -1389,8 +1186,6 @@ Lcom/android/internal/telephony/ISms$Stub;->asInterface(Landroid/os/IBinder;)Lco Lcom/android/internal/telephony/ISub$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Lcom/android/internal/telephony/ISub$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ISub; Lcom/android/internal/telephony/ITelephony$Stub$Proxy;-><init>(Landroid/os/IBinder;)V -Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->getDeviceId(Ljava/lang/String;)Ljava/lang/String; -Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->isRadioOn(Ljava/lang/String;)Z Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->mRemote:Landroid/os/IBinder; Lcom/android/internal/telephony/ITelephony$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephony; Lcom/android/internal/telephony/ITelephony$Stub;->DESCRIPTOR:Ljava/lang/String; @@ -1400,82 +1195,6 @@ Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_getDeviceId:I Lcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Lcom/android/internal/telephony/ITelephonyRegistry$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephonyRegistry; Lcom/android/internal/telephony/IWapPushManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IWapPushManager; -Lcom/android/internal/telephony/PhoneConstants$DataState;->CONNECTED:Lcom/android/internal/telephony/PhoneConstants$DataState; -Lcom/android/internal/telephony/PhoneConstants$DataState;->CONNECTING:Lcom/android/internal/telephony/PhoneConstants$DataState; -Lcom/android/internal/telephony/PhoneConstants$DataState;->DISCONNECTED:Lcom/android/internal/telephony/PhoneConstants$DataState; -Lcom/android/internal/telephony/PhoneConstants$DataState;->SUSPENDED:Lcom/android/internal/telephony/PhoneConstants$DataState; -Lcom/android/internal/telephony/PhoneConstants$DataState;->values()[Lcom/android/internal/telephony/PhoneConstants$DataState; -Lcom/android/internal/telephony/PhoneConstants$State;->IDLE:Lcom/android/internal/telephony/PhoneConstants$State; -Lcom/android/internal/telephony/PhoneConstants$State;->OFFHOOK:Lcom/android/internal/telephony/PhoneConstants$State; -Lcom/android/internal/telephony/PhoneConstants$State;->RINGING:Lcom/android/internal/telephony/PhoneConstants$State; -Lcom/android/internal/telephony/PhoneConstants$State;->values()[Lcom/android/internal/telephony/PhoneConstants$State; -Lcom/android/internal/telephony/PhoneConstants;->PRESENTATION_ALLOWED:I -Lcom/android/internal/telephony/PhoneConstants;->PRESENTATION_PAYPHONE:I -Lcom/android/internal/telephony/PhoneConstants;->PRESENTATION_RESTRICTED:I -Lcom/android/internal/telephony/PhoneConstants;->PRESENTATION_UNKNOWN:I -Lcom/android/internal/telephony/RILConstants;->PREFERRED_NETWORK_MODE:I -Lcom/android/internal/telephony/sip/SipPhone$SipCall;->hold()V -Lcom/android/internal/telephony/sip/SipPhone$SipCall;->switchWith(Lcom/android/internal/telephony/sip/SipPhone$SipCall;)V -Lcom/android/internal/telephony/sip/SipPhone$SipCall;->unhold()V -Lcom/android/internal/telephony/sip/SipPhone;->log(Ljava/lang/String;)V -Lcom/android/internal/telephony/sip/SipPhone;->loge(Ljava/lang/String;)V -Lcom/android/internal/telephony/sip/SipPhone;->mBackgroundCall:Lcom/android/internal/telephony/sip/SipPhone$SipCall; -Lcom/android/internal/telephony/sip/SipPhone;->mForegroundCall:Lcom/android/internal/telephony/sip/SipPhone$SipCall; -Lcom/android/internal/telephony/Sms7BitEncodingTranslator;->DBG:Z -Lcom/android/internal/telephony/Sms7BitEncodingTranslator;->mTranslationTableCDMA:Landroid/util/SparseIntArray; -Lcom/android/internal/telephony/Sms7BitEncodingTranslator;->mTranslationTableCommon:Landroid/util/SparseIntArray; -Lcom/android/internal/telephony/Sms7BitEncodingTranslator;->mTranslationTableGSM:Landroid/util/SparseIntArray; -Lcom/android/internal/telephony/SmsApplication$SmsApplicationData;->mApplicationName:Ljava/lang/String; -Lcom/android/internal/telephony/SmsApplication;->configurePreferredActivity(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;I)V -Lcom/android/internal/telephony/SmsApplication;->getApplicationCollection(Landroid/content/Context;)Ljava/util/Collection; -Lcom/android/internal/telephony/SmsApplication;->getDefaultMmsApplication(Landroid/content/Context;Z)Landroid/content/ComponentName; -Lcom/android/internal/telephony/SmsApplication;->getDefaultRespondViaMessageApplication(Landroid/content/Context;Z)Landroid/content/ComponentName; -Lcom/android/internal/telephony/SmsApplication;->getDefaultSmsApplication(Landroid/content/Context;Z)Landroid/content/ComponentName; -Lcom/android/internal/telephony/SmsApplication;->getSmsApplicationData(Ljava/lang/String;Landroid/content/Context;)Lcom/android/internal/telephony/SmsApplication$SmsApplicationData; -Lcom/android/internal/telephony/SmsApplication;->isDefaultSmsApplication(Landroid/content/Context;Ljava/lang/String;)Z -Lcom/android/internal/telephony/SmsApplication;->setDefaultApplication(Ljava/lang/String;Landroid/content/Context;)V -Lcom/android/internal/telephony/SmsApplication;->shouldWriteMessageForPackage(Ljava/lang/String;Landroid/content/Context;)Z -Lcom/android/internal/telephony/SMSDispatcher$DataSmsSender;-><init>(Lcom/android/internal/telephony/SMSDispatcher;Lcom/android/internal/telephony/SMSDispatcher$SmsTracker;)V -Lcom/android/internal/telephony/SMSDispatcher$MultipartSmsSender;-><init>(Lcom/android/internal/telephony/SMSDispatcher;Ljava/util/ArrayList;[Lcom/android/internal/telephony/SMSDispatcher$SmsTracker;)V -Lcom/android/internal/telephony/SMSDispatcher$MultipartSmsSenderCallback;-><init>(Lcom/android/internal/telephony/SMSDispatcher;Lcom/android/internal/telephony/SMSDispatcher$MultipartSmsSender;)V -Lcom/android/internal/telephony/SMSDispatcher$SmsSenderCallback;-><init>(Lcom/android/internal/telephony/SMSDispatcher;Lcom/android/internal/telephony/SMSDispatcher$SmsSender;)V -Lcom/android/internal/telephony/SMSDispatcher$TextSmsSender;-><init>(Lcom/android/internal/telephony/SMSDispatcher;Lcom/android/internal/telephony/SMSDispatcher$SmsTracker;)V -Lcom/android/internal/telephony/SmsHeader$ConcatRef;-><init>()V -Lcom/android/internal/telephony/SmsHeader$PortAddrs;-><init>()V -Lcom/android/internal/telephony/SmsMessageBase;-><init>()V -Lcom/android/internal/telephony/TelephonyProperties;->PROPERTY_ICC_OPERATOR_NUMERIC:Ljava/lang/String; -Lcom/android/internal/telephony/test/InterpreterEx;-><init>(Ljava/lang/String;)V -Lcom/android/internal/telephony/test/SimulatedCommands;->acceptCall(Landroid/os/Message;)V -Lcom/android/internal/telephony/test/SimulatedCommands;->mDcSuccess:Z -Lcom/android/internal/telephony/test/SimulatedCommands;->resultFail(Landroid/os/Message;Ljava/lang/Object;Ljava/lang/Throwable;)V -Lcom/android/internal/telephony/test/SimulatedCommands;->resultSuccess(Landroid/os/Message;Ljava/lang/Object;)V -Lcom/android/internal/telephony/test/SimulatedCommands;->simulatedCallState:Lcom/android/internal/telephony/test/SimulatedGsmCallState; -Lcom/android/internal/telephony/test/SimulatedCommands;->unimplemented(Landroid/os/Message;)V -Lcom/android/internal/telephony/test/SimulatedCommandsVerifier;->getInstance()Lcom/android/internal/telephony/test/SimulatedCommandsVerifier; -Lcom/android/internal/telephony/test/SimulatedCommandsVerifier;->setCallForward(IIILjava/lang/String;ILandroid/os/Message;)V -Lcom/android/internal/telephony/test/SimulatedGsmCallState;->conference()Z -Lcom/android/internal/telephony/test/SimulatedGsmCallState;->onChld(CC)Z -Lcom/android/internal/telephony/test/SimulatedGsmCallState;->releaseActiveAcceptHeldOrWaiting()Z -Lcom/android/internal/telephony/test/SimulatedGsmCallState;->releaseHeldOrUDUB()Z -Lcom/android/internal/telephony/test/SimulatedGsmCallState;->separateCall(I)Z -Lcom/android/internal/telephony/test/SimulatedGsmCallState;->switchActiveAndHeldOrWaiting()Z -Lcom/android/internal/telephony/uicc/IccCardApplicationStatus$AppState;->values()[Lcom/android/internal/telephony/uicc/IccCardApplicationStatus$AppState; -Lcom/android/internal/telephony/uicc/IccCardApplicationStatus$AppType;->values()[Lcom/android/internal/telephony/uicc/IccCardApplicationStatus$AppType; -Lcom/android/internal/telephony/uicc/IccCardApplicationStatus$PersoSubState;->values()[Lcom/android/internal/telephony/uicc/IccCardApplicationStatus$PersoSubState; -Lcom/android/internal/telephony/uicc/IccCardApplicationStatus;-><init>()V -Lcom/android/internal/telephony/uicc/IccRefreshResponse;-><init>()V -Lcom/android/internal/telephony/uicc/IccUtils;->adnStringFieldToString([BII)Ljava/lang/String; -Lcom/android/internal/telephony/uicc/IccUtils;->bcdToString([BII)Ljava/lang/String; -Lcom/android/internal/telephony/uicc/IccUtils;->bytesToHexString([B)Ljava/lang/String; -Lcom/android/internal/telephony/uicc/IccUtils;->cdmaBcdByteToInt(B)I -Lcom/android/internal/telephony/uicc/IccUtils;->cdmaBcdToString([BII)Ljava/lang/String; -Lcom/android/internal/telephony/uicc/IccUtils;->gsmBcdByteToInt(B)I -Lcom/android/internal/telephony/uicc/IccUtils;->hexCharToInt(C)I -Lcom/android/internal/telephony/uicc/IccUtils;->hexStringToBytes(Ljava/lang/String;)[B -Lcom/android/internal/telephony/uicc/IccUtils;->networkNameToString([BII)Ljava/lang/String; -Lcom/android/internal/telephony/uicc/IccUtils;->parseToBnW([BI)Landroid/graphics/Bitmap; -Lcom/android/internal/telephony/uicc/IccUtils;->parseToRGB([BIZ)Landroid/graphics/Bitmap; -Lcom/android/internal/telephony/uicc/SIMRecords$GetSpnFsmState;->values()[Lcom/android/internal/telephony/uicc/SIMRecords$GetSpnFsmState; Lcom/android/internal/textservice/ITextServicesManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Lcom/android/internal/util/MemInfoReader;-><init>()V Lcom/android/internal/view/IInputMethodManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V @@ -1488,283 +1207,5 @@ Lcom/android/server/net/BaseNetworkObserver;-><init>()V Lcom/android/server/ResettableTimeout$T;-><init>(Lcom/android/server/ResettableTimeout;)V Lcom/google/android/gles_jni/EGLImpl;-><init>()V Lcom/google/android/gles_jni/GLImpl;-><init>()V -Lcom/google/android/mms/ContentType;->getAudioTypes()Ljava/util/ArrayList; -Lcom/google/android/mms/ContentType;->getImageTypes()Ljava/util/ArrayList; -Lcom/google/android/mms/ContentType;->getVideoTypes()Ljava/util/ArrayList; -Lcom/google/android/mms/ContentType;->isAudioType(Ljava/lang/String;)Z -Lcom/google/android/mms/ContentType;->isDrmType(Ljava/lang/String;)Z -Lcom/google/android/mms/ContentType;->isImageType(Ljava/lang/String;)Z -Lcom/google/android/mms/ContentType;->isSupportedAudioType(Ljava/lang/String;)Z -Lcom/google/android/mms/ContentType;->isSupportedImageType(Ljava/lang/String;)Z -Lcom/google/android/mms/ContentType;->isSupportedType(Ljava/lang/String;)Z -Lcom/google/android/mms/ContentType;->isSupportedVideoType(Ljava/lang/String;)Z -Lcom/google/android/mms/ContentType;->isTextType(Ljava/lang/String;)Z -Lcom/google/android/mms/ContentType;->isVideoType(Ljava/lang/String;)Z -Lcom/google/android/mms/InvalidHeaderValueException;-><init>(Ljava/lang/String;)V -Lcom/google/android/mms/MmsException;-><init>()V -Lcom/google/android/mms/MmsException;-><init>(Ljava/lang/String;)V -Lcom/google/android/mms/MmsException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V -Lcom/google/android/mms/MmsException;-><init>(Ljava/lang/Throwable;)V -Lcom/google/android/mms/pdu/AcknowledgeInd;-><init>(I[B)V -Lcom/google/android/mms/pdu/AcknowledgeInd;-><init>(Lcom/google/android/mms/pdu/PduHeaders;)V -Lcom/google/android/mms/pdu/AcknowledgeInd;->setReportAllowed(I)V -Lcom/google/android/mms/pdu/AcknowledgeInd;->setTransactionId([B)V -Lcom/google/android/mms/pdu/Base64;->decodeBase64([B)[B -Lcom/google/android/mms/pdu/CharacterSets;->getMibEnumValue(Ljava/lang/String;)I -Lcom/google/android/mms/pdu/CharacterSets;->getMimeName(I)Ljava/lang/String; -Lcom/google/android/mms/pdu/DeliveryInd;-><init>(Lcom/google/android/mms/pdu/PduHeaders;)V -Lcom/google/android/mms/pdu/DeliveryInd;->getDate()J -Lcom/google/android/mms/pdu/DeliveryInd;->getMessageId()[B -Lcom/google/android/mms/pdu/DeliveryInd;->getStatus()I -Lcom/google/android/mms/pdu/DeliveryInd;->getTo()[Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/EncodedStringValue;-><init>(I[B)V -Lcom/google/android/mms/pdu/EncodedStringValue;-><init>(Ljava/lang/String;)V -Lcom/google/android/mms/pdu/EncodedStringValue;-><init>([B)V -Lcom/google/android/mms/pdu/EncodedStringValue;->appendTextString([B)V -Lcom/google/android/mms/pdu/EncodedStringValue;->concat([Lcom/google/android/mms/pdu/EncodedStringValue;)Ljava/lang/String; -Lcom/google/android/mms/pdu/EncodedStringValue;->copy(Lcom/google/android/mms/pdu/EncodedStringValue;)Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/EncodedStringValue;->encodeStrings([Ljava/lang/String;)[Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/EncodedStringValue;->extract(Ljava/lang/String;)[Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/EncodedStringValue;->getCharacterSet()I -Lcom/google/android/mms/pdu/EncodedStringValue;->getString()Ljava/lang/String; -Lcom/google/android/mms/pdu/EncodedStringValue;->getTextString()[B -Lcom/google/android/mms/pdu/EncodedStringValue;->setCharacterSet(I)V -Lcom/google/android/mms/pdu/EncodedStringValue;->setTextString([B)V -Lcom/google/android/mms/pdu/GenericPdu;-><init>()V -Lcom/google/android/mms/pdu/GenericPdu;->getFrom()Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/GenericPdu;->getMessageType()I -Lcom/google/android/mms/pdu/GenericPdu;->getPduHeaders()Lcom/google/android/mms/pdu/PduHeaders; -Lcom/google/android/mms/pdu/GenericPdu;->mPduHeaders:Lcom/google/android/mms/pdu/PduHeaders; -Lcom/google/android/mms/pdu/GenericPdu;->setFrom(Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/GenericPdu;->setMessageType(I)V -Lcom/google/android/mms/pdu/MultimediaMessagePdu;-><init>()V -Lcom/google/android/mms/pdu/MultimediaMessagePdu;-><init>(Lcom/google/android/mms/pdu/PduHeaders;Lcom/google/android/mms/pdu/PduBody;)V -Lcom/google/android/mms/pdu/MultimediaMessagePdu;->addTo(Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/MultimediaMessagePdu;->getBody()Lcom/google/android/mms/pdu/PduBody; -Lcom/google/android/mms/pdu/MultimediaMessagePdu;->getDate()J -Lcom/google/android/mms/pdu/MultimediaMessagePdu;->getPriority()I -Lcom/google/android/mms/pdu/MultimediaMessagePdu;->getSubject()Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/MultimediaMessagePdu;->getTo()[Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/MultimediaMessagePdu;->setBody(Lcom/google/android/mms/pdu/PduBody;)V -Lcom/google/android/mms/pdu/MultimediaMessagePdu;->setDate(J)V -Lcom/google/android/mms/pdu/MultimediaMessagePdu;->setPriority(I)V -Lcom/google/android/mms/pdu/MultimediaMessagePdu;->setSubject(Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/NotificationInd;-><init>()V -Lcom/google/android/mms/pdu/NotificationInd;-><init>(Lcom/google/android/mms/pdu/PduHeaders;)V -Lcom/google/android/mms/pdu/NotificationInd;->getContentClass()I -Lcom/google/android/mms/pdu/NotificationInd;->getContentLocation()[B -Lcom/google/android/mms/pdu/NotificationInd;->getDeliveryReport()I -Lcom/google/android/mms/pdu/NotificationInd;->getExpiry()J -Lcom/google/android/mms/pdu/NotificationInd;->getFrom()Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/NotificationInd;->getMessageClass()[B -Lcom/google/android/mms/pdu/NotificationInd;->getMessageSize()J -Lcom/google/android/mms/pdu/NotificationInd;->getSubject()Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/NotificationInd;->getTransactionId()[B -Lcom/google/android/mms/pdu/NotificationInd;->setContentClass(I)V -Lcom/google/android/mms/pdu/NotificationInd;->setContentLocation([B)V -Lcom/google/android/mms/pdu/NotificationInd;->setDeliveryReport(I)V -Lcom/google/android/mms/pdu/NotificationInd;->setExpiry(J)V -Lcom/google/android/mms/pdu/NotificationInd;->setFrom(Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/NotificationInd;->setMessageClass([B)V -Lcom/google/android/mms/pdu/NotificationInd;->setMessageSize(J)V -Lcom/google/android/mms/pdu/NotificationInd;->setSubject(Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/NotificationInd;->setTransactionId([B)V -Lcom/google/android/mms/pdu/NotifyRespInd;-><init>(I[BI)V -Lcom/google/android/mms/pdu/NotifyRespInd;-><init>(Lcom/google/android/mms/pdu/PduHeaders;)V -Lcom/google/android/mms/pdu/NotifyRespInd;->setReportAllowed(I)V -Lcom/google/android/mms/pdu/NotifyRespInd;->setStatus(I)V -Lcom/google/android/mms/pdu/NotifyRespInd;->setTransactionId([B)V -Lcom/google/android/mms/pdu/PduBody;-><init>()V -Lcom/google/android/mms/pdu/PduBody;->addPart(ILcom/google/android/mms/pdu/PduPart;)V -Lcom/google/android/mms/pdu/PduBody;->addPart(Lcom/google/android/mms/pdu/PduPart;)Z -Lcom/google/android/mms/pdu/PduBody;->getPart(I)Lcom/google/android/mms/pdu/PduPart; -Lcom/google/android/mms/pdu/PduBody;->getPartByContentId(Ljava/lang/String;)Lcom/google/android/mms/pdu/PduPart; -Lcom/google/android/mms/pdu/PduBody;->getPartByContentLocation(Ljava/lang/String;)Lcom/google/android/mms/pdu/PduPart; -Lcom/google/android/mms/pdu/PduBody;->getPartByFileName(Ljava/lang/String;)Lcom/google/android/mms/pdu/PduPart; -Lcom/google/android/mms/pdu/PduBody;->getPartByName(Ljava/lang/String;)Lcom/google/android/mms/pdu/PduPart; -Lcom/google/android/mms/pdu/PduBody;->getPartIndex(Lcom/google/android/mms/pdu/PduPart;)I -Lcom/google/android/mms/pdu/PduBody;->getPartsNum()I -Lcom/google/android/mms/pdu/PduBody;->removePart(I)Lcom/google/android/mms/pdu/PduPart; -Lcom/google/android/mms/pdu/PduComposer$BufferStack;->copy()V -Lcom/google/android/mms/pdu/PduComposer$BufferStack;->mark()Lcom/google/android/mms/pdu/PduComposer$PositionMarker; -Lcom/google/android/mms/pdu/PduComposer$BufferStack;->newbuf()V -Lcom/google/android/mms/pdu/PduComposer$BufferStack;->pop()V -Lcom/google/android/mms/pdu/PduComposer$PositionMarker;->getLength()I -Lcom/google/android/mms/pdu/PduComposer;-><init>(Landroid/content/Context;Lcom/google/android/mms/pdu/GenericPdu;)V -Lcom/google/android/mms/pdu/PduComposer;->appendEncodedString(Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/PduComposer;->appendHeader(I)I -Lcom/google/android/mms/pdu/PduComposer;->appendLongInteger(J)V -Lcom/google/android/mms/pdu/PduComposer;->appendOctet(I)V -Lcom/google/android/mms/pdu/PduComposer;->appendQuotedString(Ljava/lang/String;)V -Lcom/google/android/mms/pdu/PduComposer;->appendQuotedString([B)V -Lcom/google/android/mms/pdu/PduComposer;->appendShortInteger(I)V -Lcom/google/android/mms/pdu/PduComposer;->appendTextString(Ljava/lang/String;)V -Lcom/google/android/mms/pdu/PduComposer;->appendTextString([B)V -Lcom/google/android/mms/pdu/PduComposer;->appendUintvarInteger(J)V -Lcom/google/android/mms/pdu/PduComposer;->appendValueLength(J)V -Lcom/google/android/mms/pdu/PduComposer;->arraycopy([BII)V -Lcom/google/android/mms/pdu/PduComposer;->make()[B -Lcom/google/android/mms/pdu/PduComposer;->mContentTypeMap:Ljava/util/HashMap; -Lcom/google/android/mms/pdu/PduComposer;->mMessage:Ljava/io/ByteArrayOutputStream; -Lcom/google/android/mms/pdu/PduComposer;->mPdu:Lcom/google/android/mms/pdu/GenericPdu; -Lcom/google/android/mms/pdu/PduComposer;->mPduHeader:Lcom/google/android/mms/pdu/PduHeaders; -Lcom/google/android/mms/pdu/PduComposer;->mPosition:I -Lcom/google/android/mms/pdu/PduComposer;->mResolver:Landroid/content/ContentResolver; -Lcom/google/android/mms/pdu/PduComposer;->mStack:Lcom/google/android/mms/pdu/PduComposer$BufferStack; -Lcom/google/android/mms/pdu/PduContentTypes;->contentTypes:[Ljava/lang/String; -Lcom/google/android/mms/pdu/PduHeaders;-><init>()V -Lcom/google/android/mms/pdu/PduHeaders;->appendEncodedStringValue(Lcom/google/android/mms/pdu/EncodedStringValue;I)V -Lcom/google/android/mms/pdu/PduHeaders;->getEncodedStringValue(I)Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/PduHeaders;->getEncodedStringValues(I)[Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/PduHeaders;->getLongInteger(I)J -Lcom/google/android/mms/pdu/PduHeaders;->getOctet(I)I -Lcom/google/android/mms/pdu/PduHeaders;->getTextString(I)[B -Lcom/google/android/mms/pdu/PduHeaders;->setEncodedStringValue(Lcom/google/android/mms/pdu/EncodedStringValue;I)V -Lcom/google/android/mms/pdu/PduHeaders;->setLongInteger(JI)V -Lcom/google/android/mms/pdu/PduHeaders;->setOctet(II)V Lcom/google/android/mms/pdu/PduParser;->$assertionsDisabled:Z -Lcom/google/android/mms/pdu/PduParser;-><init>([BZ)V -Lcom/google/android/mms/pdu/PduParser;->checkPartPosition(Lcom/google/android/mms/pdu/PduPart;)I -Lcom/google/android/mms/pdu/PduParser;->log(Ljava/lang/String;)V -Lcom/google/android/mms/pdu/PduParser;->parse()Lcom/google/android/mms/pdu/GenericPdu; -Lcom/google/android/mms/pdu/PduParser;->parseContentType(Ljava/io/ByteArrayInputStream;Ljava/util/HashMap;)[B -Lcom/google/android/mms/pdu/PduParser;->parsePartHeaders(Ljava/io/ByteArrayInputStream;Lcom/google/android/mms/pdu/PduPart;I)Z -Lcom/google/android/mms/pdu/PduParser;->parseShortInteger(Ljava/io/ByteArrayInputStream;)I -Lcom/google/android/mms/pdu/PduParser;->parseUnsignedInt(Ljava/io/ByteArrayInputStream;)I -Lcom/google/android/mms/pdu/PduParser;->parseValueLength(Ljava/io/ByteArrayInputStream;)I -Lcom/google/android/mms/pdu/PduParser;->parseWapString(Ljava/io/ByteArrayInputStream;I)[B -Lcom/google/android/mms/pdu/PduPart;-><init>()V -Lcom/google/android/mms/pdu/PduPart;->generateLocation()Ljava/lang/String; -Lcom/google/android/mms/pdu/PduPart;->getCharset()I -Lcom/google/android/mms/pdu/PduPart;->getContentDisposition()[B -Lcom/google/android/mms/pdu/PduPart;->getContentId()[B -Lcom/google/android/mms/pdu/PduPart;->getContentLocation()[B -Lcom/google/android/mms/pdu/PduPart;->getContentTransferEncoding()[B -Lcom/google/android/mms/pdu/PduPart;->getContentType()[B -Lcom/google/android/mms/pdu/PduPart;->getData()[B -Lcom/google/android/mms/pdu/PduPart;->getDataLength()I -Lcom/google/android/mms/pdu/PduPart;->getDataUri()Landroid/net/Uri; -Lcom/google/android/mms/pdu/PduPart;->getFilename()[B -Lcom/google/android/mms/pdu/PduPart;->getName()[B -Lcom/google/android/mms/pdu/PduPart;->setCharset(I)V -Lcom/google/android/mms/pdu/PduPart;->setContentDisposition([B)V -Lcom/google/android/mms/pdu/PduPart;->setContentId([B)V -Lcom/google/android/mms/pdu/PduPart;->setContentLocation([B)V -Lcom/google/android/mms/pdu/PduPart;->setContentTransferEncoding([B)V -Lcom/google/android/mms/pdu/PduPart;->setContentType([B)V -Lcom/google/android/mms/pdu/PduPart;->setData([B)V -Lcom/google/android/mms/pdu/PduPart;->setDataUri(Landroid/net/Uri;)V -Lcom/google/android/mms/pdu/PduPart;->setFilename([B)V -Lcom/google/android/mms/pdu/PduPart;->setName([B)V -Lcom/google/android/mms/pdu/PduPersister;->ADDRESS_FIELDS:[I -Lcom/google/android/mms/pdu/PduPersister;->CHARSET_COLUMN_NAME_MAP:Ljava/util/HashMap; -Lcom/google/android/mms/pdu/PduPersister;->ENCODED_STRING_COLUMN_NAME_MAP:Ljava/util/HashMap; -Lcom/google/android/mms/pdu/PduPersister;->getByteArrayFromPartColumn(Landroid/database/Cursor;I)[B -Lcom/google/android/mms/pdu/PduPersister;->getBytes(Ljava/lang/String;)[B -Lcom/google/android/mms/pdu/PduPersister;->getIntegerFromPartColumn(Landroid/database/Cursor;I)Ljava/lang/Integer; -Lcom/google/android/mms/pdu/PduPersister;->getPartContentType(Lcom/google/android/mms/pdu/PduPart;)Ljava/lang/String; -Lcom/google/android/mms/pdu/PduPersister;->getPduPersister(Landroid/content/Context;)Lcom/google/android/mms/pdu/PduPersister; -Lcom/google/android/mms/pdu/PduPersister;->getPendingMessages(J)Landroid/database/Cursor; -Lcom/google/android/mms/pdu/PduPersister;->load(Landroid/net/Uri;)Lcom/google/android/mms/pdu/GenericPdu; -Lcom/google/android/mms/pdu/PduPersister;->loadRecipients(ILjava/util/HashSet;Ljava/util/HashMap;Z)V -Lcom/google/android/mms/pdu/PduPersister;->LONG_COLUMN_NAME_MAP:Ljava/util/HashMap; -Lcom/google/android/mms/pdu/PduPersister;->mContentResolver:Landroid/content/ContentResolver; -Lcom/google/android/mms/pdu/PduPersister;->mContext:Landroid/content/Context; -Lcom/google/android/mms/pdu/PduPersister;->MESSAGE_BOX_MAP:Ljava/util/HashMap; -Lcom/google/android/mms/pdu/PduPersister;->move(Landroid/net/Uri;Landroid/net/Uri;)Landroid/net/Uri; -Lcom/google/android/mms/pdu/PduPersister;->mTelephonyManager:Landroid/telephony/TelephonyManager; -Lcom/google/android/mms/pdu/PduPersister;->OCTET_COLUMN_NAME_MAP:Ljava/util/HashMap; -Lcom/google/android/mms/pdu/PduPersister;->PART_PROJECTION:[Ljava/lang/String; -Lcom/google/android/mms/pdu/PduPersister;->PDU_CACHE_INSTANCE:Lcom/google/android/mms/util/PduCache; -Lcom/google/android/mms/pdu/PduPersister;->persist(Lcom/google/android/mms/pdu/GenericPdu;Landroid/net/Uri;ZZLjava/util/HashMap;)Landroid/net/Uri; -Lcom/google/android/mms/pdu/PduPersister;->persistAddress(JI[Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/PduPersister;->persistPart(Lcom/google/android/mms/pdu/PduPart;JLjava/util/HashMap;)Landroid/net/Uri; -Lcom/google/android/mms/pdu/PduPersister;->TEXT_STRING_COLUMN_NAME_MAP:Ljava/util/HashMap; -Lcom/google/android/mms/pdu/PduPersister;->toIsoString([B)Ljava/lang/String; -Lcom/google/android/mms/pdu/PduPersister;->updateAddress(JI[Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/PduPersister;->updateHeaders(Landroid/net/Uri;Lcom/google/android/mms/pdu/SendReq;)V -Lcom/google/android/mms/pdu/PduPersister;->updateParts(Landroid/net/Uri;Lcom/google/android/mms/pdu/PduBody;Ljava/util/HashMap;)V -Lcom/google/android/mms/pdu/QuotedPrintable;->decodeQuotedPrintable([B)[B -Lcom/google/android/mms/pdu/ReadOrigInd;-><init>(Lcom/google/android/mms/pdu/PduHeaders;)V -Lcom/google/android/mms/pdu/ReadOrigInd;->getMessageId()[B -Lcom/google/android/mms/pdu/ReadOrigInd;->getReadStatus()I -Lcom/google/android/mms/pdu/ReadRecInd;-><init>(Lcom/google/android/mms/pdu/EncodedStringValue;[BII[Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/ReadRecInd;-><init>(Lcom/google/android/mms/pdu/PduHeaders;)V -Lcom/google/android/mms/pdu/ReadRecInd;->getMessageId()[B -Lcom/google/android/mms/pdu/ReadRecInd;->setDate(J)V -Lcom/google/android/mms/pdu/RetrieveConf;-><init>()V -Lcom/google/android/mms/pdu/RetrieveConf;-><init>(Lcom/google/android/mms/pdu/PduHeaders;Lcom/google/android/mms/pdu/PduBody;)V -Lcom/google/android/mms/pdu/RetrieveConf;->addCc(Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/RetrieveConf;->getCc()[Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/RetrieveConf;->getContentType()[B -Lcom/google/android/mms/pdu/RetrieveConf;->getDeliveryReport()I -Lcom/google/android/mms/pdu/RetrieveConf;->getFrom()Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/RetrieveConf;->getMessageClass()[B -Lcom/google/android/mms/pdu/RetrieveConf;->getMessageId()[B -Lcom/google/android/mms/pdu/RetrieveConf;->getReadReport()I -Lcom/google/android/mms/pdu/RetrieveConf;->getRetrieveStatus()I -Lcom/google/android/mms/pdu/RetrieveConf;->getRetrieveText()Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/RetrieveConf;->getTransactionId()[B -Lcom/google/android/mms/pdu/RetrieveConf;->setContentType([B)V -Lcom/google/android/mms/pdu/RetrieveConf;->setDeliveryReport(I)V -Lcom/google/android/mms/pdu/RetrieveConf;->setFrom(Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/RetrieveConf;->setMessageClass([B)V -Lcom/google/android/mms/pdu/RetrieveConf;->setMessageId([B)V -Lcom/google/android/mms/pdu/RetrieveConf;->setReadReport(I)V -Lcom/google/android/mms/pdu/RetrieveConf;->setRetrieveStatus(I)V -Lcom/google/android/mms/pdu/RetrieveConf;->setRetrieveText(Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/RetrieveConf;->setTransactionId([B)V -Lcom/google/android/mms/pdu/SendConf;-><init>()V -Lcom/google/android/mms/pdu/SendConf;-><init>(Lcom/google/android/mms/pdu/PduHeaders;)V -Lcom/google/android/mms/pdu/SendConf;->getMessageId()[B -Lcom/google/android/mms/pdu/SendConf;->getResponseStatus()I -Lcom/google/android/mms/pdu/SendConf;->getTransactionId()[B -Lcom/google/android/mms/pdu/SendReq;-><init>()V -Lcom/google/android/mms/pdu/SendReq;-><init>(Lcom/google/android/mms/pdu/PduHeaders;Lcom/google/android/mms/pdu/PduBody;)V -Lcom/google/android/mms/pdu/SendReq;->addBcc(Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/SendReq;->addCc(Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/SendReq;->getBcc()[Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/SendReq;->getCc()[Lcom/google/android/mms/pdu/EncodedStringValue; -Lcom/google/android/mms/pdu/SendReq;->getContentType()[B -Lcom/google/android/mms/pdu/SendReq;->getDeliveryReport()I -Lcom/google/android/mms/pdu/SendReq;->getExpiry()J -Lcom/google/android/mms/pdu/SendReq;->getMessageClass()[B -Lcom/google/android/mms/pdu/SendReq;->getMessageSize()J -Lcom/google/android/mms/pdu/SendReq;->getReadReport()I -Lcom/google/android/mms/pdu/SendReq;->getTransactionId()[B -Lcom/google/android/mms/pdu/SendReq;->setBcc([Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/SendReq;->setCc([Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/SendReq;->setContentType([B)V -Lcom/google/android/mms/pdu/SendReq;->setDeliveryReport(I)V -Lcom/google/android/mms/pdu/SendReq;->setExpiry(J)V -Lcom/google/android/mms/pdu/SendReq;->setMessageClass([B)V -Lcom/google/android/mms/pdu/SendReq;->setMessageSize(J)V -Lcom/google/android/mms/pdu/SendReq;->setReadReport(I)V -Lcom/google/android/mms/pdu/SendReq;->setTo([Lcom/google/android/mms/pdu/EncodedStringValue;)V -Lcom/google/android/mms/pdu/SendReq;->setTransactionId([B)V -Lcom/google/android/mms/util/AbstractCache;-><init>()V -Lcom/google/android/mms/util/AbstractCache;->get(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/google/android/mms/util/AbstractCache;->purge(Ljava/lang/Object;)Ljava/lang/Object; -Lcom/google/android/mms/util/AbstractCache;->purgeAll()V -Lcom/google/android/mms/util/AbstractCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Z -Lcom/google/android/mms/util/DownloadDrmHelper;->isDrmConvertNeeded(Ljava/lang/String;)Z -Lcom/google/android/mms/util/DownloadDrmHelper;->modifyDrmFwLockFileExtension(Ljava/lang/String;)Ljava/lang/String; -Lcom/google/android/mms/util/DrmConvertSession;->close(Ljava/lang/String;)I -Lcom/google/android/mms/util/DrmConvertSession;->convert([BI)[B -Lcom/google/android/mms/util/DrmConvertSession;->open(Landroid/content/Context;Ljava/lang/String;)Lcom/google/android/mms/util/DrmConvertSession; -Lcom/google/android/mms/util/PduCache;-><init>()V -Lcom/google/android/mms/util/PduCache;->getInstance()Lcom/google/android/mms/util/PduCache; -Lcom/google/android/mms/util/PduCache;->isUpdating(Landroid/net/Uri;)Z -Lcom/google/android/mms/util/PduCache;->purge(Landroid/net/Uri;)Lcom/google/android/mms/util/PduCacheEntry; -Lcom/google/android/mms/util/PduCache;->purgeAll()V -Lcom/google/android/mms/util/PduCacheEntry;-><init>(Lcom/google/android/mms/pdu/GenericPdu;IJ)V -Lcom/google/android/mms/util/PduCacheEntry;->getMessageBox()I -Lcom/google/android/mms/util/PduCacheEntry;->getPdu()Lcom/google/android/mms/pdu/GenericPdu; -Lcom/google/android/mms/util/PduCacheEntry;->getThreadId()J -Lcom/google/android/mms/util/SqliteWrapper;->checkSQLiteException(Landroid/content/Context;Landroid/database/sqlite/SQLiteException;)V -Lcom/google/android/mms/util/SqliteWrapper;->delete(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I -Lcom/google/android/mms/util/SqliteWrapper;->insert(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri; -Lcom/google/android/mms/util/SqliteWrapper;->query(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor; -Lcom/google/android/mms/util/SqliteWrapper;->requery(Landroid/content/Context;Landroid/database/Cursor;)Z -Lcom/google/android/mms/util/SqliteWrapper;->update(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I Lcom/google/android/util/AbstractMessageParser$Token$Type;->values()[Lcom/google/android/util/AbstractMessageParser$Token$Type; diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 553ef69fe8e2..a6784780d72f 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -191,6 +191,8 @@ import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.lang.reflect.Method; import java.net.InetAddress; +import java.nio.file.Files; +import java.nio.file.Path; import java.text.DateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -6435,6 +6437,26 @@ public final class ActivityThread extends ClientTransactionHandler { NetworkSecurityConfigProvider.install(appContext); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); + + if (isAppDebuggable) { + try { + // Load all the agents in the code_cache/startup_agents directory. + // We pass the absolute path to the data_dir as an argument. + Path startup_path = appContext.getCodeCacheDir().toPath().resolve("startup_agents"); + if (Files.exists(startup_path)) { + for (Path p : Files.newDirectoryStream(startup_path)) { + handleAttachAgent( + p.toAbsolutePath().toString() + + "=" + + appContext.getDataDir().toPath().toAbsolutePath().toString(), + data.info); + } + } + } catch (Exception e) { + // Ignored. + } + } + // Continue loading instrumentation. if (ii != null) { ApplicationInfo instrApp; diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 970739cc92eb..635b9b02a944 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -1163,7 +1163,8 @@ public final class SystemServiceRegistry { @Override public AppPredictionManager createService(ContextImpl ctx) throws ServiceNotFoundException { - return new AppPredictionManager(ctx); + IBinder b = ServiceManager.getService(Context.APP_PREDICTION_SERVICE); + return b == null ? null : new AppPredictionManager(ctx); } }); diff --git a/core/java/android/companion/AssociationRequest.java b/core/java/android/companion/AssociationRequest.java index e4114c66bac7..ac40150376da 100644 --- a/core/java/android/companion/AssociationRequest.java +++ b/core/java/android/companion/AssociationRequest.java @@ -127,6 +127,12 @@ public final class AssociationRequest implements Parcelable { public Builder() {} /** + * Whether only a single device should match the provided filter. + * + * When scanning for a single device with a specifc {@link BluetoothDeviceFilter} mac + * address, bonded devices are also searched among. This allows to obtain the necessary app + * privileges even if the device is already paired. + * * @param singleDevice if true, scanning for a device will stop as soon as at least one * fitting device is found */ diff --git a/services/core/java/com/android/server/compat/IPlatformCompat.aidl b/core/java/android/compat/IPlatformCompat.aidl index 8ab08f9047cb..3d8a9d5c5e86 100644 --- a/services/core/java/com/android/server/compat/IPlatformCompat.aidl +++ b/core/java/android/compat/IPlatformCompat.aidl @@ -14,12 +14,16 @@ * limitations under the License. */ -package com.android.server.compat; +package android.compat; import android.content.pm.ApplicationInfo; /** - * System private API for talking with the PlatformCompat service. + * Platform private API for talking with the PlatformCompat service. + * + * <p> Should be used for gating and logging from non-app processes. + * For app processes please use android.compat.Compatibility API. + * * {@hide} */ interface IPlatformCompat diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 3adef3fb09d0..bb5ced56ec59 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -4117,6 +4117,9 @@ public abstract class Context { /** * Official published name of the app prediction service. * + * <p><b>NOTE: </b> this service is optional; callers of + * {@code Context.getSystemServiceName(APP_PREDICTION_SERVICE)} should check for {@code null}. + * * @hide * @see #getSystemService(String) */ diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 895eba6cdec2..c561013e6768 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -38,6 +38,8 @@ import android.app.PackageDeleteObserver; import android.app.PackageInstallObserver; import android.app.admin.DevicePolicyManager; import android.app.usage.StorageStatsManager; +import android.compat.annotation.ChangeId; +import android.compat.annotation.EnabledAfter; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -3369,6 +3371,17 @@ public abstract class PackageManager { */ public static final int VERSION_CODE_HIGHEST = -1; + /** + * Apps targeting Android R and above will need to declare the packages and intents they intend + * to use to get details about other apps on a device. Such declarations must be made via the + * {@code <queries>} tag in the manifest. + * + * @hide + */ + @ChangeId + @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q) + public static final long FILTER_APPLICATION_QUERY = 135549675L; + /** {@hide} */ public int getUserId() { return UserHandle.myUserId(); diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 2f198acde06d..f50502e0a331 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -675,12 +675,6 @@ public abstract class PackageManagerInternal { "android.content.pm.extra.ENABLE_ROLLBACK_INSTALL_FLAGS"; /** - * Extra field name for the set of installed users for a given rollback package. - */ - public static final String EXTRA_ENABLE_ROLLBACK_INSTALLED_USERS = - "android.content.pm.extra.ENABLE_ROLLBACK_INSTALLED_USERS"; - - /** * Extra field name for the user id an install is associated with when * enabling rollback. */ diff --git a/core/java/android/content/rollback/PackageRollbackInfo.java b/core/java/android/content/rollback/PackageRollbackInfo.java index 201475130753..c89796d4b1da 100644 --- a/core/java/android/content/rollback/PackageRollbackInfo.java +++ b/core/java/android/content/rollback/PackageRollbackInfo.java @@ -76,10 +76,10 @@ public final class PackageRollbackInfo implements Parcelable { private final boolean mIsApex; /* - * The list of users the package is installed for. + * The list of users for which snapshots have been saved. */ // NOTE: Not a part of the Parcelable representation of this object. - private final IntArray mInstalledUsers; + private final IntArray mSnapshottedUsers; /** * A mapping between user and an inode of theirs CE data snapshot. @@ -148,8 +148,8 @@ public final class PackageRollbackInfo implements Parcelable { } /** @hide */ - public IntArray getInstalledUsers() { - return mInstalledUsers; + public IntArray getSnapshottedUsers() { + return mSnapshottedUsers; } /** @hide */ @@ -179,14 +179,14 @@ public final class PackageRollbackInfo implements Parcelable { public PackageRollbackInfo(VersionedPackage packageRolledBackFrom, VersionedPackage packageRolledBackTo, @NonNull IntArray pendingBackups, @NonNull ArrayList<RestoreInfo> pendingRestores, - boolean isApex, @NonNull IntArray installedUsers, + boolean isApex, @NonNull IntArray snapshottedUsers, @NonNull SparseLongArray ceSnapshotInodes) { this.mVersionRolledBackFrom = packageRolledBackFrom; this.mVersionRolledBackTo = packageRolledBackTo; this.mPendingBackups = pendingBackups; this.mPendingRestores = pendingRestores; this.mIsApex = isApex; - this.mInstalledUsers = installedUsers; + this.mSnapshottedUsers = snapshottedUsers; this.mCeSnapshotInodes = ceSnapshotInodes; } @@ -196,7 +196,7 @@ public final class PackageRollbackInfo implements Parcelable { this.mIsApex = in.readBoolean(); this.mPendingRestores = null; this.mPendingBackups = null; - this.mInstalledUsers = null; + this.mSnapshottedUsers = null; this.mCeSnapshotInodes = null; } diff --git a/core/java/android/hardware/Sensor.java b/core/java/android/hardware/Sensor.java index 099ae291c8f4..e78fb7f00797 100644 --- a/core/java/android/hardware/Sensor.java +++ b/core/java/android/hardware/Sensor.java @@ -339,6 +339,8 @@ public final class Sensor { * for {@link #TYPE_STEP_COUNTER} instead. It is defined as a * {@link Sensor#REPORTING_MODE_SPECIAL_TRIGGER} sensor. * <p> + * This sensor requires permission {@code android.permission.ACTIVITY_RECOGNITION}. + * <p> * See {@link android.hardware.SensorEvent#values SensorEvent.values} for more details. */ public static final int TYPE_STEP_DETECTOR = 18; @@ -384,8 +386,6 @@ public final class Sensor { * gyroscope. This sensor uses lower power than the other rotation vectors, because it doesn't * use the gyroscope. However, it is more noisy and will work best outdoors. * <p> - * This sensor requires permission {@code android.permission.ACTIVITY_RECOGNITION}. - * <p> * See {@link android.hardware.SensorEvent#values SensorEvent.values} for more details. */ public static final int TYPE_GEOMAGNETIC_ROTATION_VECTOR = 20; diff --git a/core/java/android/service/gatekeeper/GateKeeperResponse.java b/core/java/android/service/gatekeeper/GateKeeperResponse.java index 66fee1e90aff..7ed733cb4f4c 100644 --- a/core/java/android/service/gatekeeper/GateKeeperResponse.java +++ b/core/java/android/service/gatekeeper/GateKeeperResponse.java @@ -31,6 +31,8 @@ public final class GateKeeperResponse implements Parcelable { public static final int RESPONSE_OK = 0; public static final int RESPONSE_RETRY = 1; + public static final GateKeeperResponse ERROR = createGenericResponse(RESPONSE_ERROR); + private final int mResponseCode; private int mTimeout; diff --git a/core/java/android/util/Half.java b/core/java/android/util/Half.java index 70d049a6e985..fe536a6e4e68 100644 --- a/core/java/android/util/Half.java +++ b/core/java/android/util/Half.java @@ -20,6 +20,8 @@ import android.annotation.HalfFloat; import android.annotation.NonNull; import android.annotation.Nullable; +import libcore.util.FP16; + /** * <p>The {@code Half} class is a wrapper and a utility class to manipulate half-precision 16-bit * <a href="https://en.wikipedia.org/wiki/Half-precision_floating-point_format">IEEE 754</a> @@ -148,25 +150,6 @@ public final class Half extends Number implements Comparable<Half> { */ public static final @HalfFloat short POSITIVE_ZERO = (short) 0x0000; - private static final int FP16_SIGN_SHIFT = 15; - private static final int FP16_SIGN_MASK = 0x8000; - private static final int FP16_EXPONENT_SHIFT = 10; - private static final int FP16_EXPONENT_MASK = 0x1f; - private static final int FP16_SIGNIFICAND_MASK = 0x3ff; - private static final int FP16_EXPONENT_BIAS = 15; - private static final int FP16_COMBINED = 0x7fff; - private static final int FP16_EXPONENT_MAX = 0x7c00; - - private static final int FP32_SIGN_SHIFT = 31; - private static final int FP32_EXPONENT_SHIFT = 23; - private static final int FP32_EXPONENT_MASK = 0xff; - private static final int FP32_SIGNIFICAND_MASK = 0x7fffff; - private static final int FP32_EXPONENT_BIAS = 127; - private static final int FP32_QNAN_MASK = 0x400000; - - private static final int FP32_DENORMAL_MAGIC = 126 << 23; - private static final float FP32_DENORMAL_FLOAT = Float.intBitsToFloat(FP32_DENORMAL_MAGIC); - private final @HalfFloat short mValue; /** @@ -414,16 +397,7 @@ public final class Half extends Number implements Comparable<Half> { * than {@code y} */ public static int compare(@HalfFloat short x, @HalfFloat short y) { - if (less(x, y)) return -1; - if (greater(x, y)) return 1; - - // Collapse NaNs, akin to halfToIntBits(), but we want to keep - // (signed) short value types to preserve the ordering of -0.0 - // and +0.0 - short xBits = (x & FP16_COMBINED) > FP16_EXPONENT_MAX ? NaN : x; - short yBits = (y & FP16_COMBINED) > FP16_EXPONENT_MAX ? NaN : y; - - return (xBits == yBits ? 0 : (xBits < yBits ? -1 : 1)); + return FP16.compare(x, y); } /** @@ -440,7 +414,7 @@ public final class Half extends Number implements Comparable<Half> { * @see #halfToIntBits(short) */ public static @HalfFloat short halfToShortBits(@HalfFloat short h) { - return (h & FP16_COMBINED) > FP16_EXPONENT_MAX ? NaN : h; + return (h & FP16.EXPONENT_SIGNIFICAND_MASK) > FP16.POSITIVE_INFINITY ? NaN : h; } /** @@ -459,7 +433,7 @@ public final class Half extends Number implements Comparable<Half> { * @see #intBitsToHalf(int) */ public static int halfToIntBits(@HalfFloat short h) { - return (h & FP16_COMBINED) > FP16_EXPONENT_MAX ? NaN : h & 0xffff; + return (h & FP16.EXPONENT_SIGNIFICAND_MASK) > FP16.POSITIVE_INFINITY ? NaN : h & 0xffff; } /** @@ -505,7 +479,7 @@ public final class Half extends Number implements Comparable<Half> { * of the second parameter */ public static @HalfFloat short copySign(@HalfFloat short magnitude, @HalfFloat short sign) { - return (short) ((sign & FP16_SIGN_MASK) | (magnitude & FP16_COMBINED)); + return (short) ((sign & FP16.SIGN_MASK) | (magnitude & FP16.EXPONENT_SIGNIFICAND_MASK)); } /** @@ -523,7 +497,7 @@ public final class Half extends Number implements Comparable<Half> { * @return The absolute value of the specified half-precision float */ public static @HalfFloat short abs(@HalfFloat short h) { - return (short) (h & FP16_COMBINED); + return (short) (h & FP16.EXPONENT_SIGNIFICAND_MASK); } /** @@ -538,26 +512,18 @@ public final class Half extends Number implements Comparable<Half> { * the result is zero (with the same sign)</li> * </ul> * + * <p class=note> + * <strong>Note:</strong> Unlike the identically named + * <code class=prettyprint>int java.lang.Math.round(float)</code> method, + * this returns a Half value stored in a short, <strong>not</strong> an + * actual short integer result. + * * @param h A half-precision float value * @return The value of the specified half-precision float rounded to the nearest * half-precision float value */ public static @HalfFloat short round(@HalfFloat short h) { - int bits = h & 0xffff; - int e = bits & 0x7fff; - int result = bits; - - if (e < 0x3c00) { - result &= FP16_SIGN_MASK; - result |= (0x3c00 & (e >= 0x3800 ? 0xffff : 0x0)); - } else if (e < 0x6400) { - e = 25 - (e >> 10); - int mask = (1 << e) - 1; - result += (1 << (e - 1)); - result &= ~mask; - } - - return (short) result; + return FP16.rint(h); } /** @@ -577,21 +543,7 @@ public final class Half extends Number implements Comparable<Half> { * greater than or equal to the specified half-precision float value */ public static @HalfFloat short ceil(@HalfFloat short h) { - int bits = h & 0xffff; - int e = bits & 0x7fff; - int result = bits; - - if (e < 0x3c00) { - result &= FP16_SIGN_MASK; - result |= 0x3c00 & -(~(bits >> 15) & (e != 0 ? 1 : 0)); - } else if (e < 0x6400) { - e = 25 - (e >> 10); - int mask = (1 << e) - 1; - result += mask & ((bits >> 15) - 1); - result &= ~mask; - } - - return (short) result; + return FP16.ceil(h); } /** @@ -611,21 +563,7 @@ public final class Half extends Number implements Comparable<Half> { * less than or equal to the specified half-precision float value */ public static @HalfFloat short floor(@HalfFloat short h) { - int bits = h & 0xffff; - int e = bits & 0x7fff; - int result = bits; - - if (e < 0x3c00) { - result &= FP16_SIGN_MASK; - result |= 0x3c00 & (bits > 0x8000 ? 0xffff : 0x0); - } else if (e < 0x6400) { - e = 25 - (e >> 10); - int mask = (1 << e) - 1; - result += mask & -(bits >> 15); - result &= ~mask; - } - - return (short) result; + return FP16.floor(h); } /** @@ -644,19 +582,7 @@ public final class Half extends Number implements Comparable<Half> { * half-precision float value */ public static @HalfFloat short trunc(@HalfFloat short h) { - int bits = h & 0xffff; - int e = bits & 0x7fff; - int result = bits; - - if (e < 0x3c00) { - result &= FP16_SIGN_MASK; - } else if (e < 0x6400) { - e = 25 - (e >> 10); - int mask = (1 << e) - 1; - result &= ~mask; - } - - return (short) result; + return FP16.trunc(h); } /** @@ -672,15 +598,7 @@ public final class Half extends Number implements Comparable<Half> { * @return The smaller of the two specified half-precision values */ public static @HalfFloat short min(@HalfFloat short x, @HalfFloat short y) { - if ((x & FP16_COMBINED) > FP16_EXPONENT_MAX) return NaN; - if ((y & FP16_COMBINED) > FP16_EXPONENT_MAX) return NaN; - - if ((x & FP16_COMBINED) == 0 && (y & FP16_COMBINED) == 0) { - return (x & FP16_SIGN_MASK) != 0 ? x : y; - } - - return ((x & FP16_SIGN_MASK) != 0 ? 0x8000 - (x & 0xffff) : x & 0xffff) < - ((y & FP16_SIGN_MASK) != 0 ? 0x8000 - (y & 0xffff) : y & 0xffff) ? x : y; + return FP16.min(x, y); } /** @@ -697,15 +615,7 @@ public final class Half extends Number implements Comparable<Half> { * @return The larger of the two specified half-precision values */ public static @HalfFloat short max(@HalfFloat short x, @HalfFloat short y) { - if ((x & FP16_COMBINED) > FP16_EXPONENT_MAX) return NaN; - if ((y & FP16_COMBINED) > FP16_EXPONENT_MAX) return NaN; - - if ((x & FP16_COMBINED) == 0 && (y & FP16_COMBINED) == 0) { - return (x & FP16_SIGN_MASK) != 0 ? y : x; - } - - return ((x & FP16_SIGN_MASK) != 0 ? 0x8000 - (x & 0xffff) : x & 0xffff) > - ((y & FP16_SIGN_MASK) != 0 ? 0x8000 - (y & 0xffff) : y & 0xffff) ? x : y; + return FP16.max(x, y); } /** @@ -719,11 +629,7 @@ public final class Half extends Number implements Comparable<Half> { * @return True if x is less than y, false otherwise */ public static boolean less(@HalfFloat short x, @HalfFloat short y) { - if ((x & FP16_COMBINED) > FP16_EXPONENT_MAX) return false; - if ((y & FP16_COMBINED) > FP16_EXPONENT_MAX) return false; - - return ((x & FP16_SIGN_MASK) != 0 ? 0x8000 - (x & 0xffff) : x & 0xffff) < - ((y & FP16_SIGN_MASK) != 0 ? 0x8000 - (y & 0xffff) : y & 0xffff); + return FP16.less(x, y); } /** @@ -737,11 +643,7 @@ public final class Half extends Number implements Comparable<Half> { * @return True if x is less than or equal to y, false otherwise */ public static boolean lessEquals(@HalfFloat short x, @HalfFloat short y) { - if ((x & FP16_COMBINED) > FP16_EXPONENT_MAX) return false; - if ((y & FP16_COMBINED) > FP16_EXPONENT_MAX) return false; - - return ((x & FP16_SIGN_MASK) != 0 ? 0x8000 - (x & 0xffff) : x & 0xffff) <= - ((y & FP16_SIGN_MASK) != 0 ? 0x8000 - (y & 0xffff) : y & 0xffff); + return FP16.lessEquals(x, y); } /** @@ -755,11 +657,7 @@ public final class Half extends Number implements Comparable<Half> { * @return True if x is greater than y, false otherwise */ public static boolean greater(@HalfFloat short x, @HalfFloat short y) { - if ((x & FP16_COMBINED) > FP16_EXPONENT_MAX) return false; - if ((y & FP16_COMBINED) > FP16_EXPONENT_MAX) return false; - - return ((x & FP16_SIGN_MASK) != 0 ? 0x8000 - (x & 0xffff) : x & 0xffff) > - ((y & FP16_SIGN_MASK) != 0 ? 0x8000 - (y & 0xffff) : y & 0xffff); + return FP16.greater(x, y); } /** @@ -773,11 +671,7 @@ public final class Half extends Number implements Comparable<Half> { * @return True if x is greater than y, false otherwise */ public static boolean greaterEquals(@HalfFloat short x, @HalfFloat short y) { - if ((x & FP16_COMBINED) > FP16_EXPONENT_MAX) return false; - if ((y & FP16_COMBINED) > FP16_EXPONENT_MAX) return false; - - return ((x & FP16_SIGN_MASK) != 0 ? 0x8000 - (x & 0xffff) : x & 0xffff) >= - ((y & FP16_SIGN_MASK) != 0 ? 0x8000 - (y & 0xffff) : y & 0xffff); + return FP16.greaterEquals(x, y); } /** @@ -791,10 +685,7 @@ public final class Half extends Number implements Comparable<Half> { * @return True if x is equal to y, false otherwise */ public static boolean equals(@HalfFloat short x, @HalfFloat short y) { - if ((x & FP16_COMBINED) > FP16_EXPONENT_MAX) return false; - if ((y & FP16_COMBINED) > FP16_EXPONENT_MAX) return false; - - return x == y || ((x | y) & FP16_COMBINED) == 0; + return FP16.equals(x, y); } /** @@ -804,7 +695,7 @@ public final class Half extends Number implements Comparable<Half> { * @return 1 if the value is positive, -1 if the value is negative */ public static int getSign(@HalfFloat short h) { - return (h & FP16_SIGN_MASK) == 0 ? 1 : -1; + return (h & FP16.SIGN_MASK) == 0 ? 1 : -1; } /** @@ -818,7 +709,7 @@ public final class Half extends Number implements Comparable<Half> { * @return The unbiased exponent of the specified value */ public static int getExponent(@HalfFloat short h) { - return ((h >>> FP16_EXPONENT_SHIFT) & FP16_EXPONENT_MASK) - FP16_EXPONENT_BIAS; + return ((h >>> FP16.EXPONENT_SHIFT) & FP16.SHIFTED_EXPONENT_MASK) - FP16.EXPONENT_BIAS; } /** @@ -829,7 +720,7 @@ public final class Half extends Number implements Comparable<Half> { * @return The significand, or significand, of the specified vlaue */ public static int getSignificand(@HalfFloat short h) { - return h & FP16_SIGNIFICAND_MASK; + return h & FP16.SIGNIFICAND_MASK; } /** @@ -841,7 +732,7 @@ public final class Half extends Number implements Comparable<Half> { * false otherwise */ public static boolean isInfinite(@HalfFloat short h) { - return (h & FP16_COMBINED) == FP16_EXPONENT_MAX; + return FP16.isInfinite(h); } /** @@ -852,7 +743,7 @@ public final class Half extends Number implements Comparable<Half> { * @return True if the value is a NaN, false otherwise */ public static boolean isNaN(@HalfFloat short h) { - return (h & FP16_COMBINED) > FP16_EXPONENT_MAX; + return FP16.isNaN(h); } /** @@ -866,7 +757,7 @@ public final class Half extends Number implements Comparable<Half> { * @return True if the value is normalized, false otherwise */ public static boolean isNormalized(@HalfFloat short h) { - return (h & FP16_EXPONENT_MAX) != 0 && (h & FP16_EXPONENT_MAX) != FP16_EXPONENT_MAX; + return FP16.isNormalized(h); } /** @@ -885,35 +776,7 @@ public final class Half extends Number implements Comparable<Half> { * @return A normalized single-precision float value */ public static float toFloat(@HalfFloat short h) { - int bits = h & 0xffff; - int s = bits & FP16_SIGN_MASK; - int e = (bits >>> FP16_EXPONENT_SHIFT) & FP16_EXPONENT_MASK; - int m = (bits ) & FP16_SIGNIFICAND_MASK; - - int outE = 0; - int outM = 0; - - if (e == 0) { // Denormal or 0 - if (m != 0) { - // Convert denorm fp16 into normalized fp32 - float o = Float.intBitsToFloat(FP32_DENORMAL_MAGIC + m); - o -= FP32_DENORMAL_FLOAT; - return s == 0 ? o : -o; - } - } else { - outM = m << 13; - if (e == 0x1f) { // Infinite or NaN - outE = 0xff; - if (outM != 0) { // SNaNs are quieted - outM |= FP32_QNAN_MASK; - } - } else { - outE = e - FP16_EXPONENT_BIAS + FP32_EXPONENT_BIAS; - } - } - - int out = (s << 16) | (outE << FP32_EXPONENT_SHIFT) | outM; - return Float.intBitsToFloat(out); + return FP16.toFloat(h); } /** @@ -940,44 +803,7 @@ public final class Half extends Number implements Comparable<Half> { */ @SuppressWarnings("StatementWithEmptyBody") public static @HalfFloat short toHalf(float f) { - int bits = Float.floatToRawIntBits(f); - int s = (bits >>> FP32_SIGN_SHIFT ); - int e = (bits >>> FP32_EXPONENT_SHIFT) & FP32_EXPONENT_MASK; - int m = (bits ) & FP32_SIGNIFICAND_MASK; - - int outE = 0; - int outM = 0; - - if (e == 0xff) { // Infinite or NaN - outE = 0x1f; - outM = m != 0 ? 0x200 : 0; - } else { - e = e - FP32_EXPONENT_BIAS + FP16_EXPONENT_BIAS; - if (e >= 0x1f) { // Overflow - outE = 0x31; - } else if (e <= 0) { // Underflow - if (e < -10) { - // The absolute fp32 value is less than MIN_VALUE, flush to +/-0 - } else { - // The fp32 value is a normalized float less than MIN_NORMAL, - // we convert to a denorm fp16 - m = (m | 0x800000) >> (1 - e); - if ((m & 0x1000) != 0) m += 0x2000; - outM = m >> 13; - } - } else { - outE = e; - outM = m >> 13; - if ((m & 0x1000) != 0) { - // Round to nearest "0.5" up - int out = (outE << FP16_EXPONENT_SHIFT) | outM; - out++; - return (short) (out | (s << FP16_SIGN_SHIFT)); - } - } - } - - return (short) ((s << FP16_SIGN_SHIFT) | (outE << FP16_EXPONENT_SHIFT) | outM); + return FP16.toHalf(f); } /** @@ -1073,40 +899,6 @@ public final class Half extends Number implements Comparable<Half> { */ @NonNull public static String toHexString(@HalfFloat short h) { - StringBuilder o = new StringBuilder(); - - int bits = h & 0xffff; - int s = (bits >>> FP16_SIGN_SHIFT ); - int e = (bits >>> FP16_EXPONENT_SHIFT) & FP16_EXPONENT_MASK; - int m = (bits ) & FP16_SIGNIFICAND_MASK; - - if (e == 0x1f) { // Infinite or NaN - if (m == 0) { - if (s != 0) o.append('-'); - o.append("Infinity"); - } else { - o.append("NaN"); - } - } else { - if (s == 1) o.append('-'); - if (e == 0) { - if (m == 0) { - o.append("0x0.0p0"); - } else { - o.append("0x0."); - String significand = Integer.toHexString(m); - o.append(significand.replaceFirst("0{2,}$", "")); - o.append("p-14"); - } - } else { - o.append("0x1."); - String significand = Integer.toHexString(m); - o.append(significand.replaceFirst("0{2,}$", "")); - o.append('p'); - o.append(Integer.toString(e - FP16_EXPONENT_BIAS)); - } - } - - return o.toString(); + return FP16.toHexString(h); } } diff --git a/core/java/com/android/internal/widget/ResolverDrawerLayout.java b/core/java/com/android/internal/widget/ResolverDrawerLayout.java index c73de8fad5b2..1bb2ba293186 100644 --- a/core/java/com/android/internal/widget/ResolverDrawerLayout.java +++ b/core/java/com/android/internal/widget/ResolverDrawerLayout.java @@ -775,17 +775,54 @@ public class ResolverDrawerLayout extends ViewGroup { return false; } + private boolean performAccessibilityActionCommon(int action) { + switch (action) { + case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: + case AccessibilityNodeInfo.ACTION_EXPAND: + case R.id.accessibilityActionScrollDown: + if (mCollapseOffset != 0) { + smoothScrollTo(0, 0); + return true; + } + break; + case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: + case R.id.accessibilityActionScrollUp: + if (mCollapseOffset < mCollapsibleHeight) { + smoothScrollTo(mCollapsibleHeight, 0); + return true; + } else if ((mCollapseOffset < mCollapsibleHeight + mUncollapsibleHeight) + && isDismissable()) { + smoothScrollTo(mCollapsibleHeight + mUncollapsibleHeight, 0); + mDismissOnScrollerFinished = true; + return true; + } + break; + case AccessibilityNodeInfo.ACTION_COLLAPSE: + if (mCollapseOffset < mCollapsibleHeight) { + smoothScrollTo(mCollapsibleHeight, 0); + return true; + } + break; + case AccessibilityNodeInfo.ACTION_DISMISS: + if ((mCollapseOffset < mCollapsibleHeight + mUncollapsibleHeight) + && isDismissable()) { + smoothScrollTo(mCollapsibleHeight + mUncollapsibleHeight, 0); + mDismissOnScrollerFinished = true; + return true; + } + break; + } + + return false; + } + @Override public boolean onNestedPrePerformAccessibilityAction(View target, int action, Bundle args) { if (super.onNestedPrePerformAccessibilityAction(target, action, args)) { return true; } - if (action == AccessibilityNodeInfo.ACTION_SCROLL_FORWARD && mCollapseOffset != 0) { - smoothScrollTo(0, 0); - return true; - } - return false; + return performAccessibilityActionCommon(action); } @Override @@ -802,9 +839,23 @@ public class ResolverDrawerLayout extends ViewGroup { if (isEnabled()) { if (mCollapseOffset != 0) { - info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); + info.addAction(AccessibilityAction.ACTION_SCROLL_FORWARD); + info.addAction(AccessibilityAction.ACTION_EXPAND); + info.addAction(AccessibilityAction.ACTION_SCROLL_DOWN); + info.setScrollable(true); + } + if ((mCollapseOffset < mCollapsibleHeight + mUncollapsibleHeight) + && ((mCollapseOffset < mCollapsibleHeight) || isDismissable())) { + info.addAction(AccessibilityAction.ACTION_SCROLL_BACKWARD); + info.addAction(AccessibilityAction.ACTION_SCROLL_UP); info.setScrollable(true); } + if (mCollapseOffset < mCollapsibleHeight) { + info.addAction(AccessibilityAction.ACTION_COLLAPSE); + } + if (mCollapseOffset < mCollapsibleHeight + mUncollapsibleHeight && isDismissable()) { + info.addAction(AccessibilityAction.ACTION_DISMISS); + } } // This view should never get accessibility focus, but it's interactive @@ -823,12 +874,7 @@ public class ResolverDrawerLayout extends ViewGroup { return true; } - if (action == AccessibilityNodeInfo.ACTION_SCROLL_FORWARD && mCollapseOffset != 0) { - smoothScrollTo(0, 0); - return true; - } - - return false; + return performAccessibilityActionCommon(action); } @Override diff --git a/core/jni/android/graphics/ImageDecoder.cpp b/core/jni/android/graphics/ImageDecoder.cpp index 98162af7d27b..ec91cbf854a6 100644 --- a/core/jni/android/graphics/ImageDecoder.cpp +++ b/core/jni/android/graphics/ImageDecoder.cpp @@ -78,14 +78,18 @@ static jobject throw_exception(JNIEnv* env, ImageDecoder::Error error, const cha return nullptr; } -static jobject native_create(JNIEnv* env, std::unique_ptr<SkStream> stream, jobject source) { +static jobject native_create(JNIEnv* env, std::unique_ptr<SkStream> stream, + jobject source, jboolean preferAnimation) { if (!stream.get()) { return throw_exception(env, ImageDecoder::kSourceMalformedData, "Failed to create a stream", nullptr, source); } std::unique_ptr<ImageDecoder> decoder(new ImageDecoder); SkCodec::Result result; - auto codec = SkCodec::MakeFromStream(std::move(stream), &result, decoder->mPeeker.get()); + auto codec = SkCodec::MakeFromStream( + std::move(stream), &result, decoder->mPeeker.get(), + preferAnimation ? SkCodec::SelectionPolicy::kPreferAnimation + : SkCodec::SelectionPolicy::kPreferStillImage); if (jthrowable jexception = get_and_clear_exception(env)) { return throw_exception(env, ImageDecoder::kSourceException, "", jexception, source); } @@ -124,7 +128,7 @@ static jobject native_create(JNIEnv* env, std::unique_ptr<SkStream> stream, jobj } static jobject ImageDecoder_nCreateFd(JNIEnv* env, jobject /*clazz*/, - jobject fileDescriptor, jobject source) { + jobject fileDescriptor, jboolean preferAnimation, jobject source) { int descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor); struct stat fdStat; @@ -142,11 +146,11 @@ static jobject ImageDecoder_nCreateFd(JNIEnv* env, jobject /*clazz*/, } std::unique_ptr<SkFILEStream> fileStream(new SkFILEStream(file)); - return native_create(env, std::move(fileStream), source); + return native_create(env, std::move(fileStream), source, preferAnimation); } static jobject ImageDecoder_nCreateInputStream(JNIEnv* env, jobject /*clazz*/, - jobject is, jbyteArray storage, jobject source) { + jobject is, jbyteArray storage, jboolean preferAnimation, jobject source) { std::unique_ptr<SkStream> stream(CreateJavaInputStreamAdaptor(env, is, storage, false)); if (!stream.get()) { @@ -157,31 +161,33 @@ static jobject ImageDecoder_nCreateInputStream(JNIEnv* env, jobject /*clazz*/, std::unique_ptr<SkStream> bufferedStream( SkFrontBufferedStream::Make(std::move(stream), SkCodec::MinBufferedBytesNeeded())); - return native_create(env, std::move(bufferedStream), source); + return native_create(env, std::move(bufferedStream), source, preferAnimation); } -static jobject ImageDecoder_nCreateAsset(JNIEnv* env, jobject /*clazz*/, jlong assetPtr, - jobject source) { +static jobject ImageDecoder_nCreateAsset(JNIEnv* env, jobject /*clazz*/, + jlong assetPtr, jboolean preferAnimation, jobject source) { Asset* asset = reinterpret_cast<Asset*>(assetPtr); std::unique_ptr<SkStream> stream(new AssetStreamAdaptor(asset)); - return native_create(env, std::move(stream), source); + return native_create(env, std::move(stream), source, preferAnimation); } -static jobject ImageDecoder_nCreateByteBuffer(JNIEnv* env, jobject /*clazz*/, jobject jbyteBuffer, - jint initialPosition, jint limit, jobject source) { +static jobject ImageDecoder_nCreateByteBuffer(JNIEnv* env, jobject /*clazz*/, + jobject jbyteBuffer, jint initialPosition, jint limit, + jboolean preferAnimation, jobject source) { std::unique_ptr<SkStream> stream = CreateByteBufferStreamAdaptor(env, jbyteBuffer, initialPosition, limit); if (!stream) { return throw_exception(env, ImageDecoder::kSourceMalformedData, "Failed to read ByteBuffer", nullptr, source); } - return native_create(env, std::move(stream), source); + return native_create(env, std::move(stream), source, preferAnimation); } -static jobject ImageDecoder_nCreateByteArray(JNIEnv* env, jobject /*clazz*/, jbyteArray byteArray, - jint offset, jint length, jobject source) { +static jobject ImageDecoder_nCreateByteArray(JNIEnv* env, jobject /*clazz*/, + jbyteArray byteArray, jint offset, jint length, + jboolean preferAnimation, jobject source) { std::unique_ptr<SkStream> stream(CreateByteArrayStreamAdaptor(env, byteArray, offset, length)); - return native_create(env, std::move(stream), source); + return native_create(env, std::move(stream), source, preferAnimation); } jint postProcessAndRelease(JNIEnv* env, jobject jimageDecoder, std::unique_ptr<Canvas> canvas) { @@ -514,11 +520,11 @@ static jobject ImageDecoder_nGetColorSpace(JNIEnv* env, jobject /*clazz*/, jlong } static const JNINativeMethod gImageDecoderMethods[] = { - { "nCreate", "(JLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateAsset }, - { "nCreate", "(Ljava/nio/ByteBuffer;IILandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteBuffer }, - { "nCreate", "([BIILandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteArray }, - { "nCreate", "(Ljava/io/InputStream;[BLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateInputStream }, - { "nCreate", "(Ljava/io/FileDescriptor;Landroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateFd }, + { "nCreate", "(JZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateAsset }, + { "nCreate", "(Ljava/nio/ByteBuffer;IIZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteBuffer }, + { "nCreate", "([BIIZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteArray }, + { "nCreate", "(Ljava/io/InputStream;[BZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateInputStream }, + { "nCreate", "(Ljava/io/FileDescriptor;ZLandroid/graphics/ImageDecoder$Source;)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateFd }, { "nDecodeBitmap", "(JLandroid/graphics/ImageDecoder;ZIILandroid/graphics/Rect;ZIZZZJZ)Landroid/graphics/Bitmap;", (void*) ImageDecoder_nDecodeBitmap }, { "nGetSampledSize","(JI)Landroid/util/Size;", (void*) ImageDecoder_nGetSampledSize }, diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto index e43b6a04b93c..e62af74fd439 100644 --- a/core/proto/android/providers/settings.proto +++ b/core/proto/android/providers/settings.proto @@ -20,6 +20,7 @@ package android.providers.settings; option java_multiple_files = true; option java_outer_classname = "SettingsServiceProto"; +import "frameworks/base/core/proto/android/providers/settings/config.proto"; import "frameworks/base/core/proto/android/providers/settings/global.proto"; import "frameworks/base/core/proto/android/providers/settings/secure.proto"; import "frameworks/base/core/proto/android/providers/settings/system.proto"; @@ -33,6 +34,9 @@ message SettingsServiceDumpProto { // Global settings optional GlobalSettingsProto global_settings = 2; + + // Config settings + optional ConfigSettingsProto config_settings = 3; } message UserSettingsProto { diff --git a/core/proto/android/providers/settings/config.proto b/core/proto/android/providers/settings/config.proto new file mode 100644 index 000000000000..cc2419614d93 --- /dev/null +++ b/core/proto/android/providers/settings/config.proto @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = "proto2"; +package android.providers.settings; + +option java_multiple_files = true; + +import "frameworks/base/core/proto/android/providers/settings/common.proto"; +import "frameworks/base/core/proto/android/privacy.proto"; + +message ConfigSettingsProto { + option (android.msg_privacy).dest = DEST_EXPLICIT; + + repeated SettingsOperationProto historical_operations = 1; + repeated NamespaceProto extra_namespaces = 2; + repeated SettingProto activity_manager_native_boot_settings = 3; + repeated SettingProto activity_manager_settings = 4; + repeated SettingProto app_compat_settings = 5; + repeated SettingProto autofill_settings = 6; + repeated SettingProto connectivity_settings = 7; + repeated SettingProto content_capture_settings = 8; + repeated SettingProto dex_boot_settings = 9; + repeated SettingProto game_driver_settings = 10; + repeated SettingProto input_native_boot_settings = 11; + repeated SettingProto netd_native_settings = 12; + repeated SettingProto privacy_settings = 13; + repeated SettingProto rollback_boot_settings = 14; + repeated SettingProto rollback_settings = 15; + repeated SettingProto runtime_native_boot_settings = 16; + repeated SettingProto runtime_native_settings = 17; + repeated SettingProto runtime_settings = 18; + repeated SettingProto storage_settings = 19; + repeated SettingProto systemui_settings = 20; + repeated SettingProto telephony_settings = 21; + repeated SettingProto textclassifier_settings = 22; + + message NamespaceProto { + optional string namespace = 1; + repeated SettingProto settings = 2; + } +}
\ No newline at end of file diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index fa4e08520126..40c2cbedc73d 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1707,6 +1707,7 @@ manifest. --> <string-array name="config_forceQueryablePackages" translatable="false"> <item>com.android.settings</item> + <item>com.android.providers.settings</item> <!-- Add packages here --> </string-array> diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 226c26900d17..4187c806c66a 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -24,6 +24,7 @@ applications that come with the platform <permission name="android.permission.PROVIDE_RESOLVER_RANKER_SERVICE" /> <permission name="android.permission.MONITOR_DEFAULT_SMS_PACKAGE" /> <permission name="android.permission.REQUEST_NOTIFICATION_ASSISTANT_SERVICE" /> + <permission name="android.permission.INTERACT_ACROSS_USERS" /> </privapp-permissions> <privapp-permissions package="com.android.apps.tag"> diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java index 2d5babc5ebdb..150a941c061e 100644 --- a/graphics/java/android/graphics/ImageDecoder.java +++ b/graphics/java/android/graphics/ImageDecoder.java @@ -214,7 +214,7 @@ public final class ImageDecoder implements AutoCloseable { /* @hide */ @NonNull - abstract ImageDecoder createImageDecoder() throws IOException; + abstract ImageDecoder createImageDecoder(boolean preferAnimation) throws IOException; }; private static class ByteArraySource extends Source { @@ -228,8 +228,8 @@ public final class ImageDecoder implements AutoCloseable { private final int mLength; @Override - public ImageDecoder createImageDecoder() throws IOException { - return nCreate(mData, mOffset, mLength, this); + public ImageDecoder createImageDecoder(boolean preferAnimation) throws IOException { + return nCreate(mData, mOffset, mLength, preferAnimation, this); } } @@ -240,14 +240,14 @@ public final class ImageDecoder implements AutoCloseable { private final ByteBuffer mBuffer; @Override - public ImageDecoder createImageDecoder() throws IOException { + public ImageDecoder createImageDecoder(boolean preferAnimation) throws IOException { if (!mBuffer.isDirect() && mBuffer.hasArray()) { int offset = mBuffer.arrayOffset() + mBuffer.position(); int length = mBuffer.limit() - mBuffer.position(); - return nCreate(mBuffer.array(), offset, length, this); + return nCreate(mBuffer.array(), offset, length, preferAnimation, this); } ByteBuffer buffer = mBuffer.slice(); - return nCreate(buffer, buffer.position(), buffer.limit(), this); + return nCreate(buffer, buffer.position(), buffer.limit(), preferAnimation, this); } } @@ -267,7 +267,7 @@ public final class ImageDecoder implements AutoCloseable { Resources getResources() { return mResources; } @Override - public ImageDecoder createImageDecoder() throws IOException { + public ImageDecoder createImageDecoder(boolean preferAnimation) throws IOException { AssetFileDescriptor assetFd = null; try { if (mUri.getScheme() == ContentResolver.SCHEME_CONTENT) { @@ -284,26 +284,26 @@ public final class ImageDecoder implements AutoCloseable { throw new FileNotFoundException(mUri.toString()); } - return createFromStream(is, true, this); + return createFromStream(is, true, preferAnimation, this); } - return createFromAssetFileDescriptor(assetFd, this); + return createFromAssetFileDescriptor(assetFd, preferAnimation, this); } } @NonNull private static ImageDecoder createFromFile(@NonNull File file, - @NonNull Source source) throws IOException { + boolean preferAnimation, @NonNull Source source) throws IOException { FileInputStream stream = new FileInputStream(file); FileDescriptor fd = stream.getFD(); try { Os.lseek(fd, 0, SEEK_CUR); } catch (ErrnoException e) { - return createFromStream(stream, true, source); + return createFromStream(stream, true, preferAnimation, source); } ImageDecoder decoder = null; try { - decoder = nCreate(fd, source); + decoder = nCreate(fd, preferAnimation, source); } finally { if (decoder == null) { IoUtils.closeQuietly(stream); @@ -317,12 +317,12 @@ public final class ImageDecoder implements AutoCloseable { @NonNull private static ImageDecoder createFromStream(@NonNull InputStream is, - boolean closeInputStream, Source source) throws IOException { + boolean closeInputStream, boolean preferAnimation, Source source) throws IOException { // Arbitrary size matches BitmapFactory. byte[] storage = new byte[16 * 1024]; ImageDecoder decoder = null; try { - decoder = nCreate(is, storage, source); + decoder = nCreate(is, storage, preferAnimation, source); } finally { if (decoder == null) { if (closeInputStream) { @@ -340,7 +340,7 @@ public final class ImageDecoder implements AutoCloseable { @NonNull private static ImageDecoder createFromAssetFileDescriptor(@NonNull AssetFileDescriptor assetFd, - Source source) throws IOException { + boolean preferAnimation, Source source) throws IOException { final FileDescriptor fd = assetFd.getFileDescriptor(); final long offset = assetFd.getStartOffset(); @@ -348,9 +348,9 @@ public final class ImageDecoder implements AutoCloseable { try { try { Os.lseek(fd, offset, SEEK_SET); - decoder = nCreate(fd, source); + decoder = nCreate(fd, preferAnimation, source); } catch (ErrnoException e) { - decoder = createFromStream(new FileInputStream(fd), true, source); + decoder = createFromStream(new FileInputStream(fd), true, preferAnimation, source); } } finally { if (decoder == null) { @@ -388,7 +388,7 @@ public final class ImageDecoder implements AutoCloseable { public int getDensity() { return mInputDensity; } @Override - public ImageDecoder createImageDecoder() throws IOException { + public ImageDecoder createImageDecoder(boolean preferAnimation) throws IOException { synchronized (this) { if (mInputStream == null) { @@ -396,7 +396,7 @@ public final class ImageDecoder implements AutoCloseable { } InputStream is = mInputStream; mInputStream = null; - return createFromStream(is, false, this); + return createFromStream(is, false, preferAnimation, this); } } } @@ -434,14 +434,14 @@ public final class ImageDecoder implements AutoCloseable { } @Override - public ImageDecoder createImageDecoder() throws IOException { + public ImageDecoder createImageDecoder(boolean preferAnimation) throws IOException { synchronized (this) { if (mAssetInputStream == null) { throw new IOException("Cannot reuse AssetInputStreamSource"); } AssetInputStream ais = mAssetInputStream; mAssetInputStream = null; - return createFromAsset(ais, this); + return createFromAsset(ais, preferAnimation, this); } } } @@ -469,7 +469,7 @@ public final class ImageDecoder implements AutoCloseable { } @Override - public ImageDecoder createImageDecoder() throws IOException { + public ImageDecoder createImageDecoder(boolean preferAnimation) throws IOException { TypedValue value = new TypedValue(); // This is just used in order to access the underlying Asset and // keep it alive. @@ -483,7 +483,7 @@ public final class ImageDecoder implements AutoCloseable { } } - return createFromAsset((AssetInputStream) is, this); + return createFromAsset((AssetInputStream) is, preferAnimation, this); } } @@ -491,11 +491,11 @@ public final class ImageDecoder implements AutoCloseable { * ImageDecoder will own the AssetInputStream. */ private static ImageDecoder createFromAsset(AssetInputStream ais, - Source source) throws IOException { + boolean preferAnimation, Source source) throws IOException { ImageDecoder decoder = null; try { long asset = ais.getNativeAsset(); - decoder = nCreate(asset, source); + decoder = nCreate(asset, preferAnimation, source); } finally { if (decoder == null) { IoUtils.closeQuietly(ais); @@ -517,9 +517,9 @@ public final class ImageDecoder implements AutoCloseable { private final String mFileName; @Override - public ImageDecoder createImageDecoder() throws IOException { + public ImageDecoder createImageDecoder(boolean preferAnimation) throws IOException { InputStream is = mAssets.open(mFileName); - return createFromAsset((AssetInputStream) is, this); + return createFromAsset((AssetInputStream) is, preferAnimation, this); } } @@ -531,8 +531,8 @@ public final class ImageDecoder implements AutoCloseable { private final File mFile; @Override - public ImageDecoder createImageDecoder() throws IOException { - return createFromFile(mFile, this); + public ImageDecoder createImageDecoder(boolean preferAnimation) throws IOException { + return createFromFile(mFile, preferAnimation, this); } } @@ -544,7 +544,7 @@ public final class ImageDecoder implements AutoCloseable { private final Callable<AssetFileDescriptor> mCallable; @Override - public ImageDecoder createImageDecoder() throws IOException { + public ImageDecoder createImageDecoder(boolean preferAnimation) throws IOException { AssetFileDescriptor assetFd = null; try { assetFd = mCallable.call(); @@ -555,7 +555,7 @@ public final class ImageDecoder implements AutoCloseable { throw new IOException(e); } } - return createFromAssetFileDescriptor(assetFd, this); + return createFromAssetFileDescriptor(assetFd, preferAnimation, this); } } @@ -1740,7 +1740,7 @@ public final class ImageDecoder implements AutoCloseable { @NonNull private static Drawable decodeDrawableImpl(@NonNull Source src, @Nullable OnHeaderDecodedListener listener) throws IOException { - try (ImageDecoder decoder = src.createImageDecoder()) { + try (ImageDecoder decoder = src.createImageDecoder(true /*preferAnimation*/)) { decoder.mSource = src; decoder.callHeaderDecoded(listener, src); @@ -1844,7 +1844,7 @@ public final class ImageDecoder implements AutoCloseable { @NonNull private static Bitmap decodeBitmapImpl(@NonNull Source src, @Nullable OnHeaderDecodedListener listener) throws IOException { - try (ImageDecoder decoder = src.createImageDecoder()) { + try (ImageDecoder decoder = src.createImageDecoder(false /*preferAnimation*/)) { decoder.mSource = src; decoder.callHeaderDecoded(listener, src); @@ -1971,15 +1971,17 @@ public final class ImageDecoder implements AutoCloseable { } } - private static native ImageDecoder nCreate(long asset, Source src) throws IOException; - private static native ImageDecoder nCreate(ByteBuffer buffer, int position, - int limit, Source src) throws IOException; + private static native ImageDecoder nCreate(long asset, + boolean preferAnimation, Source src) throws IOException; + private static native ImageDecoder nCreate(ByteBuffer buffer, int position, int limit, + boolean preferAnimation, Source src) throws IOException; private static native ImageDecoder nCreate(byte[] data, int offset, int length, - Source src) throws IOException; + boolean preferAnimation, Source src) throws IOException; private static native ImageDecoder nCreate(InputStream is, byte[] storage, - Source src) throws IOException; + boolean preferAnimation, Source src) throws IOException; // The fd must be seekable. - private static native ImageDecoder nCreate(FileDescriptor fd, Source src) throws IOException; + private static native ImageDecoder nCreate(FileDescriptor fd, + boolean preferAnimation, Source src) throws IOException; @NonNull private static native Bitmap nDecodeBitmap(long nativePtr, @NonNull ImageDecoder decoder, diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index 510016585afc..35abc57fbe57 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -138,14 +138,14 @@ void VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe err = mCreateInstance(&instance_create, nullptr, &mInstance); LOG_ALWAYS_FATAL_IF(err < 0); + GET_INST_PROC(CreateDevice); GET_INST_PROC(DestroyInstance); + GET_INST_PROC(EnumerateDeviceExtensionProperties); GET_INST_PROC(EnumeratePhysicalDevices); - GET_INST_PROC(GetPhysicalDeviceProperties); - GET_INST_PROC(GetPhysicalDeviceQueueFamilyProperties); GET_INST_PROC(GetPhysicalDeviceFeatures2); GET_INST_PROC(GetPhysicalDeviceImageFormatProperties2); - GET_INST_PROC(CreateDevice); - GET_INST_PROC(EnumerateDeviceExtensionProperties); + GET_INST_PROC(GetPhysicalDeviceProperties); + GET_INST_PROC(GetPhysicalDeviceQueueFamilyProperties); uint32_t gpuCount; LOG_ALWAYS_FATAL_IF(mEnumeratePhysicalDevices(mInstance, &gpuCount, nullptr)); @@ -312,29 +312,27 @@ void VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe LOG_ALWAYS_FATAL_IF(mCreateDevice(mPhysicalDevice, &deviceInfo, nullptr, &mDevice)); - GET_DEV_PROC(GetDeviceQueue); - GET_DEV_PROC(DeviceWaitIdle); - GET_DEV_PROC(DestroyDevice); - GET_DEV_PROC(CreateCommandPool); - GET_DEV_PROC(DestroyCommandPool); GET_DEV_PROC(AllocateCommandBuffers); - GET_DEV_PROC(FreeCommandBuffers); - GET_DEV_PROC(ResetCommandBuffer); GET_DEV_PROC(BeginCommandBuffer); - GET_DEV_PROC(EndCommandBuffer); GET_DEV_PROC(CmdPipelineBarrier); - GET_DEV_PROC(GetDeviceQueue); - GET_DEV_PROC(QueueSubmit); - GET_DEV_PROC(QueueWaitIdle); - GET_DEV_PROC(DeviceWaitIdle); + GET_DEV_PROC(CreateCommandPool); + GET_DEV_PROC(CreateFence); GET_DEV_PROC(CreateSemaphore); + GET_DEV_PROC(DestroyCommandPool); + GET_DEV_PROC(DestroyDevice); + GET_DEV_PROC(DestroyFence); GET_DEV_PROC(DestroySemaphore); - GET_DEV_PROC(ImportSemaphoreFdKHR); + GET_DEV_PROC(DeviceWaitIdle); + GET_DEV_PROC(EndCommandBuffer); + GET_DEV_PROC(FreeCommandBuffers); + GET_DEV_PROC(GetDeviceQueue); GET_DEV_PROC(GetSemaphoreFdKHR); - GET_DEV_PROC(CreateFence); - GET_DEV_PROC(DestroyFence); - GET_DEV_PROC(WaitForFences); + GET_DEV_PROC(ImportSemaphoreFdKHR); + GET_DEV_PROC(QueueSubmit); + GET_DEV_PROC(QueueWaitIdle); + GET_DEV_PROC(ResetCommandBuffer); GET_DEV_PROC(ResetFences); + GET_DEV_PROC(WaitForFences); } void VulkanManager::initialize() { diff --git a/location/lib/Android.bp b/location/lib/Android.bp index ab01ddbe4e60..db63889d7743 100644 --- a/location/lib/Android.bp +++ b/location/lib/Android.bp @@ -22,6 +22,8 @@ java_sdk_library { ], api_packages: ["com.android.location.provider"], srcs_lib: "framework-minus-apex", - srcs_lib_whitelist_dirs: ["location/java"], - srcs_lib_whitelist_pkgs: ["com.android.internal.location"], + // TODO(b/70046217): remove core/java and android below. It was added to provide definitions for + // types like android.os.Bundle + srcs_lib_whitelist_dirs: ["core/java", "location/java"], + srcs_lib_whitelist_pkgs: ["android", "com.android.internal.location"], } diff --git a/packages/CarSystemUI/AndroidManifest.xml b/packages/CarSystemUI/AndroidManifest.xml index 195d4fee5162..261b9f508ccd 100644 --- a/packages/CarSystemUI/AndroidManifest.xml +++ b/packages/CarSystemUI/AndroidManifest.xml @@ -21,4 +21,8 @@ coreApp="true"> <!-- This permission is required to monitor car power state. --> <uses-permission android:name="android.car.permission.CAR_POWER" /> + <!-- This permission is required to get the trusted device list of a user. --> + <uses-permission android:name="android.car.permission.CAR_ENROLL_TRUST"/> + <!-- This permission is required to get bluetooth broadcast. --> + <uses-permission android:name="android.permission.BLUETOOTH" /> </manifest> diff --git a/packages/CarSystemUI/res/drawable/unlock_dialog_background.xml b/packages/CarSystemUI/res/drawable/unlock_dialog_background.xml new file mode 100644 index 000000000000..bec6ba7b7c4f --- /dev/null +++ b/packages/CarSystemUI/res/drawable/unlock_dialog_background.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2019 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="@color/unlock_dialog_background_color"/> + <padding + android:bottom="@*android:dimen/car_padding_2" + android:left="@*android:dimen/car_padding_2" + android:right="@*android:dimen/car_padding_2" + android:top="@*android:dimen/car_padding_2"/> + <corners + android:radius="@dimen/unlock_dialog_radius"/> +</shape>
\ No newline at end of file diff --git a/packages/CarSystemUI/res/layout/trust_agent_unlock_dialog.xml b/packages/CarSystemUI/res/layout/trust_agent_unlock_dialog.xml new file mode 100644 index 000000000000..2d9901c30d02 --- /dev/null +++ b/packages/CarSystemUI/res/layout/trust_agent_unlock_dialog.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2019 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:gravity="center"> + + <LinearLayout + android:layout_width="@dimen/unlock_dialog_width" + android:layout_height="wrap_content" + android:gravity="center" + android:layout_gravity="center" + android:orientation="vertical" + android:background="@drawable/unlock_dialog_background" + android:padding="@*android:dimen/car_padding_2"> + <FrameLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + <ProgressBar + android:layout_gravity="center" + android:layout_width="@dimen/unlock_dialog_progress_bar_size" + android:layout_height="@dimen/unlock_dialog_progress_bar_size" /> + <ImageView + android:id="@+id/avatar" + android:layout_gravity="center" + android:layout_width="@dimen/unlock_dialog_avatar_size" + android:layout_height="@dimen/unlock_dialog_avatar_size" + android:scaleType="fitCenter"/> + </FrameLayout> + + <TextView + android:id="@+id/user_name" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:text="@string/unlock_dialog_default_user_name" + android:textSize="@*android:dimen/car_body1_size" + android:textColor="@android:color/white"/> + + <TextView + android:id="@+id/unlocking_text" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_marginTop="@*android:dimen/car_padding_1" + android:text="@string/unlock_dialog_message_default" + android:textSize="@*android:dimen/car_body4_size" + android:textColor="@color/unlock_dialog_message_text_default"/> + + <Button + android:id="@+id/enter_pin_button" + android:layout_marginTop="@*android:dimen/car_padding_1" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:text="@string/unlock_dialog_button_text_pin" + style="@style/UnlockDialogButton"/> + </LinearLayout> +</FrameLayout>
\ No newline at end of file diff --git a/packages/CarSystemUI/res/values/colors_car.xml b/packages/CarSystemUI/res/values/colors_car.xml index 69ab3f3cf957..0a3f7aa92d84 100644 --- a/packages/CarSystemUI/res/values/colors_car.xml +++ b/packages/CarSystemUI/res/values/colors_car.xml @@ -26,4 +26,9 @@ <color name="car_user_switcher_add_user_background_color">@*android:color/car_dark_blue_grey_600</color> <color name="car_user_switcher_add_user_add_sign_color">@*android:color/car_body1_light</color> + <!-- colors for unlock dialog --> + <color name="unlock_dialog_background_color">#ff282a2d</color> + <color name="unlock_dialog_message_text_default">@*android:color/car_grey_400</color> + <color name="unlock_dialog_enter_pin_text_color">#ff66b5ff</color> + </resources> diff --git a/packages/CarSystemUI/res/values/dimens_car.xml b/packages/CarSystemUI/res/values/dimens_car.xml index 42a764959545..9cb09c942781 100644 --- a/packages/CarSystemUI/res/values/dimens_car.xml +++ b/packages/CarSystemUI/res/values/dimens_car.xml @@ -43,4 +43,10 @@ <!-- This must be the negative of car_user_switcher_container_height for the animation. --> <dimen name="car_user_switcher_container_anim_height">-420dp</dimen> + <!-- dimensions for the unlock dialog --> + <dimen name="unlock_dialog_width">500dp</dimen> + <dimen name="unlock_dialog_radius">16dp</dimen> + <dimen name="unlock_dialog_avatar_size">100dp</dimen> + <dimen name="unlock_dialog_progress_bar_size">140dp</dimen> + </resources> diff --git a/packages/CarSystemUI/res/values/integers_car.xml b/packages/CarSystemUI/res/values/integers_car.xml index be2cb0d8d900..862ba751aa55 100644 --- a/packages/CarSystemUI/res/values/integers_car.xml +++ b/packages/CarSystemUI/res/values/integers_car.xml @@ -31,5 +31,7 @@ <!--Percentage of the screen height, from the bottom, that a notification panel being peeked at will result in remaining closed the panel if released--> <integer name="notification_settle_close_percentage">80</integer> + <!-- The delay before the unlock dialog pops up --> + <integer name="unlock_dialog_delay_ms">3000</integer> </resources> diff --git a/packages/CarSystemUI/res/values/strings_car.xml b/packages/CarSystemUI/res/values/strings_car.xml index 83e91c57ccc3..717692e2f02f 100644 --- a/packages/CarSystemUI/res/values/strings_car.xml +++ b/packages/CarSystemUI/res/values/strings_car.xml @@ -29,4 +29,19 @@ <string name="user_add_user_message_setup">When you add a new user, that person needs to set up their space.</string> <!-- Message to inform user that the newly created user will have permissions to update apps for all other users. [CHAR LIMIT=100] --> <string name="user_add_user_message_update">Any user can update apps for all other users.</string> + <!-- Default messages displayed on the unlock dialog before unlock advertising started. [CHAR LIMIT=30]--> + <string name="unlock_dialog_message_default">Waiting\u2026</string> + <!-- Message to inform user that the IHU is looking for trusted device. [CHAR LIMIT=30] --> + <string name="unlock_dialog_message_start">Looking for trusted device\u2026</string> + + <!-- Cancel Button text for user who has PIN as security lock. [CHAR LIMIT=30] --> + <string name="unlock_dialog_button_text_pin">Enter PIN instead</string> + <!-- Cancel Button text for user who has Pattern as security lock. [CHAR LIMIT=30] --> + <string name="unlock_dialog_button_text_pattern">Enter Pattern instead</string> + <!-- Cancel Button text for user who has Password as security lock. [CHAR LIMIT=30] --> + <string name="unlock_dialog_button_text_password">Enter Password instead</string> + <!-- Default user name shows on unlock dialog --> + <string name="unlock_dialog_default_user_name">Default Name</string> + <!-- Default title for unlock dialog --> + <string name="unlock_dialog_title">Unlock Dialogue</string> </resources> diff --git a/packages/CarSystemUI/res/values/styles.xml b/packages/CarSystemUI/res/values/styles.xml index 371bebdebc86..a9423bf6f260 100644 --- a/packages/CarSystemUI/res/values/styles.xml +++ b/packages/CarSystemUI/res/values/styles.xml @@ -46,4 +46,12 @@ <item name="android:layout_width">96dp</item> <item name="android:background">@drawable/nav_button_background</item> </style> + + <style name="UnlockDialogButton"> + <item name="android:background">?android:attr/selectableItemBackground</item> + <item name="android:textAlignment">center</item> + <item name="android:textColor">@color/unlock_dialog_enter_pin_text_color</item> + <item name="android:paddingHorizontal">16dp</item> + <item name="android:textAllCaps">false</item> + </style> </resources>
\ No newline at end of file diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index b1f979708615..97fbea6ea237 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -26,6 +26,7 @@ import android.car.Car; import android.car.drivingstate.CarDrivingStateEvent; import android.car.drivingstate.CarUxRestrictionsManager; import android.car.hardware.power.CarPowerManager.CarPowerStateListener; +import android.car.trust.CarTrustAgentEnrollmentManager; import android.content.Context; import android.content.res.Configuration; import android.graphics.PixelFormat; @@ -957,8 +958,12 @@ public class CarStatusBar extends StatusBar implements UserSwitcherController userSwitcherController = Dependency.get(UserSwitcherController.class); if (userSwitcherController.useFullscreenUserSwitcher()) { + Car car = Car.createCar(mContext); + CarTrustAgentEnrollmentManager enrollmentManager = (CarTrustAgentEnrollmentManager) car + .getCarManager(Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE); mFullscreenUserSwitcher = new FullscreenUserSwitcher(this, - mStatusBarWindow.findViewById(R.id.fullscreen_user_switcher_stub), mContext); + mStatusBarWindow.findViewById(R.id.fullscreen_user_switcher_stub), + enrollmentManager, mContext); } else { super.createUserSwitcher(); } diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarTrustAgentUnlockDialogHelper.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarTrustAgentUnlockDialogHelper.java new file mode 100644 index 000000000000..78bb1bcf24a8 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarTrustAgentUnlockDialogHelper.java @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.car; + +import android.app.admin.DevicePolicyManager; +import android.bluetooth.BluetoothAdapter; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.graphics.PixelFormat; +import android.os.Handler; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.internal.widget.LockPatternUtils; +import com.android.systemui.R; + +/** + * A helper class displays an unlock dialog and receives broadcast about detecting trusted device + * & unlocking state to show the appropriate message on the dialog. + */ +class CarTrustAgentUnlockDialogHelper extends BroadcastReceiver{ + private static final String TAG = CarTrustAgentUnlockDialogHelper.class.getSimpleName(); + + private final Context mContext; + private final WindowManager mWindowManager; + private final UserManager mUserManager; + private final WindowManager.LayoutParams mParams; + /** + * Not using Dialog because context passed from {@link FullscreenUserSwitcher} is not an + * activity. + */ + private final View mUnlockDialog; + private final TextView mUnlockingText; + private final Button mButton; + private final IntentFilter mFilter; + private int mUid; + private boolean mIsDialogShowing; + private OnHideListener mOnHideListener; + + CarTrustAgentUnlockDialogHelper(Context context) { + mContext = context; + mUserManager = mContext.getSystemService(UserManager.class); + mWindowManager = mContext.getSystemService(WindowManager.class); + mParams = createLayoutParams(); + mFilter = getIntentFilter(); + + mParams.packageName = mContext.getPackageName(); + mParams.setTitle(mContext.getString(R.string.unlock_dialog_title)); + + mUnlockDialog = LayoutInflater.from(mContext).inflate( + R.layout.trust_agent_unlock_dialog, null); + mUnlockDialog.setLayoutParams(mParams); + + mUnlockingText = mUnlockDialog.findViewById(R.id.unlocking_text); + mButton = mUnlockDialog.findViewById(R.id.enter_pin_button); + mButton.setOnClickListener(v -> { + hideUnlockDialog(/* notifyOnHideListener= */true); + // TODO(b/138250105) Stop unlock advertising + }); + + BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + if (bluetoothAdapter != null + && bluetoothAdapter.getLeState() == BluetoothAdapter.STATE_BLE_ON) { + mUnlockingText.setText(R.string.unlock_dialog_message_start); + } + } + + /** + * This filter is listening on: + * {@link BluetoothAdapter#ACTION_BLE_STATE_CHANGED} for starting unlock advertising; + * {@link Intent#ACTION_USER_UNLOCKED} for IHU unlocked + */ + private IntentFilter getIntentFilter() { + IntentFilter filter = new IntentFilter(); + filter.addAction(BluetoothAdapter.ACTION_BLE_STATE_CHANGED); + filter.addAction(Intent.ACTION_USER_UNLOCKED); + return filter; + } + + /** + * Show dialog for the given user + */ + void showUnlockDialog(int uid, OnHideListener listener) { + showUnlockDialogAfterDelay(uid, 0, listener); + } + + /** + * Show dialog for the given user after the certain time of delay has elapsed + * + * @param uid the user to unlock + * @param listener listener that listens to dialog hide + */ + void showUnlockDialogAfterDelay(int uid, OnHideListener listener) { + long delayMillis = mContext.getResources().getInteger(R.integer.unlock_dialog_delay_ms); + showUnlockDialogAfterDelay(uid, delayMillis, listener); + } + + /** + * Show dialog for the given user after the supplied delay has elapsed + */ + private void showUnlockDialogAfterDelay(int uid, long delayMillis, OnHideListener listener) { + setUid(uid); + mOnHideListener = listener; + if (!mIsDialogShowing) { + logd("Receiver registered"); + mContext.registerReceiverAsUser(this, UserHandle.ALL, mFilter, + /* broadcastPermission= */ null, + /* scheduler= */ null); + new Handler().postDelayed(() -> { + if (!mUserManager.isUserUnlocked(uid)) { + logd("Showed unlock dialog for user: " + uid + " after " + delayMillis + + " delay."); + mWindowManager.addView(mUnlockDialog, mParams); + } + }, delayMillis); + } + mIsDialogShowing = true; + } + + private void setUid(int uid) { + mUid = uid; + TextView userName = mUnlockDialog.findViewById(R.id.user_name); + userName.setText(mUserManager.getUserInfo(mUid).name); + ImageView avatar = mUnlockDialog.findViewById(R.id.avatar); + avatar.setImageBitmap(mUserManager.getUserIcon(mUid)); + setButtonText(); + } + + private void hideUnlockDialog(boolean notifyOnHideListener) { + if (!mIsDialogShowing) { + return; + } + mWindowManager.removeView(mUnlockDialog); + logd("Receiver unregistered"); + mContext.unregisterReceiver(this); + if (notifyOnHideListener && mOnHideListener != null) { + mOnHideListener.onHide(); + } + mIsDialogShowing = false; + } + + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (action == null) { + return; + } + switch (action) { + case BluetoothAdapter.ACTION_BLE_STATE_CHANGED: + logd("Received ACTION_BLE_STATE_CHANGED"); + int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1); + if (state == BluetoothAdapter.STATE_BLE_ON) { + logd("Received BLE_ON"); + mUnlockingText.setText(R.string.unlock_dialog_message_start); + } + break; + case Intent.ACTION_USER_UNLOCKED: + int uid = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); + if (uid == mUid) { + logd("IHU unlocked"); + hideUnlockDialog(/* notifyOnHideListener= */false); + } else { + Log.e(TAG, "Received ACTION_USER_UNLOCKED for unexpected uid: " + uid); + } + break; + default: + Log.e(TAG, "Encountered unexpected action when attempting to set " + + "unlock state message: " + action); + } + } + + // Set button text based on security lock type + private void setButtonText() { + LockPatternUtils lockPatternUtils = new LockPatternUtils(mContext); + int passwordQuality = lockPatternUtils.getActivePasswordQuality(mUid); + switch (passwordQuality) { + // PIN + case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX: + // Pattern + case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING: + mButton.setText(R.string.unlock_dialog_button_text_pattern); + break; + // Password + case DevicePolicyManager.PASSWORD_QUALITY_MANAGED: + mButton.setText(R.string.unlock_dialog_button_text_password); + break; + default: + Log.e(TAG, "Encountered unexpected security type when attempting to set " + + "button text:" + passwordQuality); + } + } + + private WindowManager.LayoutParams createLayoutParams() { + return new WindowManager.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG, + WindowManager.LayoutParams.FLAG_FULLSCREEN + | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS + | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, + PixelFormat.TRANSLUCENT + ); + } + + private void logd(String message) { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, message); + } + } + + /** + * Listener used to notify when the dialog is hidden + */ + interface OnHideListener { + void onHide(); + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java index 0a167d9acf98..7cd6adbb3952 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java @@ -18,29 +18,60 @@ package com.android.systemui.statusbar.car; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.car.trust.CarTrustAgentEnrollmentManager; +import android.car.userlib.CarUserManagerHelper; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.UserInfo; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.Log; import android.view.View; import android.view.ViewStub; import androidx.recyclerview.widget.GridLayoutManager; import com.android.systemui.R; +import com.android.systemui.statusbar.car.UserGridRecyclerView.UserRecord; /** * Manages the fullscreen user switcher. */ public class FullscreenUserSwitcher { + private static final String TAG = FullscreenUserSwitcher.class.getSimpleName(); + // Because user 0 is headless, user count for single user is 2 + private static final int NUMBER_OF_BACKGROUND_USERS = 1; private final UserGridRecyclerView mUserGridView; private final View mParent; private final int mShortAnimDuration; private final CarStatusBar mStatusBar; + private final Context mContext; + private final UserManager mUserManager; + private final CarTrustAgentEnrollmentManager mEnrollmentManager; + private CarTrustAgentUnlockDialogHelper mUnlockDialogHelper; + private UserGridRecyclerView.UserRecord mSelectedUser; + private CarUserManagerHelper mCarUserManagerHelper; + private final BroadcastReceiver mUserUnlockReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "user 0 is unlocked, SharedPreference is accessible."); + } + showDialogForInitialUser(); + mContext.unregisterReceiver(mUserUnlockReceiver); + } + }; + - public FullscreenUserSwitcher(CarStatusBar statusBar, ViewStub containerStub, Context context) { + public FullscreenUserSwitcher(CarStatusBar statusBar, ViewStub containerStub, + CarTrustAgentEnrollmentManager enrollmentManager, Context context) { mStatusBar = statusBar; mParent = containerStub.inflate(); - // Hide the user grid by default. It will only be made visible by clicking on a cancel - // button in a bouncer. - hide(); + mEnrollmentManager = enrollmentManager; + mContext = context; + View container = mParent.findViewById(R.id.container); // Initialize user grid. @@ -50,9 +81,51 @@ public class FullscreenUserSwitcher { mUserGridView.setLayoutManager(layoutManager); mUserGridView.buildAdapter(); mUserGridView.setUserSelectionListener(this::onUserSelected); + mCarUserManagerHelper = new CarUserManagerHelper(context); + mUnlockDialogHelper = new CarTrustAgentUnlockDialogHelper(mContext); + mUserManager = mContext.getSystemService(UserManager.class); mShortAnimDuration = container.getResources() .getInteger(android.R.integer.config_shortAnimTime); + IntentFilter filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED); + if (mUserManager.isUserUnlocked(UserHandle.USER_SYSTEM)) { + // User0 is unlocked, switched to the initial user + showDialogForInitialUser(); + } else { + // listen to USER_UNLOCKED + mContext.registerReceiverAsUser(mUserUnlockReceiver, + UserHandle.getUserHandleForUid(UserHandle.USER_SYSTEM), + filter, + /* broadcastPermission= */ null, + /* scheduler */ null); + } + } + + private void showDialogForInitialUser() { + int initialUser = mCarUserManagerHelper.getInitialUser(); + UserInfo initialUserInfo = mUserManager.getUserInfo(initialUser); + mSelectedUser = new UserRecord(initialUserInfo, + /* isStartGuestSession= */ false, + /* isAddUser= */ false, + /* isForeground= */ true); + // For single user without trusted device, hide the user switcher. + if (!hasMultipleUsers() && !hasTrustedDevice(initialUser)) { + dismissUserSwitcher(); + return; + } + // Show unlock dialog for initial user + if (hasTrustedDevice(initialUser)) { + mUnlockDialogHelper.showUnlockDialogAfterDelay(initialUser, + () -> dismissUserSwitcher()); + } + } + + /** + * Check if there is only one possible user to login in. + * In a Multi-User system there is always one background user (user 0) + */ + private boolean hasMultipleUsers() { + return mUserManager.getUserCount() > NUMBER_OF_BACKGROUND_USERS + 1; } /** @@ -77,14 +150,33 @@ public class FullscreenUserSwitcher { } /** - * Every time user clicks on an item in the switcher, we hide the switcher, either - * gradually or immediately. + * Every time user clicks on an item in the switcher, if the clicked user has no trusted device, + * we hide the switcher, either gradually or immediately. + * + * If the user has trusted device, we show an unlock dialog to notify user the unlock state. + * When the unlock dialog is dismissed by user, we hide the unlock dialog and the switcher. * - * We dismiss the entire keyguard if user clicked on the foreground user (user we're already - * logged in as). + * We dismiss the entire keyguard when we hide the switcher if user clicked on the foreground + * user (user we're already logged in as). */ private void onUserSelected(UserGridRecyclerView.UserRecord record) { - if (record.mIsForeground) { + mSelectedUser = record; + if (hasTrustedDevice(record.mInfo.id)) { + mUnlockDialogHelper.showUnlockDialog(record.mInfo.id, () -> dismissUserSwitcher()); + return; + } + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "no trusted device enrolled for uid: " + record.mInfo.id); + } + dismissUserSwitcher(); + } + + private void dismissUserSwitcher() { + if (mSelectedUser == null) { + Log.e(TAG, "Request to dismiss user switcher, but no user selected"); + return; + } + if (mSelectedUser.mIsForeground) { hide(); mStatusBar.dismissKeyguard(); return; @@ -106,4 +198,8 @@ public class FullscreenUserSwitcher { }); } + + private boolean hasTrustedDevice(int uid) { + return !mEnrollmentManager.getEnrolledDeviceInfoForUser(uid).isEmpty(); + } } diff --git a/packages/SettingsLib/res/values/styles_support_preference.xml b/packages/SettingsLib/res/values/styles_support_preference.xml index 5d787f85e3ab..6e611960b2c7 100644 --- a/packages/SettingsLib/res/values/styles_support_preference.xml +++ b/packages/SettingsLib/res/values/styles_support_preference.xml @@ -26,7 +26,7 @@ <item name="allowDividerAbove">true</item> </style> - <style name="PreferenceThemeOverlay.SettingsBase" parent="@style/PreferenceThemeOverlay.v14.Material"> + <style name="PreferenceThemeOverlay.SettingsBase" parent="@style/PreferenceThemeOverlay"> <item name="footerPreferenceStyle">@style/Preference.FooterPreference.SettingsBase</item> </style> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 6adb305d4165..a3b0e6be7a4f 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -18,7 +18,9 @@ package com.android.providers.settings; import android.annotation.NonNull; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.provider.Settings; +import android.providers.settings.ConfigSettingsProto; import android.providers.settings.GlobalSettingsProto; import android.providers.settings.SecureSettingsProto; import android.providers.settings.SettingProto; @@ -28,24 +30,79 @@ import android.providers.settings.UserSettingsProto; import android.util.SparseBooleanArray; import android.util.proto.ProtoOutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** @hide */ class SettingsProtoDumpUtil { + private static final Map<String, Long> NAMESPACE_TO_FIELD_MAP = createNamespaceMap(); + private SettingsProtoDumpUtil() {} + private static Map<String, Long> createNamespaceMap() { + Map<String, Long> namespaceToFieldMap = new HashMap<>(); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + ConfigSettingsProto.ACTIVITY_MANAGER_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, + ConfigSettingsProto.ACTIVITY_MANAGER_NATIVE_BOOT_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_APP_COMPAT, + ConfigSettingsProto.APP_COMPAT_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_AUTOFILL, + ConfigSettingsProto.AUTOFILL_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_CONNECTIVITY, + ConfigSettingsProto.CONNECTIVITY_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_CONTENT_CAPTURE, + ConfigSettingsProto.CONTENT_CAPTURE_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_DEX_BOOT, + ConfigSettingsProto.DEX_BOOT_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_GAME_DRIVER, + ConfigSettingsProto.GAME_DRIVER_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_INPUT_NATIVE_BOOT, + ConfigSettingsProto.INPUT_NATIVE_BOOT_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_NETD_NATIVE, + ConfigSettingsProto.NETD_NATIVE_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_PRIVACY, + ConfigSettingsProto.PRIVACY_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_ROLLBACK, + ConfigSettingsProto.ROLLBACK_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_ROLLBACK_BOOT, + ConfigSettingsProto.ROLLBACK_BOOT_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_RUNTIME, + ConfigSettingsProto.RUNTIME_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_RUNTIME_NATIVE, + ConfigSettingsProto.RUNTIME_NATIVE_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_RUNTIME_NATIVE_BOOT, + ConfigSettingsProto.RUNTIME_NATIVE_BOOT_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_STORAGE, + ConfigSettingsProto.STORAGE_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_SYSTEMUI, + ConfigSettingsProto.SYSTEMUI_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_TELEPHONY, + ConfigSettingsProto.TELEPHONY_SETTINGS); + namespaceToFieldMap.put(DeviceConfig.NAMESPACE_TEXTCLASSIFIER, + ConfigSettingsProto.TEXTCLASSIFIER_SETTINGS); + return Collections.unmodifiableMap(namespaceToFieldMap); + } + static void dumpProtoLocked(SettingsProvider.SettingsRegistry settingsRegistry, ProtoOutputStream proto) { // Config settings SettingsState configSettings = settingsRegistry.getSettingsLocked( SettingsProvider.SETTINGS_TYPE_CONFIG, UserHandle.USER_SYSTEM); if (configSettings != null) { - // TODO(b/113100523): dump configuration settings after they are added + dumpProtoConfigSettingsLocked( + proto, SettingsServiceDumpProto.CONFIG_SETTINGS, configSettings); } // Global settings SettingsState globalSettings = settingsRegistry.getSettingsLocked( SettingsProvider.SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM); if (globalSettings != null) { - dumpProtoGlobalSettingsLocked(proto, SettingsServiceDumpProto.GLOBAL_SETTINGS, globalSettings); + dumpProtoGlobalSettingsLocked( + proto, SettingsServiceDumpProto.GLOBAL_SETTINGS, globalSettings); } // Per-user settings @@ -1599,6 +1656,33 @@ class SettingsProtoDumpUtil { // Settings.Global.INSTALL_NON_MARKET_APPS intentionally excluded since it's deprecated. } + private static void dumpProtoConfigSettingsLocked( + @NonNull ProtoOutputStream p, long fieldId, @NonNull SettingsState s) { + Map<String, List<String>> namespaceMap = new HashMap<>(); + final long token = p.start(fieldId); + s.dumpHistoricalOperations(p, ConfigSettingsProto.HISTORICAL_OPERATIONS); + for (String name : s.getSettingNamesLocked()) { + String namespace = name.substring(0, name.indexOf('/')); + if (NAMESPACE_TO_FIELD_MAP.containsKey(namespace)) { + dumpSetting(s, p, name, NAMESPACE_TO_FIELD_MAP.get(namespace)); + } else { + if (!namespaceMap.containsKey(namespace)) { + namespaceMap.put(namespace, new ArrayList<>()); + } + namespaceMap.get(namespace).add(name); + } + } + for (String namespace : namespaceMap.keySet()) { + final long namespacesToken = p.start(ConfigSettingsProto.EXTRA_NAMESPACES); + p.write(ConfigSettingsProto.NamespaceProto.NAMESPACE, namespace); + for (String name : namespaceMap.get(namespace)) { + dumpSetting(s, p, name, ConfigSettingsProto.NamespaceProto.SETTINGS); + } + p.end(namespacesToken); + } + p.end(token); + } + /** Dumps settings that use a common prefix into a repeated field. */ private static void dumpRepeatedSetting(@NonNull SettingsState settings, @NonNull ProtoOutputStream proto, String settingPrefix, long fieldId) { diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java index c732584eddfc..08996c38baf6 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java @@ -188,9 +188,8 @@ public class QuickStepContract { if ((sysuiStateFlags & SYSUI_STATE_BOUNCER_SHOWING) != 0) { return false; } - // Disable when in screen pinning, immersive, or the notifications are interactive - int disableFlags = SYSUI_STATE_SCREEN_PINNING - | SYSUI_STATE_NAV_BAR_HIDDEN + // Disable when in immersive, or the notifications are interactive + int disableFlags = SYSUI_STATE_NAV_BAR_HIDDEN | SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING; return (sysuiStateFlags & disableFlags) != 0; diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java b/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java index bc782a7d62eb..bb3bd781df66 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java @@ -100,7 +100,9 @@ public class InvocationLightsView extends View int cornerRadiusBottom = DisplayUtils.getCornerRadiusBottom(context); int cornerRadiusTop = DisplayUtils.getCornerRadiusTop(context); - mViewHeight = Math.max(cornerRadiusBottom, cornerRadiusTop); + // ensure that height is non-zero even for square corners + mViewHeight = Math.max(Math.max(cornerRadiusBottom, cornerRadiusTop), + DisplayUtils.convertDpToPx(LIGHT_HEIGHT_DP, context)); final int dualToneDarkTheme = Utils.getThemeAttr(mContext, R.attr.darkIconTheme); final int dualToneLightTheme = Utils.getThemeAttr(mContext, R.attr.lightIconTheme); diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java index c58b7db451b0..82ae30ac4bdf 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java @@ -39,8 +39,8 @@ class ZigZagClassifier extends FalsingClassifier { // most swipes will follow somewhat of a 'C' or 'S' shape, we allow more deviance along the // `SECONDARY` axis. private static final float MAX_X_PRIMARY_DEVIANCE = .05f; - private static final float MAX_Y_PRIMARY_DEVIANCE = .05f; - private static final float MAX_X_SECONDARY_DEVIANCE = .3f; + private static final float MAX_Y_PRIMARY_DEVIANCE = .1f; + private static final float MAX_X_SECONDARY_DEVIANCE = .6f; private static final float MAX_Y_SECONDARY_DEVIANCE = .3f; private final float mMaxXPrimaryDeviance; diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index 991d9fa549ac..0403a0505b00 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -248,7 +248,9 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { int numPages = Math.max(nTiles / mPages.get(0).maxTiles(), 1); // Add one more not full page if needed - numPages += (nTiles % mPages.get(0).maxTiles() == 0 ? 0 : 1); + if (nTiles > numPages * mPages.get(0).maxTiles()) { + numPages++; + } final int NP = mPages.size(); for (int i = 0; i < NP; i++) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt index 48d6de964b08..276afa7a3a94 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt @@ -41,7 +41,6 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.phone.HeadsUpManagerPhone import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.ShadeController -import com.android.systemui.statusbar.policy.HeadsUpManager import javax.inject.Inject import javax.inject.Singleton @@ -52,11 +51,13 @@ import kotlin.math.max */ @Singleton class PulseExpansionHandler @Inject -constructor(context: Context, - private val wakeUpCoordinator: NotificationWakeUpCoordinator, - private val bypassController: KeyguardBypassController, - private val headsUpManager: HeadsUpManagerPhone, - private val roundnessManager: NotificationRoundnessManager) : Gefingerpoken { +constructor( + context: Context, + private val wakeUpCoordinator: NotificationWakeUpCoordinator, + private val bypassController: KeyguardBypassController, + private val headsUpManager: HeadsUpManagerPhone, + private val roundnessManager: NotificationRoundnessManager +) : Gefingerpoken { companion object { private val RUBBERBAND_FACTOR_STATIC = 0.25f private val SPRING_BACK_ANIMATION_LENGTH_MS = 375 @@ -124,8 +125,8 @@ constructor(context: Context, } private fun maybeStartExpansion(event: MotionEvent): Boolean { - if (!wakeUpCoordinator.canShowPulsingHuns || qsExpanded - || bouncerShowing) { + if (!wakeUpCoordinator.canShowPulsingHuns || qsExpanded || + bouncerShowing) { return false } if (velocityTracker == null) { @@ -160,18 +161,18 @@ constructor(context: Context, } MotionEvent.ACTION_UP -> { - recycleVelocityTracker(); + recycleVelocityTracker() } MotionEvent.ACTION_CANCEL -> { - recycleVelocityTracker(); + recycleVelocityTracker() } } return false } private fun recycleVelocityTracker() { - velocityTracker?.recycle(); + velocityTracker?.recycle() velocityTracker = null } @@ -216,7 +217,7 @@ constructor(context: Context, "com.android.systemui:PULSEDRAG") } shadeController.goToLockedShade(mStartingChild) - leavingLockscreen = true; + leavingLockscreen = true isExpanding = false if (mStartingChild is ExpandableNotificationRow) { val row = mStartingChild as ExpandableNotificationRow? @@ -227,7 +228,7 @@ constructor(context: Context, private fun updateExpansionHeight(height: Float) { var expansionHeight = max(height, 0.0f) if (!mReachedWakeUpHeight && height > mWakeUpHeight) { - mReachedWakeUpHeight = true; + mReachedWakeUpHeight = true } if (mStartingChild != null) { val child = mStartingChild!! @@ -317,9 +318,11 @@ constructor(context: Context, } else null } - fun setUp(stackScroller: NotificationStackScrollLayout, - expansionCallback: ExpansionCallback, - shadeController: ShadeController) { + fun setUp( + stackScroller: NotificationStackScrollLayout, + expansionCallback: ExpansionCallback, + shadeController: ShadeController + ) { this.expansionCallback = expansionCallback this.shadeController = shadeController this.stackScroller = stackScroller diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ZigZagClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ZigZagClassifierTest.java index 25a1a75b0cbf..fb4c1ec11faa 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ZigZagClassifierTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ZigZagClassifierTest.java @@ -133,8 +133,8 @@ public class ZigZagClassifierTest extends ClassifierTest { // This test looks just like testPass_horizontalZigZagVerticalStraight but with // a shorter y range, making it look more crooked. appendMoveEvent(0, 0); - appendMoveEvent(5, 10); - appendMoveEvent(-5, 20); + appendMoveEvent(6, 10); + appendMoveEvent(-6, 20); assertThat(mClassifier.isFalseTouch(), is(true)); } diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 58520a322d54..bd30a86dcee1 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -18,29 +18,11 @@ package com.android.server.backup; import static com.android.internal.util.Preconditions.checkNotNull; -import android.Manifest; import android.annotation.Nullable; import android.annotation.UserIdInt; -import android.app.ActivityManager; -import android.app.backup.BackupManager; -import android.app.backup.IBackupManagerMonitor; -import android.app.backup.IBackupObserver; -import android.app.backup.IFullBackupRestoreObserver; -import android.app.backup.IRestoreSession; -import android.app.backup.ISelectBackupTransportCallback; -import android.app.job.JobParameters; -import android.app.job.JobScheduler; -import android.app.job.JobService; -import android.content.ComponentName; import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.Binder; import android.os.IBinder; -import android.os.ParcelFileDescriptor; import android.os.UserHandle; -import android.os.UserManager; -import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; @@ -82,20 +64,6 @@ public class BackupManagerService { } /** - * If {@code userId} is different from the calling user id, then the caller must hold the - * android.permission.INTERACT_ACROSS_USERS_FULL permission. - * - * @param userId User id on which the backup operation is being requested. - * @param message A message to include in the exception if it is thrown. - */ - private void enforceCallingPermissionOnUserId(@UserIdInt int userId, String message) { - if (Binder.getCallingUserHandle().getIdentifier() != userId) { - mContext.enforceCallingOrSelfPermission( - Manifest.permission.INTERACT_ACROSS_USERS_FULL, message); - } - } - - /** * Returns the {@link UserBackupManagerService} instance for the specified user {@code userId}. * If the user is not registered with the service (either the user is locked or not eligible for * the backup service) then return {@code null}. @@ -110,12 +78,7 @@ public class BackupManagerService { @VisibleForTesting UserBackupManagerService getServiceForUserIfCallerHasPermission( @UserIdInt int userId, String caller) { - enforceCallingPermissionOnUserId(userId, caller); - UserBackupManagerService userBackupManagerService = mServiceUsers.get(userId); - if (userBackupManagerService == null) { - Slog.w(TAG, "Called " + caller + " for unknown user: " + userId); - } - return userBackupManagerService; + return mTrampoline.getServiceForUserIfCallerHasPermission(userId, caller); } /* @@ -126,606 +89,6 @@ public class BackupManagerService { // TODO (b/118520567): Stop hardcoding system user when we pass in user id as a parameter // --------------------------------------------- - // BACKUP AGENT OPERATIONS - // --------------------------------------------- - - /** - * An app's backup agent calls this method to let the service know that there's new data to - * backup for their app {@code packageName}. Only used for apps participating in key-value - * backup. - */ - public void dataChanged(@UserIdInt int userId, String packageName) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "dataChanged()"); - - if (userBackupManagerService != null) { - userBackupManagerService.dataChanged(packageName); - } - } - - /** - * Callback: a requested backup agent has been instantiated. This should only be called from the - * {@link ActivityManager}. - */ - public void agentConnected(@UserIdInt int userId, String packageName, IBinder agentBinder) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "agentConnected()"); - - if (userBackupManagerService != null) { - userBackupManagerService.agentConnected(packageName, agentBinder); - } - } - - /** - * Callback: a backup agent has failed to come up, or has unexpectedly quit. This should only be - * called from the {@link ActivityManager}. - */ - public void agentDisconnected(@UserIdInt int userId, String packageName) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "agentDisconnected()"); - - if (userBackupManagerService != null) { - userBackupManagerService.agentDisconnected(packageName); - } - } - - /** - * Used by a currently-active backup agent to notify the service that it has completed its given - * outstanding asynchronous backup/restore operation. - */ - public void opComplete(@UserIdInt int userId, int token, long result) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "opComplete()"); - - if (userBackupManagerService != null) { - userBackupManagerService.opComplete(token, result); - } - } - - // --------------------------------------------- - // TRANSPORT OPERATIONS - // --------------------------------------------- - - /** Run an initialize operation for the given transports {@code transportNames}. */ - public void initializeTransports( - @UserIdInt int userId, String[] transportNames, IBackupObserver observer) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "initializeTransports()"); - - if (userBackupManagerService != null) { - userBackupManagerService.initializeTransports(transportNames, observer); - } - } - - /** - * Clear the given package {@code packageName}'s backup data from the transport {@code - * transportName}. - */ - public void clearBackupData(@UserIdInt int userId, String transportName, String packageName) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "clearBackupData()"); - - if (userBackupManagerService != null) { - userBackupManagerService.clearBackupData(transportName, packageName); - } - } - - /** Return the name of the currently active transport. */ - @Nullable - public String getCurrentTransport(@UserIdInt int userId) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "getCurrentTransport()"); - - return userBackupManagerService == null - ? null - : userBackupManagerService.getCurrentTransport(); - } - - /** - * Returns the {@link ComponentName} of the host service of the selected transport or {@code - * null} if no transport selected or if the transport selected is not registered. - */ - @Nullable - public ComponentName getCurrentTransportComponent(@UserIdInt int userId) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "getCurrentTransportComponent()"); - - return userBackupManagerService == null - ? null - : userBackupManagerService.getCurrentTransportComponent(); - } - - /** Report all known, available backup transports by name. */ - @Nullable - public String[] listAllTransports(@UserIdInt int userId) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "listAllTransports()"); - - return userBackupManagerService == null - ? null - : userBackupManagerService.listAllTransports(); - } - - /** Report all known, available backup transports by {@link ComponentName}. */ - @Nullable - public ComponentName[] listAllTransportComponents(@UserIdInt int userId) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "listAllTransportComponents()"); - - return userBackupManagerService == null - ? null - : userBackupManagerService.listAllTransportComponents(); - } - - /** - * Update the attributes of the transport identified by {@code transportComponent}. If the - * specified transport has not been bound at least once (for registration), this call will be - * ignored. Only the host process of the transport can change its description, otherwise a - * {@link SecurityException} will be thrown. - * - * @param transportComponent The identity of the transport being described. - * @param name A {@link String} with the new name for the transport. This is NOT for - * identification. MUST NOT be {@code null}. - * @param configurationIntent An {@link Intent} that can be passed to {@link - * Context#startActivity} in order to launch the transport's configuration UI. It may be - * {@code null} if the transport does not offer any user-facing configuration UI. - * @param currentDestinationString A {@link String} describing the destination to which the - * transport is currently sending data. MUST NOT be {@code null}. - * @param dataManagementIntent An {@link Intent} that can be passed to {@link - * Context#startActivity} in order to launch the transport's data-management UI. It may be - * {@code null} if the transport does not offer any user-facing data management UI. - * @param dataManagementLabel A {@link CharSequence} to be used as the label for the transport's - * data management affordance. This MUST be {@code null} when dataManagementIntent is {@code - * null} and MUST NOT be {@code null} when dataManagementIntent is not {@code null}. - * @throws SecurityException If the UID of the calling process differs from the package UID of - * {@code transportComponent} or if the caller does NOT have BACKUP permission. - */ - public void updateTransportAttributes( - @UserIdInt int userId, - ComponentName transportComponent, - String name, - @Nullable Intent configurationIntent, - String currentDestinationString, - @Nullable Intent dataManagementIntent, - CharSequence dataManagementLabel) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "updateTransportAttributes()"); - - if (userBackupManagerService != null) { - userBackupManagerService.updateTransportAttributes( - transportComponent, - name, - configurationIntent, - currentDestinationString, - dataManagementIntent, - dataManagementLabel); - } - } - - /** - * Selects transport {@code transportName} and returns the previously selected transport. - * - * @deprecated Use {@link #selectBackupTransportAsync(ComponentName, - * ISelectBackupTransportCallback)} instead. - */ - @Deprecated - @Nullable - public String selectBackupTransport(@UserIdInt int userId, String transportName) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "selectBackupTransport()"); - - return userBackupManagerService == null - ? null - : userBackupManagerService.selectBackupTransport(transportName); - } - - /** - * Selects transport {@code transportComponent} asynchronously and notifies {@code listener} - * with the result upon completion. - */ - public void selectBackupTransportAsync( - @UserIdInt int userId, - ComponentName transportComponent, - ISelectBackupTransportCallback listener) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "selectBackupTransportAsync()"); - - if (userBackupManagerService != null) { - userBackupManagerService.selectBackupTransportAsync(transportComponent, listener); - } - } - - /** - * Supply the configuration intent for the given transport. If the name is not one of the - * available transports, or if the transport does not supply any configuration UI, the method - * returns {@code null}. - */ - @Nullable - public Intent getConfigurationIntent(@UserIdInt int userId, String transportName) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "getConfigurationIntent()"); - - return userBackupManagerService == null - ? null - : userBackupManagerService.getConfigurationIntent(transportName); - } - - /** - * Sets the ancestral work profile for the calling user. - * - * <p> The ancestral work profile corresponds to the profile that was used to restore to the - * callers profile. - */ - public void setAncestralSerialNumber(long ancestralSerialNumber) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission( - Binder.getCallingUserHandle().getIdentifier(), - "setAncestralSerialNumber()"); - - if (userBackupManagerService != null) { - userBackupManagerService.setAncestralSerialNumber(ancestralSerialNumber); - } - } - - /** - * Returns a {@link UserHandle} for the user that has {@code ancestralSerialNumber} as the - * serial number of the its ancestral work profile or null if there is no {@link - * UserBackupManagerService} associated with that user. - * - * <p> The ancestral work profile is set by {@link #setAncestralSerialNumber(long)} - * and it corresponds to the profile that was used to restore to the callers profile. - */ - @Nullable - public UserHandle getUserForAncestralSerialNumber(long ancestralSerialNumber) { - int callingUserId = Binder.getCallingUserHandle().getIdentifier(); - long oldId = Binder.clearCallingIdentity(); - final int[] userIds; - try { - userIds = - mContext - .getSystemService(UserManager.class) - .getProfileIds(callingUserId, false); - } finally { - Binder.restoreCallingIdentity(oldId); - } - - for (int userId : userIds) { - UserBackupManagerService userBackupManagerService = mServiceUsers.get(userId); - if (userBackupManagerService != null) { - if (userBackupManagerService.getAncestralSerialNumber() == ancestralSerialNumber) { - return UserHandle.of(userId); - } - } - } - - return null; - } - - /** - * Supply the current destination string for the given transport. If the name is not one of the - * registered transports the method will return null. - * - * <p>This string is used VERBATIM as the summary text of the relevant Settings item. - * - * @param transportName The name of the registered transport. - * @return The current destination string or null if the transport is not registered. - */ - @Nullable - public String getDestinationString(@UserIdInt int userId, String transportName) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "getDestinationString()"); - - return userBackupManagerService == null - ? null - : userBackupManagerService.getDestinationString(transportName); - } - - /** Supply the manage-data intent for the given transport. */ - @Nullable - public Intent getDataManagementIntent(@UserIdInt int userId, String transportName) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "getDataManagementIntent()"); - - return userBackupManagerService == null - ? null - : userBackupManagerService.getDataManagementIntent(transportName); - } - - /** - * Supply the menu label for affordances that fire the manage-data intent for the given - * transport. - */ - @Nullable - public CharSequence getDataManagementLabel(@UserIdInt int userId, String transportName) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "getDataManagementLabel()"); - - return userBackupManagerService == null - ? null - : userBackupManagerService.getDataManagementLabel(transportName); - } - - // --------------------------------------------- - // SETTINGS OPERATIONS - // --------------------------------------------- - - /** Enable/disable the backup service. This is user-configurable via backup settings. */ - public void setBackupEnabled(@UserIdInt int userId, boolean enable) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "setBackupEnabled()"); - - if (userBackupManagerService != null) { - userBackupManagerService.setBackupEnabled(enable); - } - } - - /** Enable/disable automatic restore of app data at install time. */ - public void setAutoRestore(@UserIdInt int userId, boolean autoRestore) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "setAutoRestore()"); - - if (userBackupManagerService != null) { - userBackupManagerService.setAutoRestore(autoRestore); - } - } - - /** - * Return {@code true} if the backup mechanism is currently enabled, else returns {@code false}. - */ - public boolean isBackupEnabled(@UserIdInt int userId) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "isBackupEnabled()"); - - return userBackupManagerService != null && userBackupManagerService.isBackupEnabled(); - } - - // --------------------------------------------- - // BACKUP OPERATIONS - // --------------------------------------------- - - /** Checks if the given package {@code packageName} is eligible for backup. */ - public boolean isAppEligibleForBackup(@UserIdInt int userId, String packageName) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "isAppEligibleForBackup()"); - - return userBackupManagerService != null - && userBackupManagerService.isAppEligibleForBackup(packageName); - } - - /** - * Returns from the inputted packages {@code packages}, the ones that are eligible for backup. - */ - @Nullable - public String[] filterAppsEligibleForBackup(@UserIdInt int userId, String[] packages) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "filterAppsEligibleForBackup()"); - - return userBackupManagerService == null - ? null - : userBackupManagerService.filterAppsEligibleForBackup(packages); - } - - /** - * Run a backup pass immediately for any key-value backup applications that have declared that - * they have pending updates. - */ - public void backupNow(@UserIdInt int userId) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "backupNow()"); - - if (userBackupManagerService != null) { - userBackupManagerService.backupNow(); - } - } - - /** - * Requests a backup for the inputted {@code packages} with a specified callback {@link - * IBackupManagerMonitor} for receiving events during the operation. - */ - public int requestBackup( - @UserIdInt int userId, - String[] packages, - IBackupObserver observer, - IBackupManagerMonitor monitor, - int flags) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "requestBackup()"); - - return userBackupManagerService == null - ? BackupManager.ERROR_BACKUP_NOT_ALLOWED - : userBackupManagerService.requestBackup(packages, observer, monitor, flags); - } - - /** Cancel all running backup operations. */ - public void cancelBackups(@UserIdInt int userId) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "cancelBackups()"); - - if (userBackupManagerService != null) { - userBackupManagerService.cancelBackups(); - } - } - - /** - * Used by the {@link JobScheduler} to run a full backup when conditions are right. The model we - * use is to perform one app backup per scheduled job execution, and to reschedule the job with - * zero latency as long as conditions remain right and we still have work to do. - * - * @return Whether ongoing work will continue. The return value here will be passed along as the - * return value to the callback {@link JobService#onStartJob(JobParameters)}. - */ - public boolean beginFullBackup(@UserIdInt int userId, FullBackupJob scheduledJob) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "beginFullBackup()"); - - return userBackupManagerService != null - && userBackupManagerService.beginFullBackup(scheduledJob); - } - - /** - * Used by the {@link JobScheduler} to end the current full backup task when conditions are no - * longer met for running the full backup job. - */ - public void endFullBackup(@UserIdInt int userId) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "endFullBackup()"); - - if (userBackupManagerService != null) { - userBackupManagerService.endFullBackup(); - } - } - - /** - * Run a full backup pass for the given packages {@code packageNames}. Used by 'adb shell bmgr'. - */ - public void fullTransportBackup(@UserIdInt int userId, String[] packageNames) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "fullTransportBackup()"); - - if (userBackupManagerService != null) { - userBackupManagerService.fullTransportBackup(packageNames); - } - } - - // --------------------------------------------- - // RESTORE OPERATIONS - // --------------------------------------------- - - /** - * Used to run a restore pass for an application that is being installed. This should only be - * called from the {@link PackageManager}. - */ - public void restoreAtInstall(@UserIdInt int userId, String packageName, int token) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "restoreAtInstall()"); - - if (userBackupManagerService != null) { - userBackupManagerService.restoreAtInstall(packageName, token); - } - } - - /** - * Begin a restore for the specified package {@code packageName} using the specified transport - * {@code transportName}. - */ - @Nullable - public IRestoreSession beginRestoreSession( - @UserIdInt int userId, String packageName, String transportName) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "beginRestoreSession()"); - - return userBackupManagerService == null - ? null - : userBackupManagerService.beginRestoreSession(packageName, transportName); - } - - /** - * Get the restore-set token for the best-available restore set for this {@code packageName}: - * the active set if possible, else the ancestral one. Returns zero if none available. - */ - public long getAvailableRestoreToken(@UserIdInt int userId, String packageName) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "getAvailableRestoreToken()"); - - return userBackupManagerService == null - ? 0 - : userBackupManagerService.getAvailableRestoreToken(packageName); - } - - // --------------------------------------------- - // ADB BACKUP/RESTORE OPERATIONS - // --------------------------------------------- - - /** Sets the backup password used when running adb backup. */ - public boolean setBackupPassword(String currentPassword, String newPassword) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission( - UserHandle.USER_SYSTEM, "setBackupPassword()"); - - return userBackupManagerService != null - && userBackupManagerService.setBackupPassword(currentPassword, newPassword); - } - - /** Returns {@code true} if adb backup was run with a password, else returns {@code false}. */ - public boolean hasBackupPassword() { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission( - UserHandle.USER_SYSTEM, "hasBackupPassword()"); - - return userBackupManagerService != null && userBackupManagerService.hasBackupPassword(); - } - - /** - * Used by 'adb backup' to run a backup pass for packages {@code packageNames} supplied via the - * command line, writing the resulting data stream to the supplied {@code fd}. This method is - * synchronous and does not return to the caller until the backup has been completed. It - * requires on-screen confirmation by the user. - */ - public void adbBackup( - @UserIdInt int userId, - ParcelFileDescriptor fd, - boolean includeApks, - boolean includeObbs, - boolean includeShared, - boolean doWidgets, - boolean doAllApps, - boolean includeSystem, - boolean doCompress, - boolean doKeyValue, - String[] packageNames) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "adbBackup()"); - - if (userBackupManagerService != null) { - userBackupManagerService.adbBackup( - fd, - includeApks, - includeObbs, - includeShared, - doWidgets, - doAllApps, - includeSystem, - doCompress, - doKeyValue, - packageNames); - } - } - - /** - * Used by 'adb restore' to run a restore pass reading from the supplied {@code fd}. This method - * is synchronous and does not return to the caller until the restore has been completed. It - * requires on-screen confirmation by the user. - */ - public void adbRestore(@UserIdInt int userId, ParcelFileDescriptor fd) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "adbRestore()"); - - if (userBackupManagerService != null) { - userBackupManagerService.adbRestore(fd); - } - } - - /** - * Confirm that the previously requested adb backup/restore operation can proceed. This is used - * to require a user-facing disclosure about the operation. - */ - public void acknowledgeAdbBackupOrRestore( - @UserIdInt int userId, - int token, - boolean allow, - String currentPassword, - String encryptionPassword, - IFullBackupRestoreObserver observer) { - UserBackupManagerService userBackupManagerService = - getServiceForUserIfCallerHasPermission(userId, "acknowledgeAdbBackupOrRestore()"); - - if (userBackupManagerService != null) { - userBackupManagerService.acknowledgeAdbBackupOrRestore( - token, allow, currentPassword, encryptionPassword, observer); - } - } - - // --------------------------------------------- // SERVICE OPERATIONS // --------------------------------------------- diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java index e11bdaab9aeb..109d6369fcc1 100644 --- a/services/backup/java/com/android/server/backup/Trampoline.java +++ b/services/backup/java/com/android/server/backup/Trampoline.java @@ -24,6 +24,7 @@ import static java.util.Collections.emptySet; import android.Manifest; import android.annotation.Nullable; import android.annotation.UserIdInt; +import android.app.ActivityManager; import android.app.admin.DevicePolicyManager; import android.app.backup.BackupManager; import android.app.backup.IBackupManager; @@ -32,11 +33,15 @@ import android.app.backup.IBackupObserver; import android.app.backup.IFullBackupRestoreObserver; import android.app.backup.IRestoreSession; import android.app.backup.ISelectBackupTransportCallback; +import android.app.job.JobParameters; +import android.app.job.JobScheduler; +import android.app.job.JobService; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageManager; import android.os.Binder; import android.os.FileUtils; import android.os.Handler; @@ -502,7 +507,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void dataChangedForUser(int userId, String packageName) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.dataChanged(userId, packageName); + dataChanged(userId, packageName); } } @@ -511,11 +516,40 @@ public class Trampoline extends IBackupManager.Stub { dataChangedForUser(binderGetCallingUserId(), packageName); } + /** + * An app's backup agent calls this method to let the service know that there's new data to + * backup for their app {@code packageName}. Only used for apps participating in key-value + * backup. + */ + public void dataChanged(@UserIdInt int userId, String packageName) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "dataChanged()"); + + if (userBackupManagerService != null) { + userBackupManagerService.dataChanged(packageName); + } + } + + // --------------------------------------------- + // TRANSPORT OPERATIONS + // --------------------------------------------- + @Override public void initializeTransportsForUser( int userId, String[] transportNames, IBackupObserver observer) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.initializeTransports(userId, transportNames, observer); + initializeTransports(userId, transportNames, observer); + } + } + + /** Run an initialize operation for the given transports {@code transportNames}. */ + public void initializeTransports( + @UserIdInt int userId, String[] transportNames, IBackupObserver observer) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "initializeTransports()"); + + if (userBackupManagerService != null) { + userBackupManagerService.initializeTransports(transportNames, observer); } } @@ -523,7 +557,20 @@ public class Trampoline extends IBackupManager.Stub { public void clearBackupDataForUser(int userId, String transportName, String packageName) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.clearBackupData(userId, transportName, packageName); + clearBackupData(userId, transportName, packageName); + } + } + + /** + * Clear the given package {@code packageName}'s backup data from the transport {@code + * transportName}. + */ + public void clearBackupData(@UserIdInt int userId, String transportName, String packageName) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "clearBackupData()"); + + if (userBackupManagerService != null) { + userBackupManagerService.clearBackupData(transportName, packageName); } } @@ -537,7 +584,7 @@ public class Trampoline extends IBackupManager.Stub { public void agentConnectedForUser(int userId, String packageName, IBinder agent) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.agentConnected(userId, packageName, agent); + agentConnected(userId, packageName, agent); } } @@ -546,10 +593,23 @@ public class Trampoline extends IBackupManager.Stub { agentConnectedForUser(binderGetCallingUserId(), packageName, agent); } + /** + * Callback: a requested backup agent has been instantiated. This should only be called from the + * {@link ActivityManager}. + */ + public void agentConnected(@UserIdInt int userId, String packageName, IBinder agentBinder) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "agentConnected()"); + + if (userBackupManagerService != null) { + userBackupManagerService.agentConnected(packageName, agentBinder); + } + } + @Override public void agentDisconnectedForUser(int userId, String packageName) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.agentDisconnected(userId, packageName); + agentDisconnected(userId, packageName); } } @@ -558,11 +618,24 @@ public class Trampoline extends IBackupManager.Stub { agentDisconnectedForUser(binderGetCallingUserId(), packageName); } + /** + * Callback: a backup agent has failed to come up, or has unexpectedly quit. This should only be + * called from the {@link ActivityManager}. + */ + public void agentDisconnected(@UserIdInt int userId, String packageName) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "agentDisconnected()"); + + if (userBackupManagerService != null) { + userBackupManagerService.agentDisconnected(packageName); + } + } + @Override public void restoreAtInstallForUser(int userId, String packageName, int token) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.restoreAtInstall(userId, packageName, token); + restoreAtInstall(userId, packageName, token); } } @@ -571,11 +644,24 @@ public class Trampoline extends IBackupManager.Stub { restoreAtInstallForUser(binderGetCallingUserId(), packageName, token); } + /** + * Used to run a restore pass for an application that is being installed. This should only be + * called from the {@link PackageManager}. + */ + public void restoreAtInstall(@UserIdInt int userId, String packageName, int token) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "restoreAtInstall()"); + + if (userBackupManagerService != null) { + userBackupManagerService.restoreAtInstall(packageName, token); + } + } + @Override public void setBackupEnabledForUser(@UserIdInt int userId, boolean isEnabled) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.setBackupEnabled(userId, isEnabled); + setBackupEnabled(userId, isEnabled); } } @@ -584,10 +670,20 @@ public class Trampoline extends IBackupManager.Stub { setBackupEnabledForUser(binderGetCallingUserId(), isEnabled); } + /** Enable/disable the backup service. This is user-configurable via backup settings. */ + public void setBackupEnabled(@UserIdInt int userId, boolean enable) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "setBackupEnabled()"); + + if (userBackupManagerService != null) { + userBackupManagerService.setBackupEnabled(enable); + } + } + @Override public void setAutoRestoreForUser(int userId, boolean doAutoRestore) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.setAutoRestore(userId, doAutoRestore); + setAutoRestore(userId, doAutoRestore); } } @@ -596,9 +692,19 @@ public class Trampoline extends IBackupManager.Stub { setAutoRestoreForUser(binderGetCallingUserId(), doAutoRestore); } + /** Enable/disable automatic restore of app data at install time. */ + public void setAutoRestore(@UserIdInt int userId, boolean autoRestore) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "setAutoRestore()"); + + if (userBackupManagerService != null) { + userBackupManagerService.setAutoRestore(autoRestore); + } + } + @Override public boolean isBackupEnabledForUser(@UserIdInt int userId) throws RemoteException { - return isUserReadyForBackup(userId) && mService.isBackupEnabled(userId); + return isUserReadyForBackup(userId) && isBackupEnabled(userId); } @Override @@ -606,22 +712,49 @@ public class Trampoline extends IBackupManager.Stub { return isBackupEnabledForUser(binderGetCallingUserId()); } + /** + * Return {@code true} if the backup mechanism is currently enabled, else returns {@code false}. + */ + public boolean isBackupEnabled(@UserIdInt int userId) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "isBackupEnabled()"); + + return userBackupManagerService != null && userBackupManagerService.isBackupEnabled(); + } + + /** Sets the backup password used when running adb backup. */ @Override - public boolean setBackupPassword(String currentPw, String newPw) throws RemoteException { + public boolean setBackupPassword(String currentPassword, String newPassword) { int userId = binderGetCallingUserId(); - return (isUserReadyForBackup(userId)) && mService.setBackupPassword(currentPw, newPw); + if (!isUserReadyForBackup(userId)) { + return false; + } + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission( + UserHandle.USER_SYSTEM, "setBackupPassword()"); + + return userBackupManagerService != null + && userBackupManagerService.setBackupPassword(currentPassword, newPassword); } + /** Returns {@code true} if adb backup was run with a password, else returns {@code false}. */ @Override public boolean hasBackupPassword() throws RemoteException { int userId = binderGetCallingUserId(); - return (isUserReadyForBackup(userId)) && mService.hasBackupPassword(); + if (!isUserReadyForBackup(userId)) { + return false; + } + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission( + UserHandle.USER_SYSTEM, "hasBackupPassword()"); + + return userBackupManagerService != null && userBackupManagerService.hasBackupPassword(); } @Override public void backupNowForUser(@UserIdInt int userId) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.backupNow(userId); + backupNow(userId); } } @@ -630,13 +763,56 @@ public class Trampoline extends IBackupManager.Stub { backupNowForUser(binderGetCallingUserId()); } - public void adbBackup(@UserIdInt int userId, ParcelFileDescriptor fd, - boolean includeApks, boolean includeObbs, boolean includeShared, boolean doWidgets, - boolean allApps, boolean allIncludesSystem, boolean doCompress, boolean doKeyValue, - String[] packageNames) throws RemoteException { - if (isUserReadyForBackup(userId)) { - mService.adbBackup(userId, fd, includeApks, includeObbs, includeShared, doWidgets, - allApps, allIncludesSystem, doCompress, doKeyValue, packageNames); + /** + * Run a backup pass immediately for any key-value backup applications that have declared that + * they have pending updates. + */ + public void backupNow(@UserIdInt int userId) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "backupNow()"); + + if (userBackupManagerService != null) { + userBackupManagerService.backupNow(); + } + } + + /** + * Used by 'adb backup' to run a backup pass for packages {@code packageNames} supplied via the + * command line, writing the resulting data stream to the supplied {@code fd}. This method is + * synchronous and does not return to the caller until the backup has been completed. It + * requires on-screen confirmation by the user. + */ + @Override + public void adbBackup( + @UserIdInt int userId, + ParcelFileDescriptor fd, + boolean includeApks, + boolean includeObbs, + boolean includeShared, + boolean doWidgets, + boolean doAllApps, + boolean includeSystem, + boolean doCompress, + boolean doKeyValue, + String[] packageNames) { + if (!isUserReadyForBackup(userId)) { + return; + } + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "adbBackup()"); + + if (userBackupManagerService != null) { + userBackupManagerService.adbBackup( + fd, + includeApks, + includeObbs, + includeShared, + doWidgets, + doAllApps, + includeSystem, + doCompress, + doKeyValue, + packageNames); } } @@ -644,14 +820,37 @@ public class Trampoline extends IBackupManager.Stub { public void fullTransportBackupForUser(int userId, String[] packageNames) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.fullTransportBackup(userId, packageNames); + fullTransportBackup(userId, packageNames); + } + } + + /** + * Run a full backup pass for the given packages {@code packageNames}. Used by 'adb shell bmgr'. + */ + public void fullTransportBackup(@UserIdInt int userId, String[] packageNames) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "fullTransportBackup()"); + + if (userBackupManagerService != null) { + userBackupManagerService.fullTransportBackup(packageNames); } } + /** + * Used by 'adb restore' to run a restore pass reading from the supplied {@code fd}. This method + * is synchronous and does not return to the caller until the restore has been completed. It + * requires on-screen confirmation by the user. + */ @Override - public void adbRestore(@UserIdInt int userId, ParcelFileDescriptor fd) throws RemoteException { - if (isUserReadyForBackup(userId)) { - mService.adbRestore(userId, fd); + public void adbRestore(@UserIdInt int userId, ParcelFileDescriptor fd) { + if (!isUserReadyForBackup(userId)) { + return; + } + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "adbRestore()"); + + if (userBackupManagerService != null) { + userBackupManagerService.adbRestore(fd); } } @@ -665,11 +864,31 @@ public class Trampoline extends IBackupManager.Stub { IFullBackupRestoreObserver observer) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.acknowledgeAdbBackupOrRestore(userId, token, allow, + acknowledgeAdbBackupOrRestore(userId, token, allow, curPassword, encryptionPassword, observer); } } + /** + * Confirm that the previously requested adb backup/restore operation can proceed. This is used + * to require a user-facing disclosure about the operation. + */ + public void acknowledgeAdbBackupOrRestore( + @UserIdInt int userId, + int token, + boolean allow, + String currentPassword, + String encryptionPassword, + IFullBackupRestoreObserver observer) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "acknowledgeAdbBackupOrRestore()"); + + if (userBackupManagerService != null) { + userBackupManagerService.acknowledgeAdbBackupOrRestore( + token, allow, currentPassword, encryptionPassword, observer); + } + } + @Override public void acknowledgeFullBackupOrRestore(int token, boolean allow, String curPassword, String encryptionPassword, IFullBackupRestoreObserver observer) @@ -681,7 +900,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public String getCurrentTransportForUser(int userId) throws RemoteException { - return (isUserReadyForBackup(userId)) ? mService.getCurrentTransport(userId) : null; + return (isUserReadyForBackup(userId)) ? getCurrentTransport(userId) : null; } @Override @@ -689,6 +908,17 @@ public class Trampoline extends IBackupManager.Stub { return getCurrentTransportForUser(binderGetCallingUserId()); } + /** Return the name of the currently active transport. */ + @Nullable + public String getCurrentTransport(@UserIdInt int userId) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "getCurrentTransport()"); + + return userBackupManagerService == null + ? null + : userBackupManagerService.getCurrentTransport(); + } + /** * Returns the {@link ComponentName} of the host service of the selected transport or * {@code null} if no transport selected or if the transport selected is not registered. @@ -696,13 +926,37 @@ public class Trampoline extends IBackupManager.Stub { @Override @Nullable public ComponentName getCurrentTransportComponentForUser(int userId) { - return (isUserReadyForBackup(userId)) - ? mService.getCurrentTransportComponent(userId) : null; + return (isUserReadyForBackup(userId)) ? getCurrentTransportComponent(userId) : null; + } + + /** + * Returns the {@link ComponentName} of the host service of the selected transport or {@code + * null} if no transport selected or if the transport selected is not registered. + */ + @Nullable + public ComponentName getCurrentTransportComponent(@UserIdInt int userId) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "getCurrentTransportComponent()"); + + return userBackupManagerService == null + ? null + : userBackupManagerService.getCurrentTransportComponent(); } @Override public String[] listAllTransportsForUser(int userId) throws RemoteException { - return (isUserReadyForBackup(userId)) ? mService.listAllTransports(userId) : null; + return (isUserReadyForBackup(userId)) ? listAllTransports(userId) : null; + } + + /** Report all known, available backup transports by name. */ + @Nullable + public String[] listAllTransports(@UserIdInt int userId) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "listAllTransports()"); + + return userBackupManagerService == null + ? null + : userBackupManagerService.listAllTransports(); } @Override @@ -713,7 +967,18 @@ public class Trampoline extends IBackupManager.Stub { @Override public ComponentName[] listAllTransportComponentsForUser(int userId) throws RemoteException { return (isUserReadyForBackup(userId)) - ? mService.listAllTransportComponents(userId) : null; + ? listAllTransportComponents(userId) : null; + } + + /** Report all known, available backup transports by {@link ComponentName}. */ + @Nullable + public ComponentName[] listAllTransportComponents(@UserIdInt int userId) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "listAllTransportComponents()"); + + return userBackupManagerService == null + ? null + : userBackupManagerService.listAllTransportComponents(); } @Override @@ -742,7 +1007,7 @@ public class Trampoline extends IBackupManager.Stub { @Nullable Intent dataManagementIntent, CharSequence dataManagementLabel) { if (isUserReadyForBackup(userId)) { - mService.updateTransportAttributes( + updateTransportAttributes( userId, transportComponent, name, @@ -753,11 +1018,56 @@ public class Trampoline extends IBackupManager.Stub { } } + /** + * Update the attributes of the transport identified by {@code transportComponent}. If the + * specified transport has not been bound at least once (for registration), this call will be + * ignored. Only the host process of the transport can change its description, otherwise a + * {@link SecurityException} will be thrown. + * + * @param transportComponent The identity of the transport being described. + * @param name A {@link String} with the new name for the transport. This is NOT for + * identification. MUST NOT be {@code null}. + * @param configurationIntent An {@link Intent} that can be passed to {@link + * Context#startActivity} in order to launch the transport's configuration UI. It may be + * {@code null} if the transport does not offer any user-facing configuration UI. + * @param currentDestinationString A {@link String} describing the destination to which the + * transport is currently sending data. MUST NOT be {@code null}. + * @param dataManagementIntent An {@link Intent} that can be passed to {@link + * Context#startActivity} in order to launch the transport's data-management UI. It may be + * {@code null} if the transport does not offer any user-facing data management UI. + * @param dataManagementLabel A {@link CharSequence} to be used as the label for the transport's + * data management affordance. This MUST be {@code null} when dataManagementIntent is {@code + * null} and MUST NOT be {@code null} when dataManagementIntent is not {@code null}. + * @throws SecurityException If the UID of the calling process differs from the package UID of + * {@code transportComponent} or if the caller does NOT have BACKUP permission. + */ + public void updateTransportAttributes( + @UserIdInt int userId, + ComponentName transportComponent, + String name, + @Nullable Intent configurationIntent, + String currentDestinationString, + @Nullable Intent dataManagementIntent, + CharSequence dataManagementLabel) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "updateTransportAttributes()"); + + if (userBackupManagerService != null) { + userBackupManagerService.updateTransportAttributes( + transportComponent, + name, + configurationIntent, + currentDestinationString, + dataManagementIntent, + dataManagementLabel); + } + } + @Override public String selectBackupTransportForUser(int userId, String transport) throws RemoteException { return (isUserReadyForBackup(userId)) - ? mService.selectBackupTransport(userId, transport) : null; + ? selectBackupTransport(userId, transport) : null; } @Override @@ -765,11 +1075,28 @@ public class Trampoline extends IBackupManager.Stub { return selectBackupTransportForUser(binderGetCallingUserId(), transport); } + /** + * Selects transport {@code transportName} and returns the previously selected transport. + * + * @deprecated Use {@link #selectBackupTransportAsync(ComponentName, + * ISelectBackupTransportCallback)} instead. + */ + @Deprecated + @Nullable + public String selectBackupTransport(@UserIdInt int userId, String transportName) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "selectBackupTransport()"); + + return userBackupManagerService == null + ? null + : userBackupManagerService.selectBackupTransport(transportName); + } + @Override public void selectBackupTransportAsyncForUser(int userId, ComponentName transport, ISelectBackupTransportCallback listener) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.selectBackupTransportAsync(userId, transport, listener); + selectBackupTransportAsync(userId, transport, listener); } else { if (listener != null) { try { @@ -781,10 +1108,26 @@ public class Trampoline extends IBackupManager.Stub { } } + /** + * Selects transport {@code transportComponent} asynchronously and notifies {@code listener} + * with the result upon completion. + */ + public void selectBackupTransportAsync( + @UserIdInt int userId, + ComponentName transportComponent, + ISelectBackupTransportCallback listener) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "selectBackupTransportAsync()"); + + if (userBackupManagerService != null) { + userBackupManagerService.selectBackupTransportAsync(transportComponent, listener); + } + } + @Override public Intent getConfigurationIntentForUser(int userId, String transport) throws RemoteException { - return isUserReadyForBackup(userId) ? mService.getConfigurationIntent(userId, transport) + return isUserReadyForBackup(userId) ? getConfigurationIntent(userId, transport) : null; } @@ -794,9 +1137,24 @@ public class Trampoline extends IBackupManager.Stub { return getConfigurationIntentForUser(binderGetCallingUserId(), transport); } + /** + * Supply the configuration intent for the given transport. If the name is not one of the + * available transports, or if the transport does not supply any configuration UI, the method + * returns {@code null}. + */ + @Nullable + public Intent getConfigurationIntent(@UserIdInt int userId, String transportName) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "getConfigurationIntent()"); + + return userBackupManagerService == null + ? null + : userBackupManagerService.getConfigurationIntent(transportName); + } + @Override public String getDestinationStringForUser(int userId, String transport) throws RemoteException { - return isUserReadyForBackup(userId) ? mService.getDestinationString(userId, transport) + return isUserReadyForBackup(userId) ? getDestinationString(userId, transport) : null; } @@ -805,11 +1163,30 @@ public class Trampoline extends IBackupManager.Stub { return getDestinationStringForUser(binderGetCallingUserId(), transport); } + /** + * Supply the current destination string for the given transport. If the name is not one of the + * registered transports the method will return null. + * + * <p>This string is used VERBATIM as the summary text of the relevant Settings item. + * + * @param transportName The name of the registered transport. + * @return The current destination string or null if the transport is not registered. + */ + @Nullable + public String getDestinationString(@UserIdInt int userId, String transportName) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "getDestinationString()"); + + return userBackupManagerService == null + ? null + : userBackupManagerService.getDestinationString(transportName); + } + @Override public Intent getDataManagementIntentForUser(int userId, String transport) throws RemoteException { return isUserReadyForBackup(userId) - ? mService.getDataManagementIntent(userId, transport) : null; + ? getDataManagementIntent(userId, transport) : null; } @Override @@ -818,24 +1195,64 @@ public class Trampoline extends IBackupManager.Stub { return getDataManagementIntentForUser(binderGetCallingUserId(), transport); } + /** Supply the manage-data intent for the given transport. */ + @Nullable + public Intent getDataManagementIntent(@UserIdInt int userId, String transportName) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "getDataManagementIntent()"); + + return userBackupManagerService == null + ? null + : userBackupManagerService.getDataManagementIntent(transportName); + } + @Override public CharSequence getDataManagementLabelForUser(int userId, String transport) throws RemoteException { - return isUserReadyForBackup(userId) ? mService.getDataManagementLabel(userId, transport) + return isUserReadyForBackup(userId) ? getDataManagementLabel(userId, transport) : null; } + /** + * Supply the menu label for affordances that fire the manage-data intent for the given + * transport. + */ + @Nullable + public CharSequence getDataManagementLabel(@UserIdInt int userId, String transportName) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "getDataManagementLabel()"); + + return userBackupManagerService == null + ? null + : userBackupManagerService.getDataManagementLabel(transportName); + } + @Override public IRestoreSession beginRestoreSessionForUser( int userId, String packageName, String transportID) throws RemoteException { - return isUserReadyForBackup(userId) ? mService.beginRestoreSession(userId, packageName, - transportID) : null; + return isUserReadyForBackup(userId) + ? beginRestoreSession(userId, packageName, transportID) : null; + } + + /** + * Begin a restore for the specified package {@code packageName} using the specified transport + * {@code transportName}. + */ + @Nullable + public IRestoreSession beginRestoreSession( + @UserIdInt int userId, String packageName, String transportName) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "beginRestoreSession()"); + + return userBackupManagerService == null + ? null + : userBackupManagerService.beginRestoreSession(packageName, transportName); } @Override public void opCompleteForUser(int userId, int token, long result) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.opComplete(userId, token, result); + opComplete(userId, token, result); } } @@ -844,22 +1261,68 @@ public class Trampoline extends IBackupManager.Stub { opCompleteForUser(binderGetCallingUserId(), token, result); } + /** + * Used by a currently-active backup agent to notify the service that it has completed its given + * outstanding asynchronous backup/restore operation. + */ + public void opComplete(@UserIdInt int userId, int token, long result) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "opComplete()"); + + if (userBackupManagerService != null) { + userBackupManagerService.opComplete(token, result); + } + } + @Override public long getAvailableRestoreTokenForUser(int userId, String packageName) { - return isUserReadyForBackup(userId) ? mService.getAvailableRestoreToken(userId, - packageName) : 0; + return isUserReadyForBackup(userId) ? getAvailableRestoreToken(userId, packageName) : 0; + } + + /** + * Get the restore-set token for the best-available restore set for this {@code packageName}: + * the active set if possible, else the ancestral one. Returns zero if none available. + */ + public long getAvailableRestoreToken(@UserIdInt int userId, String packageName) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "getAvailableRestoreToken()"); + + return userBackupManagerService == null + ? 0 + : userBackupManagerService.getAvailableRestoreToken(packageName); } @Override public boolean isAppEligibleForBackupForUser(int userId, String packageName) { - return isUserReadyForBackup(userId) && mService.isAppEligibleForBackup(userId, + return isUserReadyForBackup(userId) && isAppEligibleForBackup(userId, packageName); } + /** Checks if the given package {@code packageName} is eligible for backup. */ + public boolean isAppEligibleForBackup(@UserIdInt int userId, String packageName) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "isAppEligibleForBackup()"); + + return userBackupManagerService != null + && userBackupManagerService.isAppEligibleForBackup(packageName); + } + @Override public String[] filterAppsEligibleForBackupForUser(int userId, String[] packages) { - return isUserReadyForBackup(userId) ? mService.filterAppsEligibleForBackup(userId, - packages) : null; + return isUserReadyForBackup(userId) ? filterAppsEligibleForBackup(userId, packages) : null; + } + + /** + * Returns from the inputted packages {@code packages}, the ones that are eligible for backup. + */ + @Nullable + public String[] filterAppsEligibleForBackup(@UserIdInt int userId, String[] packages) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "filterAppsEligibleForBackup()"); + + return userBackupManagerService == null + ? null + : userBackupManagerService.filterAppsEligibleForBackup(packages); } @Override @@ -868,7 +1331,7 @@ public class Trampoline extends IBackupManager.Stub { if (!isUserReadyForBackup(userId)) { return BackupManager.ERROR_BACKUP_NOT_ALLOWED; } - return mService.requestBackup(userId, packages, observer, monitor, flags); + return requestBackup(userId, packages, observer, monitor, flags); } @Override @@ -878,10 +1341,28 @@ public class Trampoline extends IBackupManager.Stub { observer, monitor, flags); } + /** + * Requests a backup for the inputted {@code packages} with a specified callback {@link + * IBackupManagerMonitor} for receiving events during the operation. + */ + public int requestBackup( + @UserIdInt int userId, + String[] packages, + IBackupObserver observer, + IBackupManagerMonitor monitor, + int flags) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "requestBackup()"); + + return userBackupManagerService == null + ? BackupManager.ERROR_BACKUP_NOT_ALLOWED + : userBackupManagerService.requestBackup(packages, observer, monitor, flags); + } + @Override public void cancelBackupsForUser(@UserIdInt int userId) throws RemoteException { if (isUserReadyForBackup(userId)) { - mService.cancelBackups(userId); + cancelBackups(userId); } } @@ -890,18 +1371,72 @@ public class Trampoline extends IBackupManager.Stub { cancelBackupsForUser(binderGetCallingUserId()); } + /** Cancel all running backup operations. */ + public void cancelBackups(@UserIdInt int userId) { + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "cancelBackups()"); + + if (userBackupManagerService != null) { + userBackupManagerService.cancelBackups(); + } + } + + /** + * Returns a {@link UserHandle} for the user that has {@code ancestralSerialNumber} as the + * serial number of its ancestral work profile or null if there is no {@link + * UserBackupManagerService} associated with that user. + * + * <p> The ancestral work profile is set by {@link #setAncestralSerialNumber(long)} + * and it corresponds to the profile that was used to restore to the callers profile. + */ @Override - @Nullable public UserHandle getUserForAncestralSerialNumber(long ancestralSerialNumber) { + @Nullable + public UserHandle getUserForAncestralSerialNumber(long ancestralSerialNumber) { if (mGlobalDisable) { return null; } - return mService.getUserForAncestralSerialNumber(ancestralSerialNumber); + int callingUserId = Binder.getCallingUserHandle().getIdentifier(); + long oldId = Binder.clearCallingIdentity(); + final int[] userIds; + try { + userIds = + mContext + .getSystemService(UserManager.class) + .getProfileIds(callingUserId, false); + } finally { + Binder.restoreCallingIdentity(oldId); + } + + for (int userId : userIds) { + UserBackupManagerService userBackupManagerService = mUserServices.get(userId); + if (userBackupManagerService != null) { + if (userBackupManagerService.getAncestralSerialNumber() == ancestralSerialNumber) { + return UserHandle.of(userId); + } + } + } + + return null; } + /** + * Sets the ancestral work profile for the calling user. + * + * <p> The ancestral work profile corresponds to the profile that was used to restore to the + * callers profile. + */ @Override public void setAncestralSerialNumber(long ancestralSerialNumber) { - if (!mGlobalDisable) { - mService.setAncestralSerialNumber(ancestralSerialNumber); + if (mGlobalDisable) { + return; + } + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission( + Binder.getCallingUserHandle().getIdentifier(), + "setAncestralSerialNumber()"); + + if (userBackupManagerService != null) { + userBackupManagerService.setAncestralSerialNumber(ancestralSerialNumber); } } @@ -916,15 +1451,75 @@ public class Trampoline extends IBackupManager.Stub { } } - // Full backup/restore entry points - non-Binder; called directly - // by the full-backup scheduled job - /* package */ boolean beginFullBackup(@UserIdInt int userId, FullBackupJob scheduledJob) { - return (isUserReadyForBackup(userId)) && mService.beginFullBackup(userId, scheduledJob); + /** + * Used by the {@link JobScheduler} to run a full backup when conditions are right. The model we + * use is to perform one app backup per scheduled job execution, and to reschedule the job with + * zero latency as long as conditions remain right and we still have work to do. + * + * @return Whether ongoing work will continue. The return value here will be passed along as the + * return value to the callback {@link JobService#onStartJob(JobParameters)}. + */ + public boolean beginFullBackup(@UserIdInt int userId, FullBackupJob scheduledJob) { + if (!isUserReadyForBackup(userId)) { + return false; + } + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "beginFullBackup()"); + + return userBackupManagerService != null + && userBackupManagerService.beginFullBackup(scheduledJob); } - /* package */ void endFullBackup(@UserIdInt int userId) { - if (isUserReadyForBackup(userId)) { - mService.endFullBackup(userId); + /** + * Used by the {@link JobScheduler} to end the current full backup task when conditions are no + * longer met for running the full backup job. + */ + public void endFullBackup(@UserIdInt int userId) { + if (!isUserReadyForBackup(userId)) { + return; + } + UserBackupManagerService userBackupManagerService = + getServiceForUserIfCallerHasPermission(userId, "endFullBackup()"); + + if (userBackupManagerService != null) { + userBackupManagerService.endFullBackup(); + } + } + + /** + * Returns the {@link UserBackupManagerService} instance for the specified user {@code userId}. + * If the user is not registered with the service (either the user is locked or not eligible for + * the backup service) then return {@code null}. + * + * @param userId The id of the user to retrieve its instance of {@link + * UserBackupManagerService}. + * @param caller A {@link String} identifying the caller for logging purposes. + * @throws SecurityException if {@code userId} is different from the calling user id and the + * caller does NOT have the android.permission.INTERACT_ACROSS_USERS_FULL permission. + */ + @Nullable + @VisibleForTesting + UserBackupManagerService getServiceForUserIfCallerHasPermission( + @UserIdInt int userId, String caller) { + enforceCallingPermissionOnUserId(userId, caller); + UserBackupManagerService userBackupManagerService = mUserServices.get(userId); + if (userBackupManagerService == null) { + Slog.w(TAG, "Called " + caller + " for unknown user: " + userId); + } + return userBackupManagerService; + } + + /** + * If {@code userId} is different from the calling user id, then the caller must hold the + * android.permission.INTERACT_ACROSS_USERS_FULL permission. + * + * @param userId User id on which the backup operation is being requested. + * @param message A message to include in the exception if it is thrown. + */ + void enforceCallingPermissionOnUserId(@UserIdInt int userId, String message) { + if (Binder.getCallingUserHandle().getIdentifier() != userId) { + mContext.enforceCallingOrSelfPermission( + Manifest.permission.INTERACT_ACROSS_USERS_FULL, message); } } } diff --git a/services/core/Android.bp b/services/core/Android.bp index 474dbfe49d70..c838c6044e1d 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -13,7 +13,6 @@ java_library_static { }, srcs: [ "java/**/*.java", - ":platformcompat_aidl", ":dumpstate_aidl", ":idmap2_aidl", ":installd_aidl", @@ -82,11 +81,3 @@ prebuilt_etc { name: "gps_debug.conf", src: "java/com/android/server/location/gps_debug.conf", } - -filegroup { - name: "platformcompat_aidl", - srcs: [ - "java/com/android/server/compat/IPlatformCompat.aidl", - ], - path: "java", -} diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index fede48789e97..9a97ddb3e3a7 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -172,7 +172,7 @@ class AlarmManagerService extends SystemService { final LocalLog mLog = new LocalLog(TAG); AppOpsManager mAppOps; - DeviceIdleController.LocalService mLocalDeviceIdleController; + DeviceIdleInternal mLocalDeviceIdleController; private UsageStatsManagerInternal mUsageStatsManagerInternal; final Object mLock = new Object(); @@ -1594,7 +1594,7 @@ class AlarmManagerService extends SystemService { mConstants.start(getContext().getContentResolver()); mAppOps = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE); mLocalDeviceIdleController = - LocalServices.getService(DeviceIdleController.LocalService.class); + LocalServices.getService(DeviceIdleInternal.class); mUsageStatsManagerInternal = LocalServices.getService(UsageStatsManagerInternal.class); mUsageStatsManagerInternal.addAppIdleStateChangeListener(new AppStandbyTracker()); diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index a30371876955..62930b0ff134 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -1636,27 +1636,32 @@ public class DeviceIdleController extends SystemService } } - public class LocalService { + private class LocalService implements DeviceIdleInternal { + @Override public void onConstraintStateChanged(IDeviceIdleConstraint constraint, boolean active) { synchronized (DeviceIdleController.this) { onConstraintStateChangedLocked(constraint, active); } } + @Override public void registerDeviceIdleConstraint(IDeviceIdleConstraint constraint, String name, @IDeviceIdleConstraint.MinimumState int minState) { registerDeviceIdleConstraintInternal(constraint, name, minState); } + @Override public void unregisterDeviceIdleConstraint(IDeviceIdleConstraint constraint) { unregisterDeviceIdleConstraintInternal(constraint); } + @Override public void exitIdle(String reason) { exitIdleInternal(reason); } // duration in milliseconds + @Override public void addPowerSaveTempWhitelistApp(int callingUid, String packageName, long duration, int userId, boolean sync, String reason) { addPowerSaveTempWhitelistAppInternal(callingUid, packageName, duration, @@ -1664,26 +1669,31 @@ public class DeviceIdleController extends SystemService } // duration in milliseconds + @Override public void addPowerSaveTempWhitelistAppDirect(int uid, long duration, boolean sync, String reason) { addPowerSaveTempWhitelistAppDirectInternal(0, uid, duration, sync, reason); } // duration in milliseconds + @Override public long getNotificationWhitelistDuration() { return mConstants.NOTIFICATION_WHITELIST_DURATION; } + @Override public void setJobsActive(boolean active) { DeviceIdleController.this.setJobsActive(active); } // Up-call from alarm manager. + @Override public void setAlarmsActive(boolean active) { DeviceIdleController.this.setAlarmsActive(active); } /** Is the app on any of the power save whitelists, whether system or user? */ + @Override public boolean isAppOnWhitelist(int appid) { return DeviceIdleController.this.isAppOnWhitelistInternal(appid); } @@ -1694,10 +1704,12 @@ public class DeviceIdleController extends SystemService * can change when the list changes, so it needs to be re-acquired when * {@link PowerManager#ACTION_POWER_SAVE_WHITELIST_CHANGED} is sent. */ + @Override public int[] getPowerSaveWhitelistUserAppIds() { return DeviceIdleController.this.getPowerSaveWhitelistUserAppIds(); } + @Override public int[] getPowerSaveTempWhitelistAppIds() { return DeviceIdleController.this.getAppIdTempWhitelistInternal(); } @@ -1767,7 +1779,8 @@ public class DeviceIdleController extends SystemService return mContext.getSystemService(SensorManager.class); } - ConstraintController getConstraintController(Handler handler, LocalService localService) { + ConstraintController getConstraintController(Handler handler, + DeviceIdleInternal localService) { if (mContext.getPackageManager() .hasSystemFeature(PackageManager.FEATURE_LEANBACK_ONLY)) { return new TvConstraintController(mContext, handler); @@ -1884,7 +1897,7 @@ public class DeviceIdleController extends SystemService mBinderService = new BinderService(); publishBinderService(Context.DEVICE_IDLE_CONTROLLER, mBinderService); - publishLocalService(LocalService.class, new LocalService()); + publishLocalService(DeviceIdleInternal.class, new LocalService()); } @Override diff --git a/services/core/java/com/android/server/DeviceIdleInternal.java b/services/core/java/com/android/server/DeviceIdleInternal.java new file mode 100644 index 000000000000..127324936e09 --- /dev/null +++ b/services/core/java/com/android/server/DeviceIdleInternal.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server; + +import com.android.server.deviceidle.IDeviceIdleConstraint; + +public interface DeviceIdleInternal { + void onConstraintStateChanged(IDeviceIdleConstraint constraint, boolean active); + + void registerDeviceIdleConstraint(IDeviceIdleConstraint constraint, String name, + @IDeviceIdleConstraint.MinimumState int minState); + + void unregisterDeviceIdleConstraint(IDeviceIdleConstraint constraint); + + void exitIdle(String reason); + + // duration in milliseconds + void addPowerSaveTempWhitelistApp(int callingUid, String packageName, + long duration, int userId, boolean sync, String reason); + + // duration in milliseconds + void addPowerSaveTempWhitelistAppDirect(int uid, long duration, boolean sync, + String reason); + + // duration in milliseconds + long getNotificationWhitelistDuration(); + + void setJobsActive(boolean active); + + // Up-call from alarm manager. + void setAlarmsActive(boolean active); + + boolean isAppOnWhitelist(int appid); + + int[] getPowerSaveWhitelistUserAppIds(); + + int[] getPowerSaveTempWhitelistAppIds(); +} diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 69655191a9c7..19c818f4dcfd 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -330,7 +330,7 @@ import com.android.internal.util.function.QuadFunction; import com.android.internal.util.function.TriFunction; import com.android.server.AlarmManagerInternal; import com.android.server.AttributeCache; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; import com.android.server.DisplayThread; import com.android.server.IntentResolver; import com.android.server.IoThread; @@ -1135,7 +1135,7 @@ public class ActivityManagerService extends IActivityManager.Stub /** * Access to DeviceIdleController service. */ - DeviceIdleController.LocalService mLocalDeviceIdleController; + DeviceIdleInternal mLocalDeviceIdleController; /** * Power-save whitelisted app-ids (not including except-idle-whitelisted ones). @@ -9003,8 +9003,8 @@ public class ActivityManagerService extends IActivityManager.Stub } t.traceBegin("controllersReady"); - mLocalDeviceIdleController - = LocalServices.getService(DeviceIdleController.LocalService.class); + mLocalDeviceIdleController = + LocalServices.getService(DeviceIdleInternal.class); mActivityTaskManager.onSystemReady(); // Make sure we have the current profile info, since it is needed for security checks. mUserController.onSystemReady(); diff --git a/services/core/java/com/android/server/appop/HistoricalRegistry.java b/services/core/java/com/android/server/appop/HistoricalRegistry.java index 9cf342c0e4fb..ace0a7d03b85 100644 --- a/services/core/java/com/android/server/appop/HistoricalRegistry.java +++ b/services/core/java/com/android/server/appop/HistoricalRegistry.java @@ -291,7 +291,7 @@ final class HistoricalRegistry { makeRelativeToEpochStart(currentOps, nowMillis); currentOps.accept(visitor); - if(isPersistenceInitializedMLocked()) { + if (!isPersistenceInitializedMLocked()) { Slog.e(LOG_TAG, "Interaction before persistence initialized"); return; } @@ -457,7 +457,7 @@ final class HistoricalRegistry { // it is a part of the persistence initialization process. boolean resampleHistory = false; Slog.i(LOG_TAG, "New history parameters: mode:" - + AppOpsManager.historicalModeToString(mMode) + " baseSnapshotInterval:" + + AppOpsManager.historicalModeToString(mode) + " baseSnapshotInterval:" + baseSnapshotInterval + " intervalCompressionMultiplier:" + intervalCompressionMultiplier); if (mMode != mode) { @@ -1066,7 +1066,7 @@ final class HistoricalRegistry { normalizeSnapshotForSlotDuration(persistedOps, slotDurationMillis); writeHistoricalOpsDLocked(persistedOps, intervalOverflowMillis, newFile); if (DEBUG) { - Slog.i(LOG_TAG, "Persisted at depth: " + depth + Slog.i(LOG_TAG, "Persisted at depth: " + depth + " file: " + newFile + " ops:\n" + opsToDebugString(persistedOps)); enforceOpsWellFormed(persistedOps); } @@ -1160,7 +1160,7 @@ final class HistoricalRegistry { } if (DEBUG) { if (allOps != null) { - Slog.i(LOG_TAG, "Read from file: " + file + "ops:\n" + Slog.i(LOG_TAG, "Read from file: " + file + " ops:\n" + opsToDebugString(allOps)); enforceOpsWellFormed(allOps); } diff --git a/services/core/java/com/android/server/compat/PlatformCompat.java b/services/core/java/com/android/server/compat/PlatformCompat.java index 3eea194fd73e..27050faef712 100644 --- a/services/core/java/com/android/server/compat/PlatformCompat.java +++ b/services/core/java/com/android/server/compat/PlatformCompat.java @@ -16,6 +16,7 @@ package com.android.server.compat; +import android.compat.IPlatformCompat; import android.content.Context; import android.content.pm.ApplicationInfo; import android.util.Slog; diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index e7a8b132d850..fb94907fc579 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -95,7 +95,7 @@ import com.android.internal.net.VpnProfile; import com.android.internal.notification.SystemNotificationChannels; import com.android.internal.util.ArrayUtils; import com.android.server.ConnectivityService; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; import com.android.server.LocalServices; import com.android.server.net.BaseNetworkObserver; @@ -616,8 +616,8 @@ public class Vpn { // a short time, so we can bootstrap the VPN service. final long oldId = Binder.clearCallingIdentity(); try { - DeviceIdleController.LocalService idleController = - LocalServices.getService(DeviceIdleController.LocalService.class); + DeviceIdleInternal idleController = + LocalServices.getService(DeviceIdleInternal.class); idleController.addPowerSaveTempWhitelistApp(Process.myUid(), alwaysOnPackage, VPN_LAUNCH_IDLE_WHITELIST_DURATION_MS, mUserHandle, false, "vpn"); diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index f6c49ed4d29e..e7f537b897b9 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -102,7 +102,7 @@ import com.android.internal.os.BackgroundThread; import com.android.internal.util.ArrayUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.function.QuadConsumer; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.accounts.AccountManagerService; @@ -1634,8 +1634,8 @@ public class SyncManager { if (syncOperation.syncExemptionFlag == ContentResolver.SYNC_EXEMPTION_PROMOTE_BUCKET_WITH_TEMP) { - DeviceIdleController.LocalService dic = - LocalServices.getService(DeviceIdleController.LocalService.class); + DeviceIdleInternal dic = + LocalServices.getService(DeviceIdleInternal.class); if (dic != null) { dic.addPowerSaveTempWhitelistApp(Process.SYSTEM_UID, syncOperation.owningPackage, diff --git a/services/core/java/com/android/server/deviceidle/BluetoothConstraint.java b/services/core/java/com/android/server/deviceidle/BluetoothConstraint.java index cc319bf23ddd..731d8991c53a 100644 --- a/services/core/java/com/android/server/deviceidle/BluetoothConstraint.java +++ b/services/core/java/com/android/server/deviceidle/BluetoothConstraint.java @@ -29,7 +29,7 @@ import android.os.Message; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; /** * Track whether there are any active Bluetooth devices connected. @@ -40,14 +40,14 @@ public class BluetoothConstraint implements IDeviceIdleConstraint { private final Context mContext; private final Handler mHandler; - private final DeviceIdleController.LocalService mLocalService; + private final DeviceIdleInternal mLocalService; private final BluetoothManager mBluetoothManager; private volatile boolean mConnected = true; private volatile boolean mMonitoring = false; public BluetoothConstraint( - Context context, Handler handler, DeviceIdleController.LocalService localService) { + Context context, Handler handler, DeviceIdleInternal localService) { mContext = context; mHandler = handler; mLocalService = localService; diff --git a/services/core/java/com/android/server/deviceidle/TvConstraintController.java b/services/core/java/com/android/server/deviceidle/TvConstraintController.java index 2d472de6f5e1..7f0a2717ed4a 100644 --- a/services/core/java/com/android/server/deviceidle/TvConstraintController.java +++ b/services/core/java/com/android/server/deviceidle/TvConstraintController.java @@ -21,7 +21,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.os.Handler; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; import com.android.server.LocalServices; /** @@ -33,7 +33,7 @@ import com.android.server.LocalServices; public class TvConstraintController implements ConstraintController { private final Context mContext; private final Handler mHandler; - private final DeviceIdleController.LocalService mDeviceIdleService; + private final DeviceIdleInternal mDeviceIdleService; @Nullable private final BluetoothConstraint mBluetoothConstraint; @@ -41,7 +41,7 @@ public class TvConstraintController implements ConstraintController { public TvConstraintController(Context context, Handler handler) { mContext = context; mHandler = handler; - mDeviceIdleService = LocalServices.getService(DeviceIdleController.LocalService.class); + mDeviceIdleService = LocalServices.getService(DeviceIdleInternal.class); final PackageManager pm = context.getPackageManager(); mBluetoothConstraint = pm.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) diff --git a/services/core/java/com/android/server/display/WifiDisplayController.java b/services/core/java/com/android/server/display/WifiDisplayController.java index fc59b5b0ffec..d9d46b8d1f3b 100644 --- a/services/core/java/com/android/server/display/WifiDisplayController.java +++ b/services/core/java/com/android/server/display/WifiDisplayController.java @@ -94,8 +94,8 @@ final class WifiDisplayController implements DumpUtils.Dump { private final Handler mHandler; private final Listener mListener; - private final WifiP2pManager mWifiP2pManager; - private final Channel mWifiP2pChannel; + private WifiP2pManager mWifiP2pManager; + private Channel mWifiP2pChannel; private boolean mWifiP2pEnabled; private boolean mWfdEnabled; @@ -164,9 +164,6 @@ final class WifiDisplayController implements DumpUtils.Dump { mHandler = handler; mListener = listener; - mWifiP2pManager = (WifiP2pManager)context.getSystemService(Context.WIFI_P2P_SERVICE); - mWifiP2pChannel = mWifiP2pManager.initialize(context, handler.getLooper(), null); - IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); @@ -191,6 +188,18 @@ final class WifiDisplayController implements DumpUtils.Dump { updateSettings(); } + /** + * Used to lazily retrieve WifiP2pManager service. + */ + private void retrieveWifiP2pManagerAndChannel() { + if (mWifiP2pManager == null) { + mWifiP2pManager = (WifiP2pManager)mContext.getSystemService(Context.WIFI_P2P_SERVICE); + } + if (mWifiP2pChannel == null && mWifiP2pManager != null) { + mWifiP2pChannel = mWifiP2pManager.initialize(mContext, mHandler.getLooper(), null); + } + } + private void updateSettings() { final ContentResolver resolver = mContext.getContentResolver(); mWifiDisplayOnSetting = Settings.Global.getInt(resolver, @@ -803,6 +812,9 @@ final class WifiDisplayController implements DumpUtils.Dump { private void handleStateChanged(boolean enabled) { mWifiP2pEnabled = enabled; + if (enabled) { + retrieveWifiP2pManagerAndChannel(); + } updateWfdEnableState(); } diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index f1f6d502d575..f38f2f9a0de5 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -106,6 +106,7 @@ import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.internal.notification.SystemNotificationChannels; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; +import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.internal.widget.ICheckCredentialProgressCallback; import com.android.internal.widget.ILockSettings; @@ -137,8 +138,10 @@ import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; @@ -169,6 +172,8 @@ public class LockSettingsService extends ILockSettings.Stub { private static final int PROFILE_KEY_IV_SIZE = 12; private static final String SEPARATE_PROFILE_CHALLENGE_KEY = "lockscreen.profilechallenge"; private static final int SYNTHETIC_PASSWORD_ENABLED_BY_DEFAULT = 1; + private static final String PREV_SYNTHETIC_PASSWORD_HANDLE_KEY = "prev-sp-handle"; + private static final String SYNTHETIC_PASSWORD_UPDATE_TIME_KEY = "sp-handle-ts"; // No challenge provided private static final int CHALLENGE_NONE = 0; @@ -357,7 +362,7 @@ public class LockSettingsService extends ILockSettings.Stub { setLong(LockPatternUtils.PASSWORD_TYPE_KEY, quality, managedUserId); tieProfileLockToParent(managedUserId, newPassword); Arrays.fill(newPassword, (byte) 0); - } catch (NoSuchAlgorithmException | RemoteException e) { + } catch (NoSuchAlgorithmException e) { Slog.e(TAG, "Fail to tie managed profile", e); // Nothing client can do to fix this issue, so we do not throw exception out } @@ -604,15 +609,11 @@ public class LockSettingsService extends ILockSettings.Stub { if (ks.state(userId) == KeyStore.State.LOCKED && tiedManagedProfileReadyToUnlock(mUserManager.getUserInfo(userId))) { Slog.i(TAG, "Managed profile got unlocked, will unlock its keystore"); - try { - // If boot took too long and the password in vold got expired, parent keystore will - // be still locked, we ignore this case since the user will be prompted to unlock - // the device after boot. - unlockChildProfile(userId, true /* ignoreUserNotAuthenticated */, - CHALLENGE_NONE, 0 /* challenge */, null /* resetLockouts */); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to unlock child profile"); - } + // If boot took too long and the password in vold got expired, parent keystore will + // be still locked, we ignore this case since the user will be prompted to unlock + // the device after boot. + unlockChildProfile(userId, true /* ignoreUserNotAuthenticated */, + CHALLENGE_NONE, 0 /* challenge */, null /* resetLockouts */); } } @@ -648,20 +649,16 @@ public class LockSettingsService extends ILockSettings.Stub { return; } - try { - final long handle = getSyntheticPasswordHandleLocked(userId); - final byte[] noCredential = null; - AuthenticationResult result = - mSpManager.unwrapPasswordBasedSyntheticPassword( - getGateKeeperService(), handle, noCredential, userId, null); - if (result.authToken != null) { - Slog.i(TAG, "Retrieved auth token for user " + userId); - onAuthTokenKnownForUser(userId, result.authToken); - } else { - Slog.e(TAG, "Auth token not available for user " + userId); - } - } catch (RemoteException e) { - Slog.e(TAG, "Failure retrieving auth token", e); + final long handle = getSyntheticPasswordHandleLocked(userId); + final byte[] noCredential = null; + AuthenticationResult result = + mSpManager.unwrapPasswordBasedSyntheticPassword( + getGateKeeperService(), handle, noCredential, userId, null); + if (result.authToken != null) { + Slog.i(TAG, "Retrieved auth token for user " + userId); + onAuthTokenKnownForUser(userId, result.authToken); + } else { + Slog.e(TAG, "Auth token not available for user " + userId); } } } @@ -698,12 +695,8 @@ public class LockSettingsService extends ILockSettings.Stub { } checkWritePermission(UserHandle.USER_SYSTEM); migrateOldData(); - try { - getGateKeeperService(); - mSpManager.initWeaverService(); - } catch (RemoteException e) { - Slog.e(TAG, "Failure retrieving IGateKeeperService", e); - } + getGateKeeperService(); + mSpManager.initWeaverService(); // Find the AuthSecret HAL try { mAuthSecretService = IAuthSecret.getService(); @@ -872,16 +865,12 @@ public class LockSettingsService extends ILockSettings.Stub { } private void migrateOldDataAfterSystemReady() { - try { - // Migrate the FRP credential to the persistent data block - if (LockPatternUtils.frpCredentialEnabled(mContext) - && !getBoolean("migrated_frp", false, 0)) { - migrateFrpCredential(); - setBoolean("migrated_frp", true, 0); - Slog.i(TAG, "Migrated migrated_frp."); - } - } catch (RemoteException e) { - Slog.e(TAG, "Unable to migrateOldDataAfterSystemReady", e); + // Migrate the FRP credential to the persistent data block + if (LockPatternUtils.frpCredentialEnabled(mContext) + && !getBoolean("migrated_frp", false, 0)) { + migrateFrpCredential(); + setBoolean("migrated_frp", true, 0); + Slog.i(TAG, "Migrated migrated_frp."); } } @@ -891,7 +880,7 @@ public class LockSettingsService extends ILockSettings.Stub { * - the FRP credential is not set up * - the credential is based on a synthetic password. */ - private void migrateFrpCredential() throws RemoteException { + private void migrateFrpCredential() { if (mStorage.readPersistentDataBlock() != PersistentData.NONE) { return; } @@ -1187,8 +1176,7 @@ public class LockSettingsService extends ILockSettings.Stub { private void unlockChildProfile(int profileHandle, boolean ignoreUserNotAuthenticated, @ChallengeType int challengeType, long challenge, - @Nullable ArrayList<PendingResetLockout> resetLockouts) - throws RemoteException { + @Nullable ArrayList<PendingResetLockout> resetLockouts) { try { doVerifyCredential(getDecryptedPasswordForTiedProfile(profileHandle), CREDENTIAL_TYPE_PASSWORD, @@ -1263,14 +1251,10 @@ public class LockSettingsService extends ILockSettings.Stub { for (UserInfo profile : mUserManager.getProfiles(userId)) { // Unlock managed profile with unified lock if (tiedManagedProfileReadyToUnlock(profile)) { - try { - // Must pass the challenge on for resetLockout, so it's not over-written, which - // causes LockSettingsService to revokeChallenge inappropriately. - unlockChildProfile(profile.id, false /* ignoreUserNotAuthenticated */, - challengeType, challenge, resetLockouts); - } catch (RemoteException e) { - Log.d(TAG, "Failed to unlock child profile", e); - } + // Must pass the challenge on for resetLockout, so it's not over-written, which + // causes LockSettingsService to revokeChallenge inappropriately. + unlockChildProfile(profile.id, false /* ignoreUserNotAuthenticated */, + challengeType, challenge, resetLockouts); } // Now we have unlocked the parent user and attempted to unlock the profile we should // show notifications if the profile is still locked. @@ -1350,7 +1334,7 @@ public class LockSettingsService extends ILockSettings.Stub { * terminates when the user is a managed profile. */ private void synchronizeUnifiedWorkChallengeForProfiles(int userId, - Map<Integer, byte[]> profilePasswordMap) throws RemoteException { + Map<Integer, byte[]> profilePasswordMap) { if (mUserManager.getUserInfo(userId).isManagedProfile()) { return; } @@ -1464,7 +1448,7 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public void setLockCredential(byte[] credential, int type, byte[] savedCredential, int requestedQuality, int userId, - boolean allowUntrustedChange) throws RemoteException { + boolean allowUntrustedChange) { if (!mLockPatternUtils.hasSecureLockScreen()) { throw new UnsupportedOperationException( @@ -1490,7 +1474,7 @@ public class LockSettingsService extends ILockSettings.Stub { */ private void setLockCredentialInternal(byte[] credential, @CredentialType int credentialType, byte[] savedCredential, int requestedQuality, int userId, boolean allowUntrustedChange, - boolean isLockTiedToParent) throws RemoteException { + boolean isLockTiedToParent) { // Normalize savedCredential and credential such that empty string is always represented // as null. if (savedCredential == null || savedCredential.length == 0) { @@ -1512,7 +1496,7 @@ public class LockSettingsService extends ILockSettings.Stub { Slog.wtf(TAG, "CredentialType is none, but credential is non-null."); } clearUserKeyProtection(userId); - getGateKeeperService().clearSecureUserId(userId); + gateKeeperClearSecureUserId(userId); mStorage.writeCredentialHash(CredentialHash.createEmptyHash(), userId); setKeystorePassword(null, userId); fixateNewestUserKeyAuth(userId); @@ -1523,7 +1507,7 @@ public class LockSettingsService extends ILockSettings.Stub { return; } if (credential == null) { - throw new RemoteException("Null credential with mismatched credential type"); + throw new IllegalArgumentException("Null credential with mismatched credential type"); } CredentialHash currentHandle = mStorage.readCredentialHash(userId); @@ -1565,8 +1549,13 @@ public class LockSettingsService extends ILockSettings.Stub { CredentialHash willStore = CredentialHash.create(enrolledHandle, credentialType); mStorage.writeCredentialHash(willStore, userId); // push new secret and auth token to vold - GateKeeperResponse gkResponse = getGateKeeperService() - .verifyChallenge(userId, 0, willStore.hash, credential); + GateKeeperResponse gkResponse; + try { + gkResponse = getGateKeeperService().verifyChallenge(userId, 0, willStore.hash, + credential); + } catch (RemoteException e) { + throw new IllegalStateException("Failed to verify current credential", e); + } setUserKeyProtection(userId, credential, convertResponse(gkResponse)); fixateNewestUserKeyAuth(userId); // Refresh the auth token @@ -1576,8 +1565,8 @@ public class LockSettingsService extends ILockSettings.Stub { sendCredentialsOnChangeIfRequired( credentialType, credential, userId, isLockTiedToParent); } else { - throw new RemoteException("Failed to enroll " + - (credentialType == CREDENTIAL_TYPE_PASSWORD ? "password" : "pattern")); + throw new IllegalStateException(String.format("Failed to enroll %s", + credentialType == CREDENTIAL_TYPE_PASSWORD ? "password" : "pattern")); } } @@ -1630,27 +1619,32 @@ public class LockSettingsService extends ILockSettings.Stub { } catch (CertificateException | UnrecoverableKeyException | IOException | BadPaddingException | IllegalBlockSizeException | KeyStoreException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException e) { - throw new RuntimeException("Failed to encrypt key", e); + throw new IllegalStateException("Failed to encrypt key", e); } ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { if (iv.length != PROFILE_KEY_IV_SIZE) { - throw new RuntimeException("Invalid iv length: " + iv.length); + throw new IllegalArgumentException("Invalid iv length: " + iv.length); } outputStream.write(iv); outputStream.write(encryptionResult); } catch (IOException e) { - throw new RuntimeException("Failed to concatenate byte arrays", e); + throw new IllegalStateException("Failed to concatenate byte arrays", e); } mStorage.writeChildProfileLock(userId, outputStream.toByteArray()); } private byte[] enrollCredential(byte[] enrolledHandle, - byte[] enrolledCredential, byte[] toEnroll, int userId) - throws RemoteException { + byte[] enrolledCredential, byte[] toEnroll, int userId) { checkWritePermission(userId); - GateKeeperResponse response = getGateKeeperService().enroll(userId, enrolledHandle, - enrolledCredential, toEnroll); + GateKeeperResponse response; + try { + response = getGateKeeperService().enroll(userId, enrolledHandle, + enrolledCredential, toEnroll); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to enroll credential", e); + return null; + } if (response == null) { return null; @@ -1666,34 +1660,33 @@ public class LockSettingsService extends ILockSettings.Stub { return hash; } - private void setAuthlessUserKeyProtection(int userId, byte[] key) throws RemoteException { + private void setAuthlessUserKeyProtection(int userId, byte[] key) { if (DEBUG) Slog.d(TAG, "setAuthlessUserKeyProtectiond: user=" + userId); addUserKeyAuth(userId, null, key); } - private void setUserKeyProtection(int userId, byte[] credential, VerifyCredentialResponse vcr) - throws RemoteException { + private void setUserKeyProtection(int userId, byte[] credential, VerifyCredentialResponse vcr) { if (DEBUG) Slog.d(TAG, "setUserKeyProtection: user=" + userId); if (vcr == null) { - throw new RemoteException("Null response verifying a credential we just set"); + throw new IllegalArgumentException("Null response verifying a credential we just set"); } if (vcr.getResponseCode() != VerifyCredentialResponse.RESPONSE_OK) { - throw new RemoteException("Non-OK response verifying a credential we just set: " + throw new IllegalArgumentException("Non-OK response verifying a credential we just set " + vcr.getResponseCode()); } byte[] token = vcr.getPayload(); if (token == null) { - throw new RemoteException("Empty payload verifying a credential we just set"); + throw new IllegalArgumentException("Empty payload verifying a credential we just set"); } addUserKeyAuth(userId, token, secretFromCredential(credential)); } - private void clearUserKeyProtection(int userId) throws RemoteException { + private void clearUserKeyProtection(int userId) { if (DEBUG) Slog.d(TAG, "clearUserKeyProtection user=" + userId); addUserKeyAuth(userId, null, null); } - private static byte[] secretFromCredential(byte[] credential) throws RemoteException { + private static byte[] secretFromCredential(byte[] credential) { try { MessageDigest digest = MessageDigest.getInstance("SHA-512"); // Personalize the hash @@ -1704,7 +1697,7 @@ public class LockSettingsService extends ILockSettings.Stub { digest.update(credential); return digest.digest(); } catch (NoSuchAlgorithmException e) { - throw new RuntimeException("NoSuchAlgorithmException for SHA-512"); + throw new IllegalStateException("NoSuchAlgorithmException for SHA-512"); } } @@ -1718,35 +1711,44 @@ public class LockSettingsService extends ILockSettings.Stub { } /** Unlock disk encryption */ - private void unlockUserKey(int userId, byte[] token, byte[] secret) throws RemoteException { + private void unlockUserKey(int userId, byte[] token, byte[] secret) { final UserInfo userInfo = mUserManager.getUserInfo(userId); - mStorageManager.unlockUserKey(userId, userInfo.serialNumber, token, secret); + try { + mStorageManager.unlockUserKey(userId, userInfo.serialNumber, token, secret); + } catch (RemoteException e) { + throw new IllegalStateException("Failed to unlock user key " + userId, e); + + } } - private void addUserKeyAuth(int userId, byte[] token, byte[] secret) - throws RemoteException { + private void addUserKeyAuth(int userId, byte[] token, byte[] secret) { final UserInfo userInfo = mUserManager.getUserInfo(userId); final long callingId = Binder.clearCallingIdentity(); try { mStorageManager.addUserKeyAuth(userId, userInfo.serialNumber, token, secret); + } catch (RemoteException e) { + throw new IllegalStateException("Failed to add new key to vold " + userId, e); } finally { Binder.restoreCallingIdentity(callingId); } } - private void fixateNewestUserKeyAuth(int userId) - throws RemoteException { + private void fixateNewestUserKeyAuth(int userId) { if (DEBUG) Slog.d(TAG, "fixateNewestUserKeyAuth: user=" + userId); final long callingId = Binder.clearCallingIdentity(); try { mStorageManager.fixateNewestUserKeyAuth(userId); + } catch (RemoteException e) { + // OK to ignore the exception as vold would just accept both old and new + // keys if this call fails, and will fix itself during the next boot + Slog.w(TAG, "fixateNewestUserKeyAuth failed", e); } finally { Binder.restoreCallingIdentity(callingId); } } @Override - public void resetKeyStore(int userId) throws RemoteException { + public void resetKeyStore(int userId) { checkWritePermission(userId); if (DEBUG) Slog.v(TAG, "Reset keystore for user: " + userId); int managedUserId = -1; @@ -1794,14 +1796,14 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public VerifyCredentialResponse checkCredential(byte[] credential, int type, int userId, - ICheckCredentialProgressCallback progressCallback) throws RemoteException { + ICheckCredentialProgressCallback progressCallback) { checkPasswordReadPermission(userId); return doVerifyCredential(credential, type, CHALLENGE_NONE, 0, userId, progressCallback); } @Override public VerifyCredentialResponse verifyCredential(byte[] credential, int type, long challenge, - int userId) throws RemoteException { + int userId) { checkPasswordReadPermission(userId); return doVerifyCredential(credential, type, CHALLENGE_FROM_CALLER, challenge, userId, null /* progressCallback */); @@ -1809,7 +1811,7 @@ public class LockSettingsService extends ILockSettings.Stub { private VerifyCredentialResponse doVerifyCredential(byte[] credential, int credentialType, @ChallengeType int challengeType, long challenge, int userId, - ICheckCredentialProgressCallback progressCallback) throws RemoteException { + ICheckCredentialProgressCallback progressCallback) { return doVerifyCredential(credential, credentialType, challengeType, challenge, userId, progressCallback, null /* resetLockouts */); } @@ -1821,7 +1823,7 @@ public class LockSettingsService extends ILockSettings.Stub { private VerifyCredentialResponse doVerifyCredential(byte[] credential, int credentialType, @ChallengeType int challengeType, long challenge, int userId, ICheckCredentialProgressCallback progressCallback, - @Nullable ArrayList<PendingResetLockout> resetLockouts) throws RemoteException { + @Nullable ArrayList<PendingResetLockout> resetLockouts) { if (credential == null || credential.length == 0) { throw new IllegalArgumentException("Credential can't be null or empty"); } @@ -1865,10 +1867,10 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public VerifyCredentialResponse verifyTiedProfileChallenge(byte[] credential, int type, - long challenge, int userId) throws RemoteException { + long challenge, int userId) { checkPasswordReadPermission(userId); if (!isManagedProfileWithUnifiedLock(userId)) { - throw new RemoteException("User id must be managed profile with unified lock"); + throw new IllegalArgumentException("User id must be managed profile with unified lock"); } final int parentProfileId = mUserManager.getProfileParent(userId).id; // Unlock parent by using parent's challenge @@ -1896,7 +1898,7 @@ public class LockSettingsService extends ILockSettings.Stub { | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException | CertificateException | IOException e) { Slog.e(TAG, "Failed to decrypt child profile key", e); - throw new RemoteException("Unable to get tied profile token"); + throw new IllegalStateException("Unable to get tied profile token"); } } @@ -1907,7 +1909,7 @@ public class LockSettingsService extends ILockSettings.Stub { */ private VerifyCredentialResponse verifyCredential(int userId, CredentialHash storedHash, byte[] credential, @ChallengeType int challengeType, long challenge, - ICheckCredentialProgressCallback progressCallback) throws RemoteException { + ICheckCredentialProgressCallback progressCallback) { if ((storedHash == null || storedHash.hash.length == 0) && (credential == null || credential.length == 0)) { // don't need to pass empty credentials to GateKeeper @@ -1922,8 +1924,14 @@ public class LockSettingsService extends ILockSettings.Stub { // of unlocking the user, so yell if calling from the main thread. StrictMode.noteDiskRead(); - GateKeeperResponse gateKeeperResponse = getGateKeeperService() - .verifyChallenge(userId, challenge, storedHash.hash, credential); + GateKeeperResponse gateKeeperResponse; + try { + gateKeeperResponse = getGateKeeperService() + .verifyChallenge(userId, challenge, storedHash.hash, credential); + } catch (RemoteException e) { + Slog.e(TAG, "gatekeeper verify failed", e); + gateKeeperResponse = GateKeeperResponse.ERROR; + } VerifyCredentialResponse response = convertResponse(gateKeeperResponse); boolean shouldReEnroll = gateKeeperResponse.getShouldReEnroll(); @@ -1932,7 +1940,11 @@ public class LockSettingsService extends ILockSettings.Stub { // credential has matched if (progressCallback != null) { - progressCallback.onCredentialVerified(); + try { + progressCallback.onCredentialVerified(); + } catch (RemoteException e) { + Log.w(TAG, "progressCallback throws exception", e); + } } notifyActivePasswordMetricsAvailable(storedHash.type, credential, userId); unlockKeystore(credential, userId); @@ -2007,7 +2019,7 @@ public class LockSettingsService extends ILockSettings.Stub { } @Override - public boolean checkVoldPassword(int userId) throws RemoteException { + public boolean checkVoldPassword(int userId) { if (!mFirstCallToVold) { return false; } @@ -2030,6 +2042,9 @@ public class LockSettingsService extends ILockSettings.Stub { try { password = service.getPassword(); service.clearPassword(); + } catch (RemoteException e) { + Slog.w(TAG, "vold getPassword() failed", e); + return false; } finally { Binder.restoreCallingIdentity(identity); } @@ -2071,14 +2086,7 @@ public class LockSettingsService extends ILockSettings.Stub { final KeyStore ks = KeyStore.getInstance(); ks.onUserRemoved(userId); - try { - final IGateKeeperService gk = getGateKeeperService(); - if (gk != null) { - gk.clearSecureUserId(userId); - } - } catch (RemoteException ex) { - Slog.w(TAG, "unable to clear GK secure user id"); - } + gateKeeperClearSecureUserId(userId); if (unknownUser || mUserManager.getUserInfo(userId).isManagedProfile()) { removeKeystoreProfileKey(userId); } @@ -2141,8 +2149,7 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, - String[] args, ShellCallback callback, ResultReceiver resultReceiver) - throws RemoteException { + String[] args, ShellCallback callback, ResultReceiver resultReceiver) { enforceShell(); final long origId = Binder.clearCallingIdentity(); try { @@ -2304,15 +2311,18 @@ public class LockSettingsService extends ILockSettings.Stub { } } - protected synchronized IGateKeeperService getGateKeeperService() - throws RemoteException { + protected synchronized IGateKeeperService getGateKeeperService() { if (mGateKeeperService != null) { return mGateKeeperService; } final IBinder service = ServiceManager.getService(Context.GATEKEEPER_SERVICE); if (service != null) { - service.linkToDeath(new GateKeeperDiedRecipient(), 0); + try { + service.linkToDeath(new GateKeeperDiedRecipient(), 0); + } catch (RemoteException e) { + Slog.w(TAG, " Unable to register death recipient", e); + } mGateKeeperService = IGateKeeperService.Stub.asInterface(service); return mGateKeeperService; } @@ -2321,6 +2331,14 @@ public class LockSettingsService extends ILockSettings.Stub { return null; } + private void gateKeeperClearSecureUserId(int userId) { + try { + getGateKeeperService().clearSecureUserId(userId); + } catch (RemoteException e) { + Slog.w(TAG, "Failed to clear SID", e); + } + } + /** * A user's synthetic password does not change so it must be cached in certain circumstances to * enable untrusted credential reset. @@ -2330,7 +2348,7 @@ public class LockSettingsService extends ILockSettings.Stub { * credential. */ @GuardedBy("mSpManager") - private SparseArray<AuthenticationToken> mSpCache = new SparseArray(); + private SparseArray<AuthenticationToken> mSpCache = new SparseArray<>(); private void onAuthTokenKnownForUser(@UserIdInt int userId, AuthenticationToken auth) { // Preemptively cache the SP and then try to remove it in a handler. @@ -2435,8 +2453,7 @@ public class LockSettingsService extends ILockSettings.Stub { @GuardedBy("mSpManager") @VisibleForTesting protected AuthenticationToken initializeSyntheticPasswordLocked(byte[] credentialHash, - byte[] credential, int credentialType, int requestedQuality, - int userId) throws RemoteException { + byte[] credential, int credentialType, int requestedQuality, int userId) { Slog.i(TAG, "Initialize SyntheticPassword for user: " + userId); final AuthenticationToken auth = mSpManager.newSyntheticPasswordAndSid( getGateKeeperService(), credentialHash, credential, userId); @@ -2459,10 +2476,10 @@ public class LockSettingsService extends ILockSettings.Stub { } else { clearUserKeyProtection(userId); setKeystorePassword(null, userId); - getGateKeeperService().clearSecureUserId(userId); + gateKeeperClearSecureUserId(userId); } fixateNewestUserKeyAuth(userId); - setLong(SYNTHETIC_PASSWORD_HANDLE_KEY, handle, userId); + setSyntheticPasswordHandleLocked(handle, userId); return auth; } @@ -2471,6 +2488,14 @@ public class LockSettingsService extends ILockSettings.Stub { SyntheticPasswordManager.DEFAULT_HANDLE, userId); } + private void setSyntheticPasswordHandleLocked(long handle, int userId) { + final long oldHandle = getSyntheticPasswordHandleLocked(userId); + setLong(SYNTHETIC_PASSWORD_HANDLE_KEY, handle, userId); + setLong(PREV_SYNTHETIC_PASSWORD_HANDLE_KEY, oldHandle, userId); + setLong(SYNTHETIC_PASSWORD_UPDATE_TIME_KEY, System.currentTimeMillis(), userId); + + } + private boolean isSyntheticPasswordBasedCredentialLocked(int userId) { if (userId == USER_FRP) { final int type = mStorage.readPersistentDataBlock().type; @@ -2499,7 +2524,7 @@ public class LockSettingsService extends ILockSettings.Stub { private VerifyCredentialResponse spBasedDoVerifyCredential(byte[] userCredential, @CredentialType int credentialType, @ChallengeType int challengeType, long challenge, int userId, ICheckCredentialProgressCallback progressCallback, - @Nullable ArrayList<PendingResetLockout> resetLockouts) throws RemoteException { + @Nullable ArrayList<PendingResetLockout> resetLockouts) { final boolean hasEnrolledBiometrics = mInjector.hasEnrolledBiometrics(userId); @@ -2606,7 +2631,7 @@ public class LockSettingsService extends ILockSettings.Stub { @GuardedBy("mSpManager") private long setLockCredentialWithAuthTokenLocked(byte[] credential, @CredentialType int credentialType, AuthenticationToken auth, int requestedQuality, - int userId) throws RemoteException { + int userId) { if (DEBUG) Slog.d(TAG, "setLockCredentialWithAuthTokenLocked: user=" + userId); long newHandle = mSpManager.createPasswordBasedSyntheticPassword(getGateKeeperService(), credential, credentialType, auth, requestedQuality, userId); @@ -2638,7 +2663,7 @@ public class LockSettingsService extends ILockSettings.Stub { // we are clearing password of a secured device, so need to nuke SID as well. mSpManager.clearSidForUser(userId); - getGateKeeperService().clearSecureUserId(userId); + gateKeeperClearSecureUserId(userId); // Clear key from vold so ActivityManager can just unlock the user with empty secret // during boot. Vold storage needs to be unlocked before manipulation of the keys can // succeed. @@ -2648,7 +2673,7 @@ public class LockSettingsService extends ILockSettings.Stub { unlockKeystore(auth.deriveKeyStorePassword(), userId); setKeystorePassword(null, userId); } - setLong(SYNTHETIC_PASSWORD_HANDLE_KEY, newHandle, userId); + setSyntheticPasswordHandleLocked(newHandle, userId); synchronizeUnifiedWorkChallengeForProfiles(userId, profilePasswords); notifyActivePasswordMetricsAvailable(credentialType, credential, userId); @@ -2665,7 +2690,7 @@ public class LockSettingsService extends ILockSettings.Stub { @GuardedBy("mSpManager") private void spBasedSetLockCredentialInternalLocked(byte[] credential, int credentialType, byte[] savedCredential, int requestedQuality, int userId, - boolean allowUntrustedChange, boolean isLockTiedToParent) throws RemoteException { + boolean allowUntrustedChange, boolean isLockTiedToParent) { if (DEBUG) Slog.d(TAG, "spBasedSetLockCredentialInternalLocked: user=" + userId); if (isManagedProfileWithUnifiedLock(userId)) { // get credential from keystore when managed profile has unified lock @@ -2688,9 +2713,8 @@ public class LockSettingsService extends ILockSettings.Stub { // If existing credential is provided, the existing credential must match. if (savedCredential != null && auth == null) { - throw new IllegalStateException("Failed to enroll " - + (credentialType == CREDENTIAL_TYPE_PASSWORD - ? "password" : "pattern")); + throw new IllegalStateException(String.format("Failed to enroll %s", + credentialType == CREDENTIAL_TYPE_PASSWORD ? "password" : "pattern")); } boolean untrustedReset = false; if (auth != null) { @@ -2741,7 +2765,7 @@ public class LockSettingsService extends ILockSettings.Stub { * If user is a managed profile with unified challenge, currentCredential is ignored. */ @Override - public byte[] getHashFactor(byte[] currentCredential, int userId) throws RemoteException { + public byte[] getHashFactor(byte[] currentCredential, int userId) { checkPasswordReadPermission(userId); if (currentCredential == null || currentCredential.length == 0) { currentCredential = null; @@ -2770,8 +2794,7 @@ public class LockSettingsService extends ILockSettings.Stub { } } - private long addEscrowToken(byte[] token, int userId, EscrowTokenStateChangeCallback callback) - throws RemoteException { + private long addEscrowToken(byte[] token, int userId, EscrowTokenStateChangeCallback callback) { if (DEBUG) Slog.d(TAG, "addEscrowToken: user=" + userId); synchronized (mSpManager) { enableSyntheticPasswordLocked(); @@ -2847,7 +2870,7 @@ public class LockSettingsService extends ILockSettings.Stub { } private boolean setLockCredentialWithToken(byte[] credential, int type, long tokenHandle, - byte[] token, int requestedQuality, int userId) throws RemoteException { + byte[] token, int requestedQuality, int userId) { boolean result; synchronized (mSpManager) { if (!mSpManager.hasEscrowData(userId)) { @@ -2874,8 +2897,7 @@ public class LockSettingsService extends ILockSettings.Stub { @GuardedBy("mSpManager") private boolean setLockCredentialWithTokenInternalLocked(byte[] credential, int type, - long tokenHandle, byte[] token, int requestedQuality, int userId) - throws RemoteException { + long tokenHandle, byte[] token, int requestedQuality, int userId) { final AuthenticationResult result; result = mSpManager.unwrapTokenBasedSyntheticPassword( getGateKeeperService(), tokenHandle, token, userId); @@ -2901,8 +2923,7 @@ public class LockSettingsService extends ILockSettings.Stub { return true; } - private boolean unlockUserWithToken(long tokenHandle, byte[] token, int userId) - throws RemoteException { + private boolean unlockUserWithToken(long tokenHandle, byte[] token, int userId) { AuthenticationResult authResult; synchronized (mSpManager) { if (!mSpManager.hasEscrowData(userId)) { @@ -2920,29 +2941,57 @@ public class LockSettingsService extends ILockSettings.Stub { return true; } + static String timestampToString(long timestamp) { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(timestamp)); + } + @Override - protected void dump(FileDescriptor fd, PrintWriter pw, String[] args){ - if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; + protected void dump(FileDescriptor fd, PrintWriter printWriter, String[] args) { + if (!DumpUtils.checkDumpPermission(mContext, TAG, printWriter)) return; + IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, " "); pw.println("Current lock settings service state:"); + pw.println(String.format("SP Enabled = %b", mLockPatternUtils.isSyntheticPasswordEnabled())); + pw.println(); + pw.println("User State:"); + pw.increaseIndent(); List<UserInfo> users = mUserManager.getUsers(); for (int user = 0; user < users.size(); user++) { final int userId = users.get(user).id; - pw.println(" User " + userId); + pw.println("User " + userId); + pw.increaseIndent(); synchronized (mSpManager) { - pw.println(String.format(" SP Handle = %x", + pw.println(String.format("SP Handle: %x", getSyntheticPasswordHandleLocked(userId))); + pw.println(String.format("Last changed: %s (%x)", + timestampToString(getLong(SYNTHETIC_PASSWORD_UPDATE_TIME_KEY, 0, userId)), + getLong(PREV_SYNTHETIC_PASSWORD_HANDLE_KEY, 0, userId))); } try { - pw.println(String.format(" SID = %x", + pw.println(String.format("SID: %x", getGateKeeperService().getSecureUserId(userId))); } catch (RemoteException e) { // ignore. } + // It's OK to dump the password type since anyone with physical access can just + // observe it from the keyguard directly. + pw.println("PasswordType: " + getLong(LockPatternUtils.PASSWORD_TYPE_KEY, 0, userId)); + pw.println("hasPassword: " + havePassword(userId)); + pw.println("hasPattern: " + havePattern(userId)); // print raw credential type instead? + pw.println("SeparateChallenge: " + getSeparateProfileChallengeEnabled(userId)); + pw.decreaseIndent(); } + pw.println(); + pw.decreaseIndent(); + + pw.println("Storage:"); + pw.increaseIndent(); + mStorage.dump(pw); + pw.println(); + pw.decreaseIndent(); } private void disableEscrowTokenOnNonManagedDevicesIfNeeded(int userId) { @@ -3081,11 +3130,7 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public long addEscrowToken(byte[] token, int userId, EscrowTokenStateChangeCallback callback) { - try { - return LockSettingsService.this.addEscrowToken(token, userId, callback); - } catch (RemoteException re) { - throw re.rethrowFromSystemServer(); - } + return LockSettingsService.this.addEscrowToken(token, userId, callback); } @Override @@ -3105,21 +3150,13 @@ public class LockSettingsService extends ILockSettings.Stub { throw new UnsupportedOperationException( "This operation requires secure lock screen feature."); } - try { - return LockSettingsService.this.setLockCredentialWithToken(credential, type, - tokenHandle, token, requestedQuality, userId); - } catch (RemoteException re) { - throw re.rethrowFromSystemServer(); - } + return LockSettingsService.this.setLockCredentialWithToken(credential, type, + tokenHandle, token, requestedQuality, userId); } @Override public boolean unlockUserWithToken(long tokenHandle, byte[] token, int userId) { - try { - return LockSettingsService.this.unlockUserWithToken(tokenHandle, token, userId); - } catch (RemoteException re) { - throw re.rethrowFromSystemServer(); - } + return LockSettingsService.this.unlockUserWithToken(tokenHandle, token, userId); } } } diff --git a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java index 29b8aa2e12f4..fe12a945bd4c 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java @@ -35,6 +35,7 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; +import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils.CredentialType; @@ -140,7 +141,7 @@ class LockSettingsStorage { dos.close(); return os.toByteArray(); } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalStateException("Fail to serialze credential hash", e); } } @@ -157,7 +158,7 @@ class LockSettingsStorage { } return new CredentialHash(hash, type); } catch (IOException e) { - throw new RuntimeException(e); + throw new IllegalStateException("Fail to deserialze credential hash", e); } } } @@ -666,7 +667,7 @@ class LockSettingsStorage { dos.writeInt(qualityForUi); dos.write(payload); } catch (IOException e) { - throw new RuntimeException("ByteArrayOutputStream cannot throw IOException"); + throw new IllegalStateException("ByteArrayOutputStream cannot throw IOException"); } return os.toByteArray(); } @@ -676,6 +677,26 @@ class LockSettingsStorage { void initialize(SQLiteDatabase db); } + public void dump(IndentingPrintWriter pw) { + final UserManager um = UserManager.get(mContext); + for (UserInfo user : um.getUsers(false)) { + File userPath = getSyntheticPasswordDirectoryForUser(user.id); + pw.println(String.format("User %d [%s]:", user.id, userPath.getAbsolutePath())); + pw.increaseIndent(); + File[] files = userPath.listFiles(); + if (files != null) { + for (File file : files) { + pw.println(String.format("%4d %s %s", file.length(), + LockSettingsService.timestampToString(file.lastModified()), + file.getName())); + } + } else { + pw.println("[Not found]"); + } + pw.decreaseIndent(); + } + } + static class DatabaseHelper extends SQLiteOpenHelper { private static final String TAG = "LockSettingsDB"; private static final String DATABASE_NAME = "locksettings.db"; diff --git a/services/core/java/com/android/server/locksettings/PasswordSlotManager.java b/services/core/java/com/android/server/locksettings/PasswordSlotManager.java index 4ef63c05325c..17aca1576e40 100644 --- a/services/core/java/com/android/server/locksettings/PasswordSlotManager.java +++ b/services/core/java/com/android/server/locksettings/PasswordSlotManager.java @@ -109,7 +109,7 @@ public class PasswordSlotManager { public void markSlotInUse(int slot) throws RuntimeException { ensureSlotMapLoaded(); if (mSlotMap.containsKey(slot) && !mSlotMap.get(slot).equals(getMode())) { - throw new RuntimeException("password slot " + slot + " is not available"); + throw new IllegalStateException("password slot " + slot + " is not available"); } mSlotMap.put(slot, getMode()); saveSlotMap(); @@ -123,7 +123,7 @@ public class PasswordSlotManager { public void markSlotDeleted(int slot) throws RuntimeException { ensureSlotMapLoaded(); if (mSlotMap.containsKey(slot) && !mSlotMap.get(slot).equals(getMode())) { - throw new RuntimeException("password slot " + slot + " cannot be deleted"); + throw new IllegalStateException("password slot " + slot + " cannot be deleted"); } mSlotMap.remove(slot); saveSlotMap(); diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java index 388e51f203ca..ea0fb47a49b3 100644 --- a/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java +++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java @@ -18,6 +18,7 @@ package com.android.server.locksettings; import android.security.keystore.KeyProperties; import android.security.keystore.KeyProtection; +import android.util.Slog; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -43,6 +44,7 @@ import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.SecretKeySpec; public class SyntheticPasswordCrypto { + private static final String TAG = "SyntheticPasswordCrypto"; private static final int PROFILE_KEY_IV_SIZE = 12; private static final int DEFAULT_TAG_LENGTH_BITS = 128; private static final int AES_KEY_LENGTH = 32; // 256-bit AES key @@ -80,12 +82,12 @@ public class SyntheticPasswordCrypto { byte[] ciphertext = cipher.doFinal(blob); byte[] iv = cipher.getIV(); if (iv.length != PROFILE_KEY_IV_SIZE) { - throw new RuntimeException("Invalid iv length: " + iv.length); + throw new IllegalArgumentException("Invalid iv length: " + iv.length); } final GCMParameterSpec spec = cipher.getParameters().getParameterSpec( GCMParameterSpec.class); if (spec.getTLen() != DEFAULT_TAG_LENGTH_BITS) { - throw new RuntimeException("Invalid tag length: " + spec.getTLen()); + throw new IllegalArgumentException("Invalid tag length: " + spec.getTLen()); } ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); outputStream.write(iv); @@ -102,7 +104,7 @@ public class SyntheticPasswordCrypto { } catch (InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException | IOException | InvalidParameterSpecException e) { - e.printStackTrace(); + Slog.e(TAG, "Failed to encrypt", e); return null; } } @@ -116,7 +118,7 @@ public class SyntheticPasswordCrypto { } catch (InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException | InvalidAlgorithmParameterException e) { - e.printStackTrace(); + Slog.e(TAG, "Failed to decrypt", e); return null; } } @@ -130,8 +132,8 @@ public class SyntheticPasswordCrypto { byte[] intermediate = decrypt(applicationId, APPLICATION_ID_PERSONALIZATION, blob); return decrypt(decryptionKey, intermediate); } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException("Failed to decrypt blob", e); + Slog.e(TAG, "Failed to decrypt V1 blob", e); + throw new IllegalStateException("Failed to decrypt blob", e); } } @@ -148,8 +150,8 @@ public class SyntheticPasswordCrypto { | KeyStoreException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | UnrecoverableKeyException | InvalidAlgorithmParameterException e) { - e.printStackTrace(); - throw new RuntimeException("Failed to decrypt blob", e); + Slog.e(TAG, "Failed to decrypt blob", e); + throw new IllegalStateException("Failed to decrypt blob", e); } } @@ -180,8 +182,8 @@ public class SyntheticPasswordCrypto { | KeyStoreException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | InvalidParameterSpecException e) { - e.printStackTrace(); - throw new RuntimeException("Failed to encrypt blob", e); + Slog.e(TAG, "Failed to create blob", e); + throw new IllegalStateException("Failed to encrypt blob", e); } } @@ -193,7 +195,7 @@ public class SyntheticPasswordCrypto { keyStore.deleteEntry(keyAlias); } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | IOException e) { - e.printStackTrace(); + Slog.e(TAG, "Failed to destroy blob", e); } } @@ -202,7 +204,7 @@ public class SyntheticPasswordCrypto { final int PADDING_LENGTH = 128; MessageDigest digest = MessageDigest.getInstance("SHA-512"); if (personalisation.length > PADDING_LENGTH) { - throw new RuntimeException("Personalisation too long"); + throw new IllegalArgumentException("Personalisation too long"); } // Personalize the hash // Pad it to the block size of the hash function @@ -213,7 +215,7 @@ public class SyntheticPasswordCrypto { } return digest.digest(); } catch (NoSuchAlgorithmException e) { - throw new RuntimeException("NoSuchAlgorithmException for SHA-512", e); + throw new IllegalStateException("NoSuchAlgorithmException for SHA-512", e); } } } diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java index 1ba0e8ce7839..955a9aa8d0de 100644 --- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java +++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java @@ -349,25 +349,28 @@ public class SyntheticPasswordManager { * a default all-zero key is used. If the value is not specified, a fresh random secret is * generated as the value. * - * @return the value stored in the weaver slot - * @throws RemoteException + * @return the value stored in the weaver slot, or null if the operation fails */ - private byte[] weaverEnroll(int slot, byte[] key, @Nullable byte[] value) - throws RemoteException { + private byte[] weaverEnroll(int slot, byte[] key, @Nullable byte[] value) { if (slot == INVALID_WEAVER_SLOT || slot >= mWeaverConfig.slots) { - throw new RuntimeException("Invalid slot for weaver"); + throw new IllegalArgumentException("Invalid slot for weaver"); } if (key == null) { key = new byte[mWeaverConfig.keySize]; } else if (key.length != mWeaverConfig.keySize) { - throw new RuntimeException("Invalid key size for weaver"); + throw new IllegalArgumentException("Invalid key size for weaver"); } if (value == null) { value = secureRandom(mWeaverConfig.valueSize); } - int writeStatus = mWeaver.write(slot, toByteArrayList(key), toByteArrayList(value)); - if (writeStatus != WeaverStatus.OK) { - Log.e(TAG, "weaver write failed, slot: " + slot + " status: " + writeStatus); + try { + int writeStatus = mWeaver.write(slot, toByteArrayList(key), toByteArrayList(value)); + if (writeStatus != WeaverStatus.OK) { + Log.e(TAG, "weaver write failed, slot: " + slot + " status: " + writeStatus); + return null; + } + } catch (RemoteException e) { + Log.e(TAG, "weaver write failed", e); return null; } return value; @@ -377,47 +380,53 @@ public class SyntheticPasswordManager { * Verify the supplied key against a weaver slot, returning a response indicating whether * the verification is successful, throttled or failed. If successful, the bound secret * is also returned. - * @throws RemoteException */ - private VerifyCredentialResponse weaverVerify(int slot, byte[] key) throws RemoteException { + private VerifyCredentialResponse weaverVerify(int slot, byte[] key) { if (slot == INVALID_WEAVER_SLOT || slot >= mWeaverConfig.slots) { - throw new RuntimeException("Invalid slot for weaver"); + throw new IllegalArgumentException("Invalid slot for weaver"); } if (key == null) { key = new byte[mWeaverConfig.keySize]; } else if (key.length != mWeaverConfig.keySize) { - throw new RuntimeException("Invalid key size for weaver"); + throw new IllegalArgumentException("Invalid key size for weaver"); } final VerifyCredentialResponse[] response = new VerifyCredentialResponse[1]; - mWeaver.read(slot, toByteArrayList(key), (int status, WeaverReadResponse readResponse) -> { - switch (status) { - case WeaverReadStatus.OK: - response[0] = new VerifyCredentialResponse( - fromByteArrayList(readResponse.value)); - break; - case WeaverReadStatus.THROTTLE: - response[0] = new VerifyCredentialResponse(readResponse.timeout); - Log.e(TAG, "weaver read failed (THROTTLE), slot: " + slot); - break; - case WeaverReadStatus.INCORRECT_KEY: - if (readResponse.timeout == 0) { - response[0] = VerifyCredentialResponse.ERROR; - Log.e(TAG, "weaver read failed (INCORRECT_KEY), slot: " + slot); - } else { - response[0] = new VerifyCredentialResponse(readResponse.timeout); - Log.e(TAG, "weaver read failed (INCORRECT_KEY/THROTTLE), slot: " + slot); + try { + mWeaver.read(slot, toByteArrayList(key), + (int status, WeaverReadResponse readResponse) -> { + switch (status) { + case WeaverReadStatus.OK: + response[0] = new VerifyCredentialResponse( + fromByteArrayList(readResponse.value)); + break; + case WeaverReadStatus.THROTTLE: + response[0] = new VerifyCredentialResponse(readResponse.timeout); + Log.e(TAG, "weaver read failed (THROTTLE), slot: " + slot); + break; + case WeaverReadStatus.INCORRECT_KEY: + if (readResponse.timeout == 0) { + response[0] = VerifyCredentialResponse.ERROR; + Log.e(TAG, "weaver read failed (INCORRECT_KEY), slot: " + slot); + } else { + response[0] = new VerifyCredentialResponse(readResponse.timeout); + Log.e(TAG, "weaver read failed (INCORRECT_KEY/THROTTLE), slot: " + + slot); + } + break; + case WeaverReadStatus.FAILED: + response[0] = VerifyCredentialResponse.ERROR; + Log.e(TAG, "weaver read failed (FAILED), slot: " + slot); + break; + default: + response[0] = VerifyCredentialResponse.ERROR; + Log.e(TAG, "weaver read unknown status " + status + ", slot: " + slot); + break; } - break; - case WeaverReadStatus.FAILED: - response[0] = VerifyCredentialResponse.ERROR; - Log.e(TAG, "weaver read failed (FAILED), slot: " + slot); - break; - default: - response[0] = VerifyCredentialResponse.ERROR; - Log.e(TAG, "weaver read unknown status " + status + ", slot: " + slot); - break; - } - }); + }); + } catch (RemoteException e) { + response[0] = VerifyCredentialResponse.ERROR; + Log.e(TAG, "weaver read failed, slot: " + slot, e); + } return response[0]; } @@ -460,12 +469,15 @@ public class SyntheticPasswordManager { * */ public AuthenticationToken newSyntheticPasswordAndSid(IGateKeeperService gatekeeper, - byte[] hash, byte[] credential, int userId) throws RemoteException { + byte[] hash, byte[] credential, int userId) { AuthenticationToken result = AuthenticationToken.create(); GateKeeperResponse response; if (hash != null) { - response = gatekeeper.enroll(userId, hash, credential, - result.deriveGkPassword()); + try { + response = gatekeeper.enroll(userId, hash, credential, result.deriveGkPassword()); + } catch (RemoteException e) { + throw new IllegalStateException("Failed to enroll credential duing SP init", e); + } if (response.getResponseCode() != GateKeeperResponse.RESPONSE_OK) { Log.w(TAG, "Fail to migrate SID, assuming no SID, user " + userId); clearSidForUser(userId); @@ -484,9 +496,13 @@ public class SyntheticPasswordManager { * Used when adding password to previously-unsecured devices. */ public void newSidForUser(IGateKeeperService gatekeeper, AuthenticationToken authToken, - int userId) throws RemoteException { - GateKeeperResponse response = gatekeeper.enroll(userId, null, null, - authToken.deriveGkPassword()); + int userId) { + GateKeeperResponse response; + try { + response = gatekeeper.enroll(userId, null, null, authToken.deriveGkPassword()); + } catch (RemoteException e) { + throw new IllegalStateException("Failed to create new SID for user", e); + } if (response.getResponseCode() != GateKeeperResponse.RESPONSE_OK) { Log.e(TAG, "Fail to create new SID for user " + userId); return; @@ -565,12 +581,8 @@ public class SyntheticPasswordManager { Set<Integer> usedSlots = getUsedWeaverSlots(); if (!usedSlots.contains(slot)) { Log.i(TAG, "Destroy weaver slot " + slot + " for user " + userId); - try { - weaverEnroll(slot, null, null); - mPasswordSlotManager.markSlotDeleted(slot); - } catch (RemoteException e) { - Log.w(TAG, "Failed to destroy slot", e); - } + weaverEnroll(slot, null, null); + mPasswordSlotManager.markSlotDeleted(slot); } else { Log.w(TAG, "Skip destroying reused weaver slot " + slot + " for user " + userId); } @@ -608,7 +620,7 @@ public class SyntheticPasswordManager { return i; } } - throw new RuntimeException("Run out of weaver slots."); + throw new IllegalStateException("Run out of weaver slots."); } /** @@ -622,11 +634,12 @@ public class SyntheticPasswordManager { * * @see #newSidForUser * @see #clearSidForUser + * @return a new password handle for the wrapped SP blob + * @throw IllegalStateException if creation fails. */ public long createPasswordBasedSyntheticPassword(IGateKeeperService gatekeeper, byte[] credential, int credentialType, AuthenticationToken authToken, - int requestedQuality, int userId) - throws RemoteException { + int requestedQuality, int userId) { if (credential == null || credentialType == LockPatternUtils.CREDENTIAL_TYPE_NONE) { credentialType = LockPatternUtils.CREDENTIAL_TYPE_NONE; credential = DEFAULT_PASSWORD; @@ -642,10 +655,11 @@ public class SyntheticPasswordManager { // Weaver based user password int weaverSlot = getNextAvailableWeaverSlot(); Log.i(TAG, "Weaver enroll password to slot " + weaverSlot + " for user " + userId); - byte[] weaverSecret = weaverEnroll(weaverSlot, passwordTokenToWeaverKey(pwdToken), null); + byte[] weaverSecret = weaverEnroll(weaverSlot, passwordTokenToWeaverKey(pwdToken), + null); if (weaverSecret == null) { - Log.e(TAG, "Fail to enroll user password under weaver " + userId); - return DEFAULT_HANDLE; + throw new IllegalStateException( + "Fail to enroll user password under weaver " + userId); } saveWeaverSlot(weaverSlot, handle, userId); mPasswordSlotManager.markSlotInUse(weaverSlot); @@ -657,13 +671,22 @@ public class SyntheticPasswordManager { } else { // In case GK enrollment leaves persistent state around (in RPMB), this will nuke them // to prevent them from accumulating and causing problems. - gatekeeper.clearSecureUserId(fakeUid(userId)); + try { + gatekeeper.clearSecureUserId(fakeUid(userId)); + } catch (RemoteException ignore) { + Log.w(TAG, "Failed to clear SID from gatekeeper"); + } // GateKeeper based user password - GateKeeperResponse response = gatekeeper.enroll(fakeUid(userId), null, null, - passwordTokenToGkInput(pwdToken)); + GateKeeperResponse response; + try { + response = gatekeeper.enroll(fakeUid(userId), null, null, + passwordTokenToGkInput(pwdToken)); + } catch (RemoteException e) { + throw new IllegalStateException("Failed to enroll password for new SP blob", e); + } if (response.getResponseCode() != GateKeeperResponse.RESPONSE_OK) { - Log.e(TAG, "Fail to enroll user password when creating SP for user " + userId); - return DEFAULT_HANDLE; + throw new IllegalStateException( + "Fail to enroll user password when creating SP for user " + userId); } pwd.passwordHandle = response.getPayload(); sid = sidFromPasswordHandle(pwd.passwordHandle); @@ -680,14 +703,20 @@ public class SyntheticPasswordManager { public VerifyCredentialResponse verifyFrpCredential(IGateKeeperService gatekeeper, byte[] userCredential, int credentialType, - ICheckCredentialProgressCallback progressCallback) throws RemoteException { + ICheckCredentialProgressCallback progressCallback) { PersistentData persistentData = mStorage.readPersistentDataBlock(); if (persistentData.type == PersistentData.TYPE_SP) { PasswordData pwd = PasswordData.fromBytes(persistentData.payload); byte[] pwdToken = computePasswordToken(userCredential, pwd); - GateKeeperResponse response = gatekeeper.verifyChallenge(fakeUid(persistentData.userId), - 0 /* challenge */, pwd.passwordHandle, passwordTokenToGkInput(pwdToken)); + GateKeeperResponse response; + try { + response = gatekeeper.verifyChallenge(fakeUid(persistentData.userId), + 0 /* challenge */, pwd.passwordHandle, passwordTokenToGkInput(pwdToken)); + } catch (RemoteException e) { + Log.e(TAG, "FRP verifyChallenge failed", e); + return VerifyCredentialResponse.ERROR; + } return VerifyCredentialResponse.fromGateKeeperResponse(response); } else if (persistentData.type == PersistentData.TYPE_SP_WEAVER) { PasswordData pwd = PasswordData.fromBytes(persistentData.payload); @@ -805,11 +834,9 @@ public class SyntheticPasswordManager { } if (isWeaverAvailable()) { int slot = getNextAvailableWeaverSlot(); - try { - Log.i(TAG, "Weaver enroll token to slot " + slot + " for user " + userId); - weaverEnroll(slot, null, tokenData.weaverSecret); - } catch (RemoteException e) { - Log.e(TAG, "Failed to enroll weaver secret when activating token", e); + Log.i(TAG, "Weaver enroll token to slot " + slot + " for user " + userId); + if (weaverEnroll(slot, null, tokenData.weaverSecret) == null) { + Log.e(TAG, "Failed to enroll weaver secret when activating token"); return false; } saveWeaverSlot(slot, handle, userId); @@ -859,7 +886,7 @@ public class SyntheticPasswordManager { */ public AuthenticationResult unwrapPasswordBasedSyntheticPassword(IGateKeeperService gatekeeper, long handle, byte[] credential, int userId, - ICheckCredentialProgressCallback progressCallback) throws RemoteException { + ICheckCredentialProgressCallback progressCallback) { if (credential == null) { credential = DEFAULT_PASSWORD; } @@ -886,14 +913,28 @@ public class SyntheticPasswordManager { applicationId = transformUnderWeaverSecret(pwdToken, result.gkResponse.getPayload()); } else { byte[] gkPwdToken = passwordTokenToGkInput(pwdToken); - GateKeeperResponse response = gatekeeper.verifyChallenge(fakeUid(userId), 0L, - pwd.passwordHandle, gkPwdToken); + GateKeeperResponse response; + try { + response = gatekeeper.verifyChallenge(fakeUid(userId), 0L, + pwd.passwordHandle, gkPwdToken); + } catch (RemoteException e) { + Log.e(TAG, "gatekeeper verify failed", e); + result.gkResponse = VerifyCredentialResponse.ERROR; + return result; + } int responseCode = response.getResponseCode(); if (responseCode == GateKeeperResponse.RESPONSE_OK) { result.gkResponse = VerifyCredentialResponse.OK; if (response.getShouldReEnroll()) { - GateKeeperResponse reenrollResponse = gatekeeper.enroll(fakeUid(userId), - pwd.passwordHandle, gkPwdToken, gkPwdToken); + GateKeeperResponse reenrollResponse; + try { + reenrollResponse = gatekeeper.enroll(fakeUid(userId), + pwd.passwordHandle, gkPwdToken, gkPwdToken); + } catch (RemoteException e) { + Log.w(TAG, "Fail to invoke gatekeeper.enroll", e); + reenrollResponse = GateKeeperResponse.ERROR; + // continue the flow anyway + } if (reenrollResponse.getResponseCode() == GateKeeperResponse.RESPONSE_OK) { pwd.passwordHandle = reenrollResponse.getPayload(); saveState(PASSWORD_DATA_NAME, pwd.toBytes(), handle, userId); @@ -922,7 +963,11 @@ public class SyntheticPasswordManager { // Supplied credential passes first stage weaver/gatekeeper check so it should be correct. // Notify the callback so the keyguard UI can proceed immediately. if (progressCallback != null) { - progressCallback.onCredentialVerified(); + try { + progressCallback.onCredentialVerified(); + } catch (RemoteException e) { + Log.w(TAG, "progressCallback throws exception", e); + } } result.authToken = unwrapSyntheticPasswordBlob(handle, SYNTHETIC_PASSWORD_PASSWORD_BASED, applicationId, sid, userId); @@ -938,8 +983,7 @@ public class SyntheticPasswordManager { * verification to referesh the SID & Auth token maintained by the system. */ public @NonNull AuthenticationResult unwrapTokenBasedSyntheticPassword( - IGateKeeperService gatekeeper, long handle, byte[] token, int userId) - throws RemoteException { + IGateKeeperService gatekeeper, long handle, byte[] token, int userId) { AuthenticationResult result = new AuthenticationResult(); byte[] secdiscardable = loadSecdiscardable(handle, userId); int slotId = loadWeaverSlot(handle, userId); @@ -985,10 +1029,10 @@ public class SyntheticPasswordManager { if (version != SYNTHETIC_PASSWORD_VERSION_V3 && version != SYNTHETIC_PASSWORD_VERSION_V2 && version != SYNTHETIC_PASSWORD_VERSION_V1) { - throw new RuntimeException("Unknown blob version"); + throw new IllegalArgumentException("Unknown blob version"); } if (blob[1] != type) { - throw new RuntimeException("Invalid blob type"); + throw new IllegalArgumentException("Invalid blob type"); } final byte[] secret; if (version == SYNTHETIC_PASSWORD_VERSION_V1) { @@ -1028,38 +1072,48 @@ public class SyntheticPasswordManager { * decrypt SP. */ public @Nullable VerifyCredentialResponse verifyChallenge(IGateKeeperService gatekeeper, - @NonNull AuthenticationToken auth, long challenge, int userId) throws RemoteException { + @NonNull AuthenticationToken auth, long challenge, int userId) { byte[] spHandle = loadSyntheticPasswordHandle(userId); if (spHandle == null) { // There is no password handle associated with the given user, i.e. the user is not // secured by lockscreen and has no SID, so just return here; return null; } - VerifyCredentialResponse result; - GateKeeperResponse response = gatekeeper.verifyChallenge(userId, challenge, - spHandle, auth.deriveGkPassword()); + GateKeeperResponse response; + try { + response = gatekeeper.verifyChallenge(userId, challenge, + spHandle, auth.deriveGkPassword()); + } catch (RemoteException e) { + Log.e(TAG, "Fail to verify with gatekeeper " + userId, e); + return VerifyCredentialResponse.ERROR; + } int responseCode = response.getResponseCode(); if (responseCode == GateKeeperResponse.RESPONSE_OK) { - result = new VerifyCredentialResponse(response.getPayload()); + VerifyCredentialResponse result = new VerifyCredentialResponse(response.getPayload()); if (response.getShouldReEnroll()) { - response = gatekeeper.enroll(userId, spHandle, - spHandle, auth.deriveGkPassword()); + try { + response = gatekeeper.enroll(userId, spHandle, spHandle, + auth.deriveGkPassword()); + } catch (RemoteException e) { + Log.e(TAG, "Failed to invoke gatekeeper.enroll", e); + response = GateKeeperResponse.ERROR; + } if (response.getResponseCode() == GateKeeperResponse.RESPONSE_OK) { spHandle = response.getPayload(); saveSyntheticPasswordHandle(spHandle, userId); // Call self again to re-verify with updated handle return verifyChallenge(gatekeeper, auth, challenge, userId); } else { + // Fall through, return result from the previous verification attempt. Log.w(TAG, "Fail to re-enroll SP handle for user " + userId); - // Fall through, return existing handle } } + return result; } else if (responseCode == GateKeeperResponse.RESPONSE_RETRY) { - result = new VerifyCredentialResponse(response.getTimeout()); + return new VerifyCredentialResponse(response.getTimeout()); } else { - result = VerifyCredentialResponse.ERROR; + return VerifyCredentialResponse.ERROR; } - return result; } public boolean existsHandle(long handle, int userId) { @@ -1183,7 +1237,7 @@ public class SyntheticPasswordManager { private byte[] passwordTokenToWeaverKey(byte[] token) { byte[] key = SyntheticPasswordCrypto.personalisedHash(PERSONALISATION_WEAVER_KEY, token); if (key.length < mWeaverConfig.keySize) { - throw new RuntimeException("weaver key length too small"); + throw new IllegalArgumentException("weaver key length too small"); } return Arrays.copyOf(key, mWeaverConfig.keySize); } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 6fe924e7432d..aa548f260450 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -231,7 +231,7 @@ import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import com.android.internal.util.function.TriPredicate; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; import com.android.server.EventLogTags; import com.android.server.IoThread; import com.android.server.LocalServices; @@ -4830,7 +4830,7 @@ public class NotificationManagerService extends SystemService { final ActivityManagerInternal am = LocalServices .getService(ActivityManagerInternal.class); final long duration = LocalServices.getService( - DeviceIdleController.LocalService.class).getNotificationWhitelistDuration(); + DeviceIdleInternal.class).getNotificationWhitelistDuration(); for (int i = 0; i < intentCount; i++) { PendingIntent pendingIntent = notification.allPendingIntents.valueAt(i); if (pendingIntent != null) { diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index ce951816d3a6..8171a8d45ffa 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -752,7 +752,7 @@ public final class OverlayManagerService extends SystemService { @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { final DumpState dumpState = new DumpState(); - dumpState.setUserId(UserHandle.getUserId(Binder.getCallingUid())); + dumpState.setUserId(UserHandle.USER_ALL); int opti = 0; while (opti < args.length) { @@ -772,13 +772,13 @@ public final class OverlayManagerService extends SystemService { pw.println(" so the following are equivalent: mState, mstate, State, state."); return; } else if ("--user".equals(opt)) { - opti++; if (opti >= args.length) { pw.println("Error: user missing argument"); return; } try { dumpState.setUserId(Integer.parseInt(args[opti])); + opti++; } catch (NumberFormatException e) { pw.println("Error: user argument is not a number: " + args[opti]); return; diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index 4431d869af70..7eb74381f7ae 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -16,10 +16,10 @@ package com.android.server.pm; +import static android.provider.DeviceConfig.NAMESPACE_PACKAGE_MANAGER_SERVICE; + import android.Manifest; import android.annotation.Nullable; -import android.app.AppOpsManager; -import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.PackageParser; @@ -28,11 +28,14 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.permission.IPermissionManager; +import android.provider.DeviceConfig; import android.util.ArraySet; import android.util.Slog; import android.util.SparseArray; import com.android.internal.R; +import com.android.server.FgThread; +import com.android.server.compat.PlatformCompat; import java.io.PrintWriter; import java.util.Collections; @@ -41,7 +44,6 @@ import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; /** * The entity responsible for filtering visibility between apps based on declarations in their @@ -98,14 +100,11 @@ class AppsFilter { private final IPermissionManager mPermissionManager; - private final AppOpsManager mAppOpsManager; - private final ConfigProvider mConfigProvider; + private final FeatureConfig mFeatureConfig; - AppsFilter(ConfigProvider configProvider, IPermissionManager permissionManager, - AppOpsManager appOpsManager, String[] forceQueryableWhitelist, - boolean systemAppsQueryable) { - mConfigProvider = configProvider; - mAppOpsManager = appOpsManager; + AppsFilter(FeatureConfig featureConfig, IPermissionManager permissionManager, + String[] forceQueryableWhitelist, boolean systemAppsQueryable) { + mFeatureConfig = featureConfig; final HashSet<String> forceQueryableByDeviceSet = new HashSet<>(); Collections.addAll(forceQueryableByDeviceSet, forceQueryableWhitelist); this.mForceQueryableByDevice = Collections.unmodifiableSet(forceQueryableByDeviceSet); @@ -114,27 +113,83 @@ class AppsFilter { mSystemAppsQueryable = systemAppsQueryable; } - public static AppsFilter create(Context context) { - // tracks whether the feature is enabled where -1 is unknown, 0 is false and 1 is true; - final AtomicInteger featureEnabled = new AtomicInteger(-1); + public interface FeatureConfig { + /** Called when the system is ready and components can be queried. */ + void onSystemReady(); + + /** @return true if we should filter apps at all. */ + boolean isGloballyEnabled(); + + /** @return true if the feature is enabled for the given package. */ + boolean packageIsEnabled(PackageParser.Package pkg); + } + + private static class FeatureConfigImpl implements FeatureConfig { + private static final String FILTERING_ENABLED_NAME = "package_query_filtering_enabled"; + + // STOPSHIP(patb): set this to true if we plan to launch this in R + private static final boolean DEFAULT_ENABLED_STATE = false; + private final PackageManagerService.Injector mInjector; + private volatile boolean mFeatureEnabled = DEFAULT_ENABLED_STATE; + + private FeatureConfigImpl(PackageManagerService.Injector injector) { + mInjector = injector; + } + + @Override + public void onSystemReady() { + mFeatureEnabled = DeviceConfig.getBoolean( + NAMESPACE_PACKAGE_MANAGER_SERVICE, FILTERING_ENABLED_NAME, + DEFAULT_ENABLED_STATE); + DeviceConfig.addOnPropertiesChangedListener( + NAMESPACE_PACKAGE_MANAGER_SERVICE, FgThread.getExecutor(), + properties -> { + synchronized (FeatureConfigImpl.this) { + mFeatureEnabled = properties.getBoolean( + FILTERING_ENABLED_NAME, DEFAULT_ENABLED_STATE); + } + }); + } + + @Override + public boolean isGloballyEnabled() { + return mFeatureEnabled; + } + + @Override + public boolean packageIsEnabled(PackageParser.Package pkg) { + final PlatformCompat compatibility = mInjector.getCompatibility(); + if (compatibility == null) { + Slog.wtf(TAG, "PlatformCompat is null"); + return mFeatureEnabled; + } + return compatibility.isChangeEnabled( + PackageManager.FILTER_APPLICATION_QUERY, pkg.applicationInfo); + } + } + + public static AppsFilter create(PackageManagerService.Injector injector) { final boolean forceSystemAppsQueryable = - context.getResources().getBoolean(R.bool.config_forceSystemPackagesQueryable); + injector.getContext().getResources() + .getBoolean(R.bool.config_forceSystemPackagesQueryable); + final FeatureConfig featureConfig = new FeatureConfigImpl(injector); final String[] forcedQueryablePackageNames; if (forceSystemAppsQueryable) { // all system apps already queryable, no need to read and parse individual exceptions forcedQueryablePackageNames = new String[]{}; } else { forcedQueryablePackageNames = - context.getResources().getStringArray(R.array.config_forceQueryablePackages); + injector.getContext().getResources() + .getStringArray(R.array.config_forceQueryablePackages); for (int i = 0; i < forcedQueryablePackageNames.length; i++) { forcedQueryablePackageNames[i] = forcedQueryablePackageNames[i].intern(); } } IPermissionManager permissionmgr = (IPermissionManager) ServiceManager.getService("permissionmgr"); - return new AppsFilter(() -> false, permissionmgr, - context.getSystemService(AppOpsManager.class), forcedQueryablePackageNames, + + return new AppsFilter(featureConfig, permissionmgr, forcedQueryablePackageNames, forceSystemAppsQueryable); } @@ -186,6 +241,10 @@ class AppsFilter { currentUser.get(targetPackage.pkg.packageName).add(initiatingPackage.pkg.packageName); } + public void onSystemReady() { + mFeatureConfig.onSystemReady(); + } + /** * Adds a package that should be considered when filtering visibility between apps. * @@ -267,11 +326,11 @@ class AppsFilter { */ public boolean shouldFilterApplication(int callingUid, @Nullable SettingBase callingSetting, PackageSetting targetPkgSetting, int userId) { - if (callingUid < Process.FIRST_APPLICATION_UID) { + final boolean featureEnabled = mFeatureConfig.isGloballyEnabled(); + if (!featureEnabled && !DEBUG_RUN_WHEN_DISABLED) { return false; } - final boolean featureEnabled = mConfigProvider.isEnabled(); - if (!featureEnabled && !DEBUG_RUN_WHEN_DISABLED) { + if (callingUid < Process.FIRST_APPLICATION_UID) { return false; } if (callingSetting == null) { @@ -312,31 +371,21 @@ class AppsFilter { return true; } } - if (!featureEnabled) { return false; } - final int mode = mAppOpsManager - .checkOpNoThrow(AppOpsManager.OP_QUERY_ALL_PACKAGES, callingUid, - callingPkgSetting.pkg.packageName); - switch (mode) { - case AppOpsManager.MODE_DEFAULT: - if (DEBUG_LOGGING) { - Slog.d(TAG, "filtered interaction: " + callingPkgSetting.name + " -> " - + targetPkgSetting.name + (DEBUG_ALLOW_ALL ? " ALLOWED" : "")); - } - return !DEBUG_ALLOW_ALL; - case AppOpsManager.MODE_ALLOWED: - // explicitly allowed to see all packages, don't filter - return false; - case AppOpsManager.MODE_ERRORED: - // deny / error: let's log so developer can audit usages - Slog.i(TAG, callingPkgSetting.pkg.packageName - + " blocked from accessing " + targetPkgSetting.pkg.packageName); - case AppOpsManager.MODE_IGNORED: - // fall through - default: - return true; + if (mFeatureConfig.packageIsEnabled(callingPkgSetting.pkg)) { + if (DEBUG_LOGGING) { + Slog.d(TAG, "interaction: " + callingPkgSetting.name + " -> " + + targetPkgSetting.name + (DEBUG_ALLOW_ALL ? " ALLOWED" : "BLOCKED")); + } + return !DEBUG_ALLOW_ALL; + } else { + if (DEBUG_LOGGING) { + Slog.d(TAG, "interaction: " + callingPkgSetting.name + " -> " + + targetPkgSetting.name + " DISABLED"); + } + return false; } } @@ -377,6 +426,13 @@ class AppsFilter { && mImplicitlyQueryable.get(userId).get(callingName).contains(targetName)) { return false; } + if (callingPkgSetting.pkg.instrumentation.size() > 0) { + for (int i = 0, max = callingPkgSetting.pkg.instrumentation.size(); i < max; i++) { + if (callingPkgSetting.pkg.instrumentation.get(i).info.targetPackage == targetName) { + return false; + } + } + } try { if (mPermissionManager.checkPermission( Manifest.permission.QUERY_ALL_PACKAGES, callingName, userId) @@ -400,7 +456,6 @@ class AppsFilter { pw.println(); pw.println("Queries:"); dumpState.onTitlePrinted(); - pw.println(" enabled: " + mConfigProvider.isEnabled()); pw.println(" system apps queryable: " + mSystemAppsQueryable); dumpPackageSet(pw, filteringPackageName, mForceQueryableByDevice, "System whitelist", " "); dumpPackageSet(pw, filteringPackageName, mForceQueryable, "forceQueryable", " "); @@ -442,9 +497,4 @@ class AppsFilter { } } } - - public interface ConfigProvider { - boolean isEnabled(); - } - } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index af20346fc168..15a3a725d69d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -290,7 +290,7 @@ import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.server.AttributeCache; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; import com.android.server.EventLogTags; import com.android.server.FgThread; import com.android.server.LocalServices; @@ -300,6 +300,7 @@ import com.android.server.ServiceThread; import com.android.server.SystemConfig; import com.android.server.SystemServerInitThreadPool; import com.android.server.Watchdog; +import com.android.server.compat.PlatformCompat; import com.android.server.net.NetworkPolicyManagerInternal; import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.Settings.DatabaseVersion; @@ -816,7 +817,7 @@ public class PackageManagerService extends IPackageManager.Stub private final Singleton<UserManagerService> mUserManagerProducer; private final Singleton<Settings> mSettingsProducer; private final Singleton<ActivityTaskManagerInternal> mActivityTaskManagerProducer; - private final Singleton<DeviceIdleController.LocalService> mLocalDeviceIdleController; + private final Singleton<DeviceIdleInternal> mLocalDeviceIdleController; private final Singleton<StorageManagerInternal> mStorageManagerInternalProducer; private final Singleton<NetworkPolicyManagerInternal> mNetworkPolicyManagerProducer; private final Singleton<PermissionPolicyInternal> mPermissionPolicyProducer; @@ -824,6 +825,8 @@ public class PackageManagerService extends IPackageManager.Stub private final Singleton<DisplayManager> mDisplayManagerProducer; private final Singleton<StorageManager> mStorageManagerProducer; private final Singleton<AppOpsManager> mAppOpsManagerProducer; + private final Singleton<AppsFilter> mAppsFilterProducer; + private final Singleton<PlatformCompat> mPlatformCompatProducer; Injector(Context context, Object lock, Installer installer, Object installLock, PackageAbiHelper abiHelper, @@ -832,14 +835,16 @@ public class PackageManagerService extends IPackageManager.Stub Producer<UserManagerService> userManagerProducer, Producer<Settings> settingsProducer, Producer<ActivityTaskManagerInternal> activityTaskManagerProducer, - Producer<DeviceIdleController.LocalService> deviceIdleControllerProducer, + Producer<DeviceIdleInternal> deviceIdleControllerProducer, Producer<StorageManagerInternal> storageManagerInternalProducer, Producer<NetworkPolicyManagerInternal> networkPolicyManagerProducer, Producer<PermissionPolicyInternal> permissionPolicyProvider, Producer<DeviceStorageMonitorInternal> deviceStorageMonitorProducer, Producer<DisplayManager> displayManagerProducer, Producer<StorageManager> storageManagerProducer, - Producer<AppOpsManager> appOpsManagerProducer) { + Producer<AppOpsManager> appOpsManagerProducer, + Producer<AppsFilter> appsFilterProducer, + Producer<PlatformCompat> platformCompatProducer) { mContext = context; mLock = lock; mInstaller = installer; @@ -858,6 +863,8 @@ public class PackageManagerService extends IPackageManager.Stub mDisplayManagerProducer = new Singleton<>(displayManagerProducer); mStorageManagerProducer = new Singleton<>(storageManagerProducer); mAppOpsManagerProducer = new Singleton<>(appOpsManagerProducer); + mAppsFilterProducer = new Singleton<>(appsFilterProducer); + mPlatformCompatProducer = new Singleton<>(platformCompatProducer); } /** @@ -912,7 +919,7 @@ public class PackageManagerService extends IPackageManager.Stub return mActivityTaskManagerProducer.get(this, mPackageManager); } - public DeviceIdleController.LocalService getLocalDeviceIdleController() { + public DeviceIdleInternal getLocalDeviceIdleController() { return mLocalDeviceIdleController.get(this, mPackageManager); } @@ -943,6 +950,14 @@ public class PackageManagerService extends IPackageManager.Stub public AppOpsManager getAppOpsManager() { return mAppOpsManagerProducer.get(this, mPackageManager); } + + public AppsFilter getAppsFilter() { + return mAppsFilterProducer.get(this, mPackageManager); + } + + public PlatformCompat getCompatibility() { + return mPlatformCompatProducer.get(this, mPackageManager); + } } private final AppsFilter mAppsFilter; @@ -1249,7 +1264,7 @@ public class PackageManagerService extends IPackageManager.Stub final BroadcastOptions options = BroadcastOptions.makeBasic(); options.setTemporaryAppWhitelistDuration(whitelistTimeout); - DeviceIdleController.LocalService idleController = + DeviceIdleInternal idleController = mInjector.getLocalDeviceIdleController(); idleController.addPowerSaveTempWhitelistApp(Process.myUid(), mIntentFilterVerifierComponent.getPackageName(), whitelistTimeout, @@ -2273,9 +2288,9 @@ public class PackageManagerService extends IPackageManager.Stub * @param packageVolume The storage volume of the package. * @param packageIsExternal true if the package is currently installed on * external/removable/unprotected storage. - * @return {@link StorageEnum#TYPE_UNKNOWN} if the package is not stored externally or the - * corresponding {@link StorageEnum} storage type value if it is. - * corresponding {@link StorageEnum} storage type value if it is. + * @return {@link StorageEnums#UNKNOWN} if the package is not stored externally or the + * corresponding {@link StorageEnums} storage type value if it is. + * corresponding {@link StorageEnums} storage type value if it is. */ private static int getPackageExternalStorageType(VolumeInfo packageVolume, boolean packageIsExternal) { @@ -2425,14 +2440,16 @@ public class PackageManagerService extends IPackageManager.Stub i.getPermissionManagerServiceInternal().getPermissionSettings(), lock), new Injector.LocalServicesProducer<>(ActivityTaskManagerInternal.class), - new Injector.LocalServicesProducer<>(DeviceIdleController.LocalService.class), + new Injector.LocalServicesProducer<>(DeviceIdleInternal.class), new Injector.LocalServicesProducer<>(StorageManagerInternal.class), new Injector.LocalServicesProducer<>(NetworkPolicyManagerInternal.class), new Injector.LocalServicesProducer<>(PermissionPolicyInternal.class), new Injector.LocalServicesProducer<>(DeviceStorageMonitorInternal.class), new Injector.SystemServiceProducer<>(DisplayManager.class), new Injector.SystemServiceProducer<>(StorageManager.class), - new Injector.SystemServiceProducer<>(AppOpsManager.class)); + new Injector.SystemServiceProducer<>(AppOpsManager.class), + (i, pm) -> AppsFilter.create(i), + (i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat")); PackageManagerService m = new PackageManagerService(injector, factoryTest, onlyCore); t.traceEnd(); // "create package manager" @@ -2617,7 +2634,7 @@ public class PackageManagerService extends IPackageManager.Stub mProtectedPackages = new ProtectedPackages(mContext); mApexManager = ApexManager.create(mContext); - mAppsFilter = AppsFilter.create(mContext); + mAppsFilter = mInjector.getAppsFilter(); // CHECKSTYLE:OFF IndentationCheck synchronized (mInstallLock) { @@ -2725,14 +2742,10 @@ public class PackageManagerService extends IPackageManager.Stub mIsPreNMR1Upgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.N_MR1; mIsPreQUpgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.Q; - int preUpgradeSdkVersion = ver.sdkVersion; - // save off the names of pre-existing system packages prior to scanning; we don't // want to automatically grant runtime permissions for new system apps if (mPromoteSystemApps) { - Iterator<PackageSetting> pkgSettingIter = mSettings.mPackages.values().iterator(); - while (pkgSettingIter.hasNext()) { - PackageSetting ps = pkgSettingIter.next(); + for (PackageSetting ps : mSettings.mPackages.values()) { if (isSystemApp(ps)) { mExistingSystemPackages.add(ps.name); } @@ -14511,7 +14524,7 @@ public class PackageManagerService extends IPackageManager.Stub final List<ComponentName> sufficientVerifiers = matchVerifiers(pkgLite, receivers, verificationState); - DeviceIdleController.LocalService idleController = + DeviceIdleInternal idleController = mInjector.getLocalDeviceIdleController(); final long idleDuration = getVerificationTimeout(); @@ -14580,17 +14593,6 @@ public class PackageManagerService extends IPackageManager.Stub TRACE_TAG_PACKAGE_MANAGER, "enable_rollback", enableRollbackToken); mPendingEnableRollback.append(enableRollbackToken, this); - final int[] installedUsers; - synchronized (mLock) { - PackageSetting ps = mSettings.getPackageLPr(pkgLite.packageName); - if (ps != null) { - installedUsers = ps.queryInstalledUsers(mUserManager.getUserIds(), - true); - } else { - installedUsers = new int[0]; - } - } - Intent enableRollbackIntent = new Intent(Intent.ACTION_PACKAGE_ENABLE_ROLLBACK); enableRollbackIntent.putExtra( PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_TOKEN, @@ -14599,9 +14601,6 @@ public class PackageManagerService extends IPackageManager.Stub PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_INSTALL_FLAGS, installFlags); enableRollbackIntent.putExtra( - PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_INSTALLED_USERS, - installedUsers); - enableRollbackIntent.putExtra( PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_USER, getRollbackUser().getIdentifier()); enableRollbackIntent.setDataAndType(Uri.fromFile(new File(origin.resolvedPath)), @@ -20459,6 +20458,8 @@ public class PackageManagerService extends IPackageManager.Stub .getUriFor(Secure.INSTANT_APPS_ENABLED), false, co, UserHandle.USER_ALL); co.onChange(true); + mAppsFilter.onSystemReady(); + // Disable any carrier apps. We do this very early in boot to prevent the apps from being // disabled after already being started. CarrierAppUtils.disableCarrierAppsUntilPrivileged(mContext.getOpPackageName(), this, diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 6d3424cf3942..dd1eb8355de1 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -35,7 +35,6 @@ import android.content.pm.PackageParser.PackageParserException; import android.content.pm.PackageParser.SigningDetails; import android.content.pm.PackageParser.SigningDetails.SignatureSchemeVersion; import android.content.pm.ParceledListSlice; -import android.content.pm.Signature; import android.content.rollback.IRollbackManager; import android.os.Bundle; import android.os.Handler; @@ -106,8 +105,19 @@ public class StagingManager { return new ParceledListSlice<>(result); } - private void validateApexSignature(String apexPath, String packageName) + /** + * Validates the signature used to sign the container of the new apex package + * + * @param newApexPkg The new apex package that is being installed + * @param installFlags flags related to the session + * @throws PackageManagerException + */ + private void validateApexSignature(PackageInfo newApexPkg, int installFlags) throws PackageManagerException { + // Get signing details of the new package + final String apexPath = newApexPkg.applicationInfo.sourceDir; + final String packageName = newApexPkg.packageName; + final SigningDetails signingDetails; try { signingDetails = ApkSignatureVerifier.verify(apexPath, SignatureSchemeVersion.JAR); @@ -116,9 +126,10 @@ public class StagingManager { "Failed to parse APEX package " + apexPath, e); } - final PackageInfo packageInfo = mApexManager.getPackageInfo(packageName, + // Get signing details of the existing package + final PackageInfo existingApexPkg = mApexManager.getPackageInfo(packageName, ApexManager.MATCH_ACTIVE_PACKAGE); - if (packageInfo == null) { + if (existingApexPkg == null) { // This should never happen, because submitSessionToApexService ensures that no new // apexes were installed. throw new IllegalStateException("Unknown apex package " + packageName); @@ -127,22 +138,22 @@ public class StagingManager { final SigningDetails existingSigningDetails; try { existingSigningDetails = ApkSignatureVerifier.verify( - packageInfo.applicationInfo.sourceDir, SignatureSchemeVersion.JAR); + existingApexPkg.applicationInfo.sourceDir, SignatureSchemeVersion.JAR); } catch (PackageParserException e) { throw new PackageManagerException(SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, - "Failed to parse APEX package " + packageInfo.applicationInfo.sourceDir, e); + "Failed to parse APEX package " + existingApexPkg.applicationInfo.sourceDir, e); } - // Now that we have both sets of signatures, demand that they're an exact match. - if (Signature.areExactMatch(existingSigningDetails.signatures, signingDetails.signatures)) { + // Verify signing details for upgrade + if (signingDetails.checkCapability(existingSigningDetails, + PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)) { return; } throw new PackageManagerException(SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, - "APK-container signature verification failed for package " - + packageName + ". Signature of file " - + apexPath + " does not match the signature of " - + " the package already installed."); + "APK-container signature of APEX package " + packageName + " with version " + + newApexPkg.versionCodeMajor + " and path " + apexPath + " is not" + + " compatible with the one currently installed on device"); } private List<PackageInfo> submitSessionToApexService( @@ -239,8 +250,7 @@ public class StagingManager { try { final List<PackageInfo> apexPackages = submitSessionToApexService(session); for (PackageInfo apexPackage : apexPackages) { - validateApexSignature(apexPackage.applicationInfo.sourceDir, - apexPackage.packageName); + validateApexSignature(apexPackage, session.params.installFlags); } } catch (PackageManagerException e) { session.setStagedSessionFailed(e.error, e.getMessage()); diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index ead9d7ac2e56..1fe551222a06 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -2252,14 +2252,10 @@ public class UserManagerService extends IUserManager.Stub { @GuardedBy({"mPackagesLock", "mRestrictionsLock"}) private void fallbackToSingleUserLP() { - int flags = UserInfo.FLAG_SYSTEM | UserInfo.FLAG_INITIALIZED; - // In split system user mode, the admin and primary flags are assigned to the first human - // user. - if (!UserManager.isSplitSystemUser()) { - flags |= UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY; - } + int flags = UserInfo.FLAG_SYSTEM | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_ADMIN; + // In headless system user mode, the primary flag is assigned to the first human user. if (!UserManager.isHeadlessSystemUserMode()) { - flags |= UserInfo.FLAG_FULL; + flags |= UserInfo.FLAG_PRIMARY | UserInfo.FLAG_FULL; } // Create the system user UserInfo system = new UserInfo(UserHandle.USER_SYSTEM, null, null, flags); @@ -2773,9 +2769,9 @@ public class UserManagerService extends IUserManager.Stub { return null; } } - // In split system user mode, we assign the first human user the primary flag. + // In headless system user mode, we assign the first human user the primary flag. // And if there is no device owner, we also assign the admin flag to primary user. - if (UserManager.isSplitSystemUser() + if (UserManager.isHeadlessSystemUserMode() && !isGuest && !isManagedProfile && getPrimaryUser() == null) { flags |= UserInfo.FLAG_PRIMARY; synchronized (mUsersLock) { diff --git a/services/core/java/com/android/server/pm/permission/TEST_MAPPING b/services/core/java/com/android/server/pm/permission/TEST_MAPPING index af94e441f3c0..c0d71ac26853 100644 --- a/services/core/java/com/android/server/pm/permission/TEST_MAPPING +++ b/services/core/java/com/android/server/pm/permission/TEST_MAPPING @@ -62,5 +62,10 @@ } ] } + ], + "imports": [ + { + "path": "vendor/xts/gts-tests/tests/permission" + } ] } diff --git a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java index f5f7d67ba0b1..cae09ea37f2a 100644 --- a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java +++ b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java @@ -52,12 +52,13 @@ public class AppDataRollbackHelper { } /** - * Creates an app data snapshot for a specified {@code packageRollbackInfo}. Updates said {@code - * packageRollbackInfo} with the inodes of the CE user data snapshot folders. + * Creates an app data snapshot for a specified {@code packageRollbackInfo} and the specified + * {@code userIds}. Updates said {@code packageRollbackInfo} with the inodes of the CE user data + * snapshot folders. */ - public void snapshotAppData(int snapshotId, PackageRollbackInfo packageRollbackInfo) { - final int[] installedUsers = packageRollbackInfo.getInstalledUsers().toArray(); - for (int user : installedUsers) { + public void snapshotAppData( + int snapshotId, PackageRollbackInfo packageRollbackInfo, int[] userIds) { + for (int user : userIds) { final int storageFlags; if (isUserCredentialLocked(user)) { // We've encountered a user that hasn't unlocked on a FBE device, so we can't copy @@ -80,6 +81,7 @@ public class AppDataRollbackHelper { + packageRollbackInfo.getPackageName() + ", userId: " + user, ie); } } + packageRollbackInfo.getSnapshottedUsers().addAll(IntArray.wrap(userIds)); } /** @@ -96,14 +98,14 @@ public class AppDataRollbackHelper { final IntArray pendingBackups = packageRollbackInfo.getPendingBackups(); final List<RestoreInfo> pendingRestores = packageRollbackInfo.getPendingRestores(); - boolean changedRollbackData = false; + boolean changedRollback = false; // If we still have a userdata backup pending for this user, it implies that the user // hasn't unlocked their device between the point of backup and the point of restore, // so the data cannot have changed. We simply skip restoring CE data in this case. if (pendingBackups != null && pendingBackups.indexOf(userId) != -1) { pendingBackups.remove(pendingBackups.indexOf(userId)); - changedRollbackData = true; + changedRollback = true; } else { // There's no pending CE backup for this user, which means that we successfully // managed to backup data for the user, which means we seek to restore it @@ -111,7 +113,7 @@ public class AppDataRollbackHelper { // We've encountered a user that hasn't unlocked on a FBE device, so we can't // copy across app user data until the user unlocks their device. pendingRestores.add(new RestoreInfo(userId, appId, seInfo)); - changedRollbackData = true; + changedRollback = true; } else { // This user has unlocked, we can proceed to restore both CE and DE data. storageFlags = storageFlags | Installer.FLAG_STORAGE_CE; @@ -126,7 +128,7 @@ public class AppDataRollbackHelper { + packageRollbackInfo.getPackageName(), ie); } - return changedRollbackData; + return changedRollback; } /** @@ -158,29 +160,29 @@ public class AppDataRollbackHelper { * Packages pending backup for the given user are added to {@code pendingBackupPackages} along * with their corresponding {@code PackageRollbackInfo}. * - * @return the list of {@code RollbackData} that has pending backups. Note that some of the + * @return the list of rollbacks that have pending backups. Note that some of the * backups won't be performed, because they might be counteracted by pending restores. */ - private static List<RollbackData> computePendingBackups(int userId, + private static List<Rollback> computePendingBackups(int userId, Map<String, PackageRollbackInfo> pendingBackupPackages, - List<RollbackData> rollbacks) { - List<RollbackData> rd = new ArrayList<>(); + List<Rollback> rollbacks) { + List<Rollback> rollbacksWithPendingBackups = new ArrayList<>(); - for (RollbackData data : rollbacks) { - for (PackageRollbackInfo info : data.info.getPackages()) { + for (Rollback rollback : rollbacks) { + for (PackageRollbackInfo info : rollback.info.getPackages()) { final IntArray pendingBackupUsers = info.getPendingBackups(); if (pendingBackupUsers != null) { final int idx = pendingBackupUsers.indexOf(userId); if (idx != -1) { pendingBackupPackages.put(info.getPackageName(), info); - if (rd.indexOf(data) == -1) { - rd.add(data); + if (rollbacksWithPendingBackups.indexOf(rollback) == -1) { + rollbacksWithPendingBackups.add(rollback); } } } } } - return rd; + return rollbacksWithPendingBackups; } /** @@ -188,45 +190,45 @@ public class AppDataRollbackHelper { * Packages pending restore are added to {@code pendingRestores} along with their corresponding * {@code PackageRollbackInfo}. * - * @return the list of {@code RollbackData} that has pending restores. Note that some of the + * @return the list of rollbacks that have pending restores. Note that some of the * restores won't be performed, because they might be counteracted by pending backups. */ - private static List<RollbackData> computePendingRestores(int userId, + private static List<Rollback> computePendingRestores(int userId, Map<String, PackageRollbackInfo> pendingRestorePackages, - List<RollbackData> rollbacks) { - List<RollbackData> rd = new ArrayList<>(); + List<Rollback> rollbacks) { + List<Rollback> rollbacksWithPendingRestores = new ArrayList<>(); - for (RollbackData data : rollbacks) { - for (PackageRollbackInfo info : data.info.getPackages()) { + for (Rollback rollback : rollbacks) { + for (PackageRollbackInfo info : rollback.info.getPackages()) { final RestoreInfo ri = info.getRestoreInfo(userId); if (ri != null) { pendingRestorePackages.put(info.getPackageName(), info); - if (rd.indexOf(data) == -1) { - rd.add(data); + if (rollbacksWithPendingRestores.indexOf(rollback) == -1) { + rollbacksWithPendingRestores.add(rollback); } } } } - return rd; + return rollbacksWithPendingRestores; } /** - * Commits the list of pending backups and restores for a given {@code userId}. For the pending - * backups updates corresponding {@code changedRollbackData} with a mapping from {@code userId} - * to a inode of theirs CE user data snapshot. + * Commits the list of pending backups and restores for a given {@code userId}. For rollbacks + * with pending backups, updates the {@code Rollback} instance with a mapping from + * {@code userId} to inode of the CE user data snapshot. * - * @return the set of {@code RollbackData} that have been changed and should be stored on disk. + * @return the set of rollbacks with changes that should be stored on disk. */ - public Set<RollbackData> commitPendingBackupAndRestoreForUser(int userId, - List<RollbackData> rollbacks) { + public Set<Rollback> commitPendingBackupAndRestoreForUser(int userId, + List<Rollback> rollbacks) { final Map<String, PackageRollbackInfo> pendingBackupPackages = new HashMap<>(); - final List<RollbackData> pendingBackups = computePendingBackups(userId, + final List<Rollback> pendingBackups = computePendingBackups(userId, pendingBackupPackages, rollbacks); final Map<String, PackageRollbackInfo> pendingRestorePackages = new HashMap<>(); - final List<RollbackData> pendingRestores = computePendingRestores(userId, + final List<Rollback> pendingRestores = computePendingRestores(userId, pendingRestorePackages, rollbacks); // First remove unnecessary backups, i.e. when user did not unlock their phone between the @@ -246,14 +248,15 @@ public class AppDataRollbackHelper { } if (!pendingBackupPackages.isEmpty()) { - for (RollbackData data : pendingBackups) { - for (PackageRollbackInfo info : data.info.getPackages()) { + for (Rollback rollback : pendingBackups) { + for (PackageRollbackInfo info : rollback.info.getPackages()) { final IntArray pendingBackupUsers = info.getPendingBackups(); final int idx = pendingBackupUsers.indexOf(userId); if (idx != -1) { try { long ceSnapshotInode = mInstaller.snapshotAppData(info.getPackageName(), - userId, data.info.getRollbackId(), Installer.FLAG_STORAGE_CE); + userId, rollback.info.getRollbackId(), + Installer.FLAG_STORAGE_CE); info.putCeSnapshotInode(userId, ceSnapshotInode); pendingBackupUsers.remove(idx); } catch (InstallerException ie) { @@ -267,13 +270,13 @@ public class AppDataRollbackHelper { } if (!pendingRestorePackages.isEmpty()) { - for (RollbackData data : pendingRestores) { - for (PackageRollbackInfo info : data.info.getPackages()) { + for (Rollback rollback : pendingRestores) { + for (PackageRollbackInfo info : rollback.info.getPackages()) { final RestoreInfo ri = info.getRestoreInfo(userId); if (ri != null) { try { mInstaller.restoreAppDataSnapshot(info.getPackageName(), ri.appId, - ri.seInfo, userId, data.info.getRollbackId(), + ri.seInfo, userId, rollback.info.getRollbackId(), Installer.FLAG_STORAGE_CE); info.removeRestoreInfo(ri); } catch (InstallerException ie) { @@ -285,7 +288,7 @@ public class AppDataRollbackHelper { } } - final Set<RollbackData> changed = new HashSet<>(pendingBackups); + final Set<Rollback> changed = new HashSet<>(pendingBackups); changed.addAll(pendingRestores); return changed; } diff --git a/services/core/java/com/android/server/rollback/RollbackData.java b/services/core/java/com/android/server/rollback/Rollback.java index b37e2680605b..0d5746bf547f 100644 --- a/services/core/java/com/android/server/rollback/RollbackData.java +++ b/services/core/java/com/android/server/rollback/Rollback.java @@ -32,7 +32,7 @@ import java.util.ArrayList; * Information about a rollback available for a set of atomically installed * packages. */ -class RollbackData { +class Rollback { @IntDef(flag = true, prefix = { "ROLLBACK_STATE_" }, value = { ROLLBACK_STATE_ENABLING, ROLLBACK_STATE_AVAILABLE, @@ -102,13 +102,13 @@ class RollbackData { public boolean restoreUserDataInProgress = false; /** - * Constructs a new, empty RollbackData instance. + * Constructs a new, empty Rollback instance. * * @param rollbackId the id of the rollback. * @param backupDir the directory where the rollback data is stored. * @param stagedSessionId the session id if this is a staged rollback, -1 otherwise. */ - RollbackData(int rollbackId, File backupDir, int stagedSessionId) { + Rollback(int rollbackId, File backupDir, int stagedSessionId) { this.info = new RollbackInfo(rollbackId, /* packages */ new ArrayList<>(), /* isStaged */ stagedSessionId != -1, @@ -121,9 +121,9 @@ class RollbackData { } /** - * Constructs a RollbackData instance with full rollback data information. + * Constructs a pre-populated Rollback instance. */ - RollbackData(RollbackInfo info, File backupDir, Instant timestamp, int stagedSessionId, + Rollback(RollbackInfo info, File backupDir, Instant timestamp, int stagedSessionId, @RollbackState int state, int apkSessionId, boolean restoreUserDataInProgress) { this.info = info; this.backupDir = backupDir; @@ -143,9 +143,9 @@ class RollbackData { static String rollbackStateToString(@RollbackState int state) { switch (state) { - case RollbackData.ROLLBACK_STATE_ENABLING: return "enabling"; - case RollbackData.ROLLBACK_STATE_AVAILABLE: return "available"; - case RollbackData.ROLLBACK_STATE_COMMITTED: return "committed"; + case Rollback.ROLLBACK_STATE_ENABLING: return "enabling"; + case Rollback.ROLLBACK_STATE_AVAILABLE: return "available"; + case Rollback.ROLLBACK_STATE_COMMITTED: return "committed"; } throw new AssertionError("Invalid rollback state: " + state); } @@ -153,9 +153,9 @@ class RollbackData { static @RollbackState int rollbackStateFromString(String state) throws ParseException { switch (state) { - case "enabling": return RollbackData.ROLLBACK_STATE_ENABLING; - case "available": return RollbackData.ROLLBACK_STATE_AVAILABLE; - case "committed": return RollbackData.ROLLBACK_STATE_COMMITTED; + case "enabling": return Rollback.ROLLBACK_STATE_ENABLING; + case "available": return Rollback.ROLLBACK_STATE_AVAILABLE; + case "committed": return Rollback.ROLLBACK_STATE_COMMITTED; } throw new ParseException("Invalid rollback state: " + state, 0); } diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index f0cf9cf56d0b..02f98b4e7376 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -110,13 +110,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { @GuardedBy("mLock") private final SparseBooleanArray mAllocatedRollbackIds = new SparseBooleanArray(); - // Package rollback data for rollbacks we are in the process of enabling. + // Rollbacks we are in the process of enabling. @GuardedBy("mLock") private final Set<NewRollback> mNewRollbacks = new ArraySet<>(); // The list of all rollbacks, including available and committed rollbacks. @GuardedBy("mLock") - private final List<RollbackData> mRollbacks; + private final List<Rollback> mRollbacks; private final RollbackStore mRollbackStore; @@ -127,7 +127,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { private final AppDataRollbackHelper mAppDataRollbackHelper; // This field stores the difference in Millis between the uptime (millis since device - // has booted) and current time (device wall clock) - it's used to update rollback data + // has booted) and current time (device wall clock) - it's used to update rollback // timestamps when the time is changed, by the user or by change of timezone. // No need for guarding with lock because value is only accessed in handler thread. private long mRelativeBootTime = calculateRelativeBootTime(); @@ -146,9 +146,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { // Load rollback data from device storage. synchronized (mLock) { - mRollbacks = mRollbackStore.loadAllRollbackData(); - for (RollbackData data : mRollbacks) { - mAllocatedRollbackIds.put(data.info.getRollbackId(), true); + mRollbacks = mRollbackStore.loadRollbacks(); + for (Rollback rollback : mRollbacks) { + mAllocatedRollbackIds.put(rollback.info.getRollbackId(), true); } } @@ -177,16 +177,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_TOKEN, -1); int installFlags = intent.getIntExtra( PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_INSTALL_FLAGS, 0); - int[] installedUsers = intent.getIntArrayExtra( - PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_INSTALLED_USERS); int user = intent.getIntExtra( PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_USER, 0); File newPackageCodePath = new File(intent.getData().getPath()); getHandler().post(() -> { - boolean success = enableRollback(installFlags, newPackageCodePath, - installedUsers, user, token); + boolean success = + enableRollback(installFlags, newPackageCodePath, user, token); int ret = PackageManagerInternal.ENABLE_ROLLBACK_SUCCEEDED; if (!success) { ret = PackageManagerInternal.ENABLE_ROLLBACK_FAILED; @@ -303,9 +301,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { synchronized (mLock) { List<RollbackInfo> rollbacks = new ArrayList<>(); for (int i = 0; i < mRollbacks.size(); ++i) { - RollbackData data = mRollbacks.get(i); - if (data.state == RollbackData.ROLLBACK_STATE_AVAILABLE) { - rollbacks.add(data.info); + Rollback rollback = mRollbacks.get(i); + if (rollback.state == Rollback.ROLLBACK_STATE_AVAILABLE) { + rollbacks.add(rollback.info); } } return new ParceledListSlice<>(rollbacks); @@ -319,9 +317,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { synchronized (mLock) { List<RollbackInfo> rollbacks = new ArrayList<>(); for (int i = 0; i < mRollbacks.size(); ++i) { - RollbackData data = mRollbacks.get(i); - if (data.state == RollbackData.ROLLBACK_STATE_COMMITTED) { - rollbacks.add(data.info); + Rollback rollback = mRollbacks.get(i); + if (rollback.state == Rollback.ROLLBACK_STATE_COMMITTED) { + rollbacks.add(rollback.info); } } return new ParceledListSlice<>(rollbacks); @@ -351,11 +349,11 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { final long timeDifference = mRelativeBootTime - oldRelativeBootTime; synchronized (mLock) { - Iterator<RollbackData> iter = mRollbacks.iterator(); + Iterator<Rollback> iter = mRollbacks.iterator(); while (iter.hasNext()) { - RollbackData data = iter.next(); - data.timestamp = data.timestamp.plusMillis(timeDifference); - saveRollbackData(data); + Rollback rollback = iter.next(); + rollback.timestamp = rollback.timestamp.plusMillis(timeDifference); + saveRollback(rollback); } } } @@ -379,8 +377,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { String callerPackageName, IntentSender statusReceiver) { Slog.i(TAG, "Initiating rollback"); - RollbackData data = getRollbackForId(rollbackId); - if (data == null || data.state != RollbackData.ROLLBACK_STATE_AVAILABLE) { + Rollback rollback = getRollbackForId(rollbackId); + if (rollback == null || rollback.state != Rollback.ROLLBACK_STATE_AVAILABLE) { sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_ROLLBACK_UNAVAILABLE, "Rollback unavailable"); return; @@ -404,14 +402,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { PackageInstaller.SessionParams.MODE_FULL_INSTALL); parentParams.setRequestDowngrade(true); parentParams.setMultiPackage(); - if (data.isStaged()) { + if (rollback.isStaged()) { parentParams.setStaged(); } int parentSessionId = packageInstaller.createSession(parentParams); PackageInstaller.Session parentSession = packageInstaller.openSession(parentSessionId); - for (PackageRollbackInfo info : data.info.getPackages()) { + for (PackageRollbackInfo info : rollback.info.getPackages()) { PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); // TODO: We can't get the installerPackageName for apex @@ -426,7 +424,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { params.setRequestDowngrade(true); params.setRequiredInstalledVersionCode( info.getVersionRolledBackFrom().getLongVersionCode()); - if (data.isStaged()) { + if (rollback.isStaged()) { params.setStaged(); } if (info.isApex()) { @@ -435,7 +433,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { int sessionId = packageInstaller.createSession(params); PackageInstaller.Session session = packageInstaller.openSession(sessionId); File[] packageCodePaths = RollbackStore.getPackageCodePaths( - data, info.getPackageName()); + rollback, info.getPackageName()); if (packageCodePaths == null) { sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE, "Backup copy of package inaccessible"); @@ -476,8 +474,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { // TODO: Could this cause a rollback to be // resurrected if it should otherwise have // expired by now? - data.state = RollbackData.ROLLBACK_STATE_AVAILABLE; - data.restoreUserDataInProgress = false; + rollback.state = Rollback.ROLLBACK_STATE_AVAILABLE; + rollback.restoreUserDataInProgress = false; } sendFailure(statusReceiver, RollbackManager.STATUS_FAILURE_INSTALL, "Rollback downgrade install failed: " @@ -487,17 +485,17 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } synchronized (mLock) { - if (!data.isStaged()) { + if (!rollback.isStaged()) { // All calls to restoreUserData should have // completed by now for a non-staged install. - data.restoreUserDataInProgress = false; + rollback.restoreUserDataInProgress = false; } - data.info.setCommittedSessionId(parentSessionId); - data.info.getCausePackages().addAll(causePackages); + rollback.info.setCommittedSessionId(parentSessionId); + rollback.info.getCausePackages().addAll(causePackages); } - mRollbackStore.deletePackageCodePaths(data); - saveRollbackData(data); + mRollbackStore.deletePackageCodePaths(rollback); + saveRollback(rollback); sendSuccess(statusReceiver); @@ -512,8 +510,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { ); synchronized (mLock) { - data.state = RollbackData.ROLLBACK_STATE_COMMITTED; - data.restoreUserDataInProgress = true; + rollback.state = Rollback.ROLLBACK_STATE_COMMITTED; + rollback.restoreUserDataInProgress = true; } parentSession.commit(receiver.getIntentSender()); } catch (IOException e) { @@ -535,7 +533,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { updateRollbackLifetimeDurationInMillis(); synchronized (mLock) { mRollbacks.clear(); - mRollbacks.addAll(mRollbackStore.loadAllRollbackData()); + mRollbacks.addAll(mRollbackStore.loadRollbacks()); } latch.countDown(); }); @@ -553,13 +551,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { Manifest.permission.TEST_MANAGE_ROLLBACKS, "expireRollbackForPackage"); synchronized (mLock) { - Iterator<RollbackData> iter = mRollbacks.iterator(); + Iterator<Rollback> iter = mRollbacks.iterator(); while (iter.hasNext()) { - RollbackData data = iter.next(); - for (PackageRollbackInfo info : data.info.getPackages()) { + Rollback rollback = iter.next(); + for (PackageRollbackInfo info : rollback.info.getPackages()) { if (info.getPackageName().equals(packageName)) { iter.remove(); - deleteRollback(data); + deleteRollback(rollback); break; } } @@ -583,16 +581,16 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { void onUnlockUser(int userId) { getHandler().post(() -> { - final List<RollbackData> rollbacks; + final List<Rollback> rollbacks; synchronized (mLock) { rollbacks = new ArrayList<>(mRollbacks); } - final Set<RollbackData> changed = + final Set<Rollback> changed = mAppDataRollbackHelper.commitPendingBackupAndRestoreForUser(userId, rollbacks); - for (RollbackData rd : changed) { - saveRollbackData(rd); + for (Rollback rollback : changed) { + saveRollback(rollback); } }); } @@ -615,19 +613,19 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { getHandler().post(() -> { // Check to see if any rollback-enabled staged sessions or staged // rollback sessions been applied. - List<RollbackData> enabling = new ArrayList<>(); - List<RollbackData> restoreInProgress = new ArrayList<>(); + List<Rollback> enabling = new ArrayList<>(); + List<Rollback> restoreInProgress = new ArrayList<>(); Set<String> apexPackageNames = new HashSet<>(); synchronized (mLock) { - for (RollbackData data : mRollbacks) { - if (data.isStaged()) { - if (data.state == RollbackData.ROLLBACK_STATE_ENABLING) { - enabling.add(data); - } else if (data.restoreUserDataInProgress) { - restoreInProgress.add(data); + for (Rollback rollback : mRollbacks) { + if (rollback.isStaged()) { + if (rollback.state == Rollback.ROLLBACK_STATE_ENABLING) { + enabling.add(rollback); + } else if (rollback.restoreUserDataInProgress) { + restoreInProgress.add(rollback); } - for (PackageRollbackInfo info : data.info.getPackages()) { + for (PackageRollbackInfo info : rollback.info.getPackages()) { if (info.isApex()) { apexPackageNames.add(info.getPackageName()); } @@ -636,32 +634,32 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } } - for (RollbackData data : enabling) { + for (Rollback rollback : enabling) { PackageInstaller installer = mContext.getPackageManager().getPackageInstaller(); PackageInstaller.SessionInfo session = installer.getSessionInfo( - data.stagedSessionId); + rollback.stagedSessionId); if (session == null || session.isStagedSessionFailed()) { // TODO: Do we need to remove this from // mRollbacks, or is it okay to leave as // unavailable until the next reboot when it will go // away on its own? - deleteRollback(data); + deleteRollback(rollback); } else if (session.isStagedSessionApplied()) { - makeRollbackAvailable(data); + makeRollbackAvailable(rollback); } } - for (RollbackData data : restoreInProgress) { + for (Rollback rollback : restoreInProgress) { PackageInstaller installer = mContext.getPackageManager().getPackageInstaller(); PackageInstaller.SessionInfo session = installer.getSessionInfo( - data.stagedSessionId); + rollback.stagedSessionId); // TODO: What if session is null? if (session != null) { if (session.isStagedSessionApplied() || session.isStagedSessionFailed()) { synchronized (mLock) { - data.restoreUserDataInProgress = false; + rollback.restoreUserDataInProgress = false; } - saveRollbackData(data); + saveRollback(rollback); } } } @@ -688,19 +686,19 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { VersionedPackage installedVersion = getInstalledPackageVersion(packageName); synchronized (mLock) { - Iterator<RollbackData> iter = mRollbacks.iterator(); + Iterator<Rollback> iter = mRollbacks.iterator(); while (iter.hasNext()) { - RollbackData data = iter.next(); + Rollback rollback = iter.next(); // TODO: Should we remove rollbacks in the ENABLING state here? - if (data.state == RollbackData.ROLLBACK_STATE_AVAILABLE - || data.state == RollbackData.ROLLBACK_STATE_ENABLING) { - for (PackageRollbackInfo info : data.info.getPackages()) { + if (rollback.state == Rollback.ROLLBACK_STATE_AVAILABLE + || rollback.state == Rollback.ROLLBACK_STATE_ENABLING) { + for (PackageRollbackInfo info : rollback.info.getPackages()) { if (info.getPackageName().equals(packageName) && !packageVersionsEqual( info.getVersionRolledBackFrom(), installedVersion)) { iter.remove(); - deleteRollback(data); + deleteRollback(rollback); break; } } @@ -756,17 +754,18 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { Instant now = Instant.now(); Instant oldest = null; synchronized (mLock) { - Iterator<RollbackData> iter = mRollbacks.iterator(); + Iterator<Rollback> iter = mRollbacks.iterator(); while (iter.hasNext()) { - RollbackData data = iter.next(); - if (data.state != RollbackData.ROLLBACK_STATE_AVAILABLE) { + Rollback rollback = iter.next(); + if (rollback.state != Rollback.ROLLBACK_STATE_AVAILABLE) { continue; } - if (!now.isBefore(data.timestamp.plusMillis(mRollbackLifetimeDurationInMillis))) { + if (!now.isBefore( + rollback.timestamp.plusMillis(mRollbackLifetimeDurationInMillis))) { iter.remove(); - deleteRollback(data); - } else if (oldest == null || oldest.isAfter(data.timestamp)) { - oldest = data.timestamp; + deleteRollback(rollback); + } else if (oldest == null || oldest.isAfter(rollback.timestamp)) { + oldest = rollback.timestamp; } } } @@ -821,13 +820,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { * * @param installFlags information about what is being installed. * @param newPackageCodePath path to the package about to be installed. - * @param installedUsers the set of users for which a given package is installed. * @param user the user that owns the install session to enable rollback on. * @param token the distinct rollback token sent by package manager. * @return true if enabling the rollback succeeds, false otherwise. */ - private boolean enableRollback(int installFlags, File newPackageCodePath, - int[] installedUsers, @UserIdInt int user, int token) { + private boolean enableRollback( + int installFlags, File newPackageCodePath, @UserIdInt int user, int token) { // Find the session id associated with this install. // TODO: It would be nice if package manager or package installer told @@ -872,38 +870,15 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { // Check to see if this is the apk session for a staged session with // rollback enabled. - // TODO: This check could be made more efficient. - RollbackData rd = null; synchronized (mLock) { for (int i = 0; i < mRollbacks.size(); ++i) { - RollbackData data = mRollbacks.get(i); - if (data.apkSessionId == parentSession.getSessionId()) { - rd = data; - break; - } - } - } - - if (rd != null) { - // This is the apk session for a staged session. We do not need to create a new rollback - // for this session. - PackageParser.PackageLite newPackage = null; - try { - newPackage = PackageParser.parsePackageLite( - new File(packageSession.resolvedBaseCodePath), 0); - } catch (PackageParser.PackageParserException e) { - Slog.e(TAG, "Unable to parse new package", e); - return false; - } - String packageName = newPackage.packageName; - for (PackageRollbackInfo info : rd.info.getPackages()) { - if (info.getPackageName().equals(packageName)) { - info.getInstalledUsers().addAll(IntArray.wrap(installedUsers)); + Rollback rollback = mRollbacks.get(i); + if (rollback.apkSessionId == parentSession.getSessionId()) { + // This is the apk session for a staged session with rollback enabled. We do not + // need to create a new rollback for this session. return true; } } - Slog.e(TAG, "Unable to find package in apk session"); - return false; } NewRollback newRollback; @@ -919,7 +894,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } newRollback.addToken(token); - return enableRollbackForPackageSession(newRollback.data, packageSession, installedUsers); + return enableRollbackForPackageSession(newRollback.rollback, packageSession); } /** @@ -929,8 +904,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { * * @return true on success, false on failure. */ - private boolean enableRollbackForPackageSession(RollbackData data, - PackageInstaller.SessionInfo session, @NonNull int[] installedUsers) { + private boolean enableRollbackForPackageSession(Rollback rollback, + PackageInstaller.SessionInfo session) { // TODO: Don't attempt to enable rollback for split installs. final int installFlags = session.installFlags; if ((installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) == 0) { @@ -988,15 +963,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { PackageRollbackInfo packageRollbackInfo = new PackageRollbackInfo( newVersion, installedVersion, new IntArray() /* pendingBackups */, new ArrayList<>() /* pendingRestores */, - isApex, IntArray.wrap(installedUsers), - new SparseLongArray() /* ceSnapshotInodes */); + isApex, new IntArray(), new SparseLongArray() /* ceSnapshotInodes */); try { ApplicationInfo appInfo = pkgInfo.applicationInfo; - RollbackStore.backupPackageCodePath(data, packageName, appInfo.sourceDir); + RollbackStore.backupPackageCodePath(rollback, packageName, appInfo.sourceDir); if (!ArrayUtils.isEmpty(appInfo.splitSourceDirs)) { for (String sourceDir : appInfo.splitSourceDirs) { - RollbackStore.backupPackageCodePath(data, packageName, sourceDir); + RollbackStore.backupPackageCodePath(rollback, packageName, sourceDir); } } } catch (IOException e) { @@ -1005,7 +979,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } synchronized (mLock) { - data.info.getPackages().add(packageRollbackInfo); + rollback.info.getPackages().add(packageRollbackInfo); } return true; } @@ -1019,7 +993,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } getHandler().post(() -> { - snapshotUserDataInternal(packageName); + snapshotUserDataInternal(packageName, userIds); restoreUserDataInternal(packageName, userIds, appId, ceDataInode, seInfo, token); final PackageManagerInternal pmi = LocalServices.getService( PackageManagerInternal.class); @@ -1027,19 +1001,20 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { }); } - private void snapshotUserDataInternal(String packageName) { + private void snapshotUserDataInternal(String packageName, int[] userIds) { synchronized (mLock) { // staged installs for (int i = 0; i < mRollbacks.size(); i++) { - RollbackData data = mRollbacks.get(i); - if (data.state != RollbackData.ROLLBACK_STATE_ENABLING) { + Rollback rollback = mRollbacks.get(i); + if (rollback.state != Rollback.ROLLBACK_STATE_ENABLING) { continue; } - for (PackageRollbackInfo info : data.info.getPackages()) { + for (PackageRollbackInfo info : rollback.info.getPackages()) { if (info.getPackageName().equals(packageName)) { - mAppDataRollbackHelper.snapshotAppData(data.info.getRollbackId(), info); - saveRollbackData(data); + mAppDataRollbackHelper.snapshotAppData( + rollback.info.getRollbackId(), info, userIds); + saveRollback(rollback); break; } } @@ -1047,11 +1022,11 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { // non-staged installs PackageRollbackInfo info; for (NewRollback rollback : mNewRollbacks) { - info = getPackageRollbackInfo(rollback.data, packageName); + info = getPackageRollbackInfo(rollback.rollback, packageName); if (info != null) { - mAppDataRollbackHelper.snapshotAppData(rollback.data.info.getRollbackId(), - info); - saveRollbackData(rollback.data); + mAppDataRollbackHelper.snapshotAppData( + rollback.rollback.info.getRollbackId(), info, userIds); + saveRollback(rollback.rollback); } } } @@ -1060,31 +1035,31 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { private void restoreUserDataInternal(String packageName, int[] userIds, int appId, long ceDataInode, String seInfo, int token) { PackageRollbackInfo info = null; - RollbackData rollbackData = null; + Rollback rollback = null; synchronized (mLock) { for (int i = 0; i < mRollbacks.size(); ++i) { - RollbackData data = mRollbacks.get(i); - if (data.restoreUserDataInProgress) { - info = getPackageRollbackInfo(data, packageName); + Rollback candidate = mRollbacks.get(i); + if (candidate.restoreUserDataInProgress) { + info = getPackageRollbackInfo(candidate, packageName); if (info != null) { - rollbackData = data; + rollback = candidate; break; } } } } - if (rollbackData == null) { + if (rollback == null) { return; } for (int userId : userIds) { - final boolean changedRollbackData = mAppDataRollbackHelper.restoreAppData( - rollbackData.info.getRollbackId(), info, userId, appId, seInfo); + final boolean changedRollback = mAppDataRollbackHelper.restoreAppData( + rollback.info.getRollbackId(), info, userId, appId, seInfo); // We've updated metadata about this rollback, so save it to flash. - if (changedRollbackData) { - saveRollbackData(rollbackData); + if (changedRollback) { + saveRollback(rollback); } } } @@ -1114,8 +1089,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } if (!session.isMultiPackage()) { - if (!enableRollbackForPackageSession(newRollback.data, session, - new int[0])) { + if (!enableRollbackForPackageSession(newRollback.rollback, session)) { Slog.e(TAG, "Unable to enable rollback for session: " + sessionId); result.offer(false); return; @@ -1129,8 +1103,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { result.offer(false); return; } - if (!enableRollbackForPackageSession(newRollback.data, childSession, - new int[0])) { + if (!enableRollbackForPackageSession(newRollback.rollback, childSession)) { Slog.e(TAG, "Unable to enable rollback for session: " + sessionId); result.offer(false); return; @@ -1155,20 +1128,20 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { throw new SecurityException("notifyStagedApkSession may only be called by the system."); } getHandler().post(() -> { - RollbackData rd = null; + Rollback rollback = null; synchronized (mLock) { for (int i = 0; i < mRollbacks.size(); ++i) { - RollbackData data = mRollbacks.get(i); - if (data.stagedSessionId == originalSessionId) { - data.apkSessionId = apkSessionId; - rd = data; + Rollback candidate = mRollbacks.get(i); + if (candidate.stagedSessionId == originalSessionId) { + candidate.apkSessionId = apkSessionId; + rollback = candidate; break; } } } - if (rd != null) { - saveRollbackData(rd); + if (rollback != null) { + saveRollback(rollback); } }); } @@ -1278,7 +1251,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } if (newRollback != null) { - RollbackData rollback = completeEnableRollback(newRollback, success); + Rollback rollback = completeEnableRollback(newRollback, success); if (rollback != null && !rollback.isStaged()) { makeRollbackAvailable(rollback); } @@ -1291,32 +1264,32 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { * This should be called after rollback has been enabled for all packages * in the rollback. It does not make the rollback available yet. * - * @return the rollback data for a successfully enable-completed rollback, + * @return the Rollback instance for a successfully enable-completed rollback, * or null on error. */ - private RollbackData completeEnableRollback(NewRollback newRollback, boolean success) { - RollbackData data = newRollback.data; + private Rollback completeEnableRollback(NewRollback newRollback, boolean success) { + Rollback rollback = newRollback.rollback; if (!success) { // The install session was aborted, clean up the pending install. - deleteRollback(data); + deleteRollback(rollback); return null; } if (newRollback.isCancelled) { Slog.e(TAG, "Rollback has been cancelled by PackageManager"); - deleteRollback(data); + deleteRollback(rollback); return null; } - // It's safe to access data.info outside a synchronized block because + // It's safe to access rollback.info outside a synchronized block because // this is running on the handler thread and all changes to the - // data.info occur on the handler thread. - if (data.info.getPackages().size() != newRollback.packageSessionIds.length) { + // rollback.info occur on the handler thread. + if (rollback.info.getPackages().size() != newRollback.packageSessionIds.length) { Slog.e(TAG, "Failed to enable rollback for all packages in session."); - deleteRollback(data); + deleteRollback(rollback); return null; } - saveRollbackData(data); + saveRollback(rollback); synchronized (mLock) { // Note: There is a small window of time between when // the session has been committed by the package @@ -1324,25 +1297,25 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { // here. Presumably the window is small enough that // nobody will want to roll back the newly installed // package before we make the rollback available. - // TODO: We'll lose the rollback data if the + // TODO: We'll lose the rollback if the // device reboots between when the session is // committed and this point. Revisit this after // adding support for rollback of staged installs. - mRollbacks.add(data); + mRollbacks.add(rollback); } - return data; + return rollback; } - private void makeRollbackAvailable(RollbackData data) { + private void makeRollbackAvailable(Rollback rollback) { // TODO: What if the rollback has since been expired, for example due // to a new package being installed. Won't this revive an expired // rollback? Consider adding a ROLLBACK_STATE_EXPIRED to address this. synchronized (mLock) { - data.state = RollbackData.ROLLBACK_STATE_AVAILABLE; - data.timestamp = Instant.now(); + rollback.state = Rollback.ROLLBACK_STATE_AVAILABLE; + rollback.timestamp = Instant.now(); } - saveRollbackData(data); + saveRollback(rollback); // TODO(zezeozue): Provide API to explicitly start observing instead // of doing this for all rollbacks. If we do this for all rollbacks, @@ -1350,8 +1323,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { // After enabling and commiting any rollback, observe packages and // prepare to rollback if packages crashes too frequently. List<String> packages = new ArrayList<>(); - for (int i = 0; i < data.info.getPackages().size(); i++) { - packages.add(data.info.getPackages().get(i).getPackageName()); + for (int i = 0; i < rollback.info.getPackages().size(); i++) { + packages.add(rollback.info.getPackages().get(i).getPackageName()); } mPackageHealthObserver.startObservingHealth(packages, mRollbackLifetimeDurationInMillis); @@ -1359,15 +1332,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } /* - * Returns the RollbackData, if any, for a rollback with the given - * rollbackId. + * Returns the rollback with the given rollbackId, if any. */ - private RollbackData getRollbackForId(int rollbackId) { + private Rollback getRollbackForId(int rollbackId) { synchronized (mLock) { for (int i = 0; i < mRollbacks.size(); ++i) { - RollbackData data = mRollbacks.get(i); - if (data.info.getRollbackId() == rollbackId) { - return data; + Rollback rollback = mRollbacks.get(i); + if (rollback.info.getRollbackId() == rollbackId) { + return rollback; } } } @@ -1377,11 +1349,11 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { /** * Returns the {@code PackageRollbackInfo} associated with {@code packageName} from - * a specified {@code RollbackData}. + * a specified {@code Rollback}. */ - private static PackageRollbackInfo getPackageRollbackInfo(RollbackData data, + private static PackageRollbackInfo getPackageRollbackInfo(Rollback rollback, String packageName) { - for (PackageRollbackInfo info : data.info.getPackages()) { + for (PackageRollbackInfo info : rollback.info.getPackages()) { if (info.getPackageName().equals(packageName)) { return info; } @@ -1405,30 +1377,30 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { throw new IllegalStateException("Failed to allocate rollback ID"); } - private void deleteRollback(RollbackData rollbackData) { - for (PackageRollbackInfo info : rollbackData.info.getPackages()) { - IntArray installedUsers = info.getInstalledUsers(); - for (int i = 0; i < installedUsers.size(); i++) { - int userId = installedUsers.get(i); - mAppDataRollbackHelper.destroyAppDataSnapshot(rollbackData.info.getRollbackId(), + private void deleteRollback(Rollback rollback) { + for (PackageRollbackInfo info : rollback.info.getPackages()) { + IntArray snapshottedUsers = info.getSnapshottedUsers(); + for (int i = 0; i < snapshottedUsers.size(); i++) { + int userId = snapshottedUsers.get(i); + mAppDataRollbackHelper.destroyAppDataSnapshot(rollback.info.getRollbackId(), info, userId); } } - mRollbackStore.deleteRollbackData(rollbackData); + mRollbackStore.deleteRollback(rollback); } /** - * Saves rollback data, swallowing any IOExceptions. + * Saves a rollback, swallowing any IOExceptions. * For those times when it's not obvious what to do about the IOException. * TODO: Double check we can't do a better job handling the IOException in * a cases where this method is called. */ - private void saveRollbackData(RollbackData rollbackData) { + private void saveRollback(Rollback rollback) { try { - mRollbackStore.saveRollbackData(rollbackData); + mRollbackStore.saveRollback(rollback); } catch (IOException ioe) { - Slog.e(TAG, "Unable to save rollback info for: " - + rollbackData.info.getRollbackId(), ioe); + Slog.e(TAG, "Unable to save rollback for: " + + rollback.info.getRollbackId(), ioe); } } @@ -1436,14 +1408,14 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " "); synchronized (mLock) { - for (RollbackData data : mRollbacks) { - RollbackInfo info = data.info; + for (Rollback rollback : mRollbacks) { + RollbackInfo info = rollback.info; ipw.println(info.getRollbackId() + ":"); ipw.increaseIndent(); - ipw.println("-state: " + data.getStateAsString()); - ipw.println("-timestamp: " + data.timestamp); - if (data.stagedSessionId != -1) { - ipw.println("-stagedSessionId: " + data.stagedSessionId); + ipw.println("-state: " + rollback.getStateAsString()); + ipw.println("-timestamp: " + rollback.timestamp); + if (rollback.stagedSessionId != -1) { + ipw.println("-stagedSessionId: " + rollback.stagedSessionId); } ipw.println("-packages:"); ipw.increaseIndent(); @@ -1453,7 +1425,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { + " -> " + pkg.getVersionRolledBackTo().getLongVersionCode()); } ipw.decreaseIndent(); - if (data.state == RollbackData.ROLLBACK_STATE_COMMITTED) { + if (rollback.state == Rollback.ROLLBACK_STATE_COMMITTED) { ipw.println("-causePackages:"); ipw.increaseIndent(); for (VersionedPackage cPkg : info.getCausePackages()) { @@ -1479,7 +1451,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } private static class NewRollback { - public final RollbackData data; + public final Rollback rollback; /** * This array holds all of the rollback tokens associated with package sessions included @@ -1497,9 +1469,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { public final int[] packageSessionIds; /** - * Flag to determine whether the RollbackData has been cancelled. + * Flag to determine whether the rollback has been cancelled. * - * <p>RollbackData could be invalidated and cancelled if RollbackManager receives + * <p>Rollback could be invalidated and cancelled if RollbackManager receives * {@link Intent#ACTION_CANCEL_ENABLE_ROLLBACK} from {@link PackageManager}. * * <p>The main underlying assumption here is that if enabling the rollback times out, then @@ -1509,8 +1481,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { */ public boolean isCancelled = false; - NewRollback(RollbackData data, int[] packageSessionIds) { - this.data = data; + NewRollback(Rollback rollback, int[] packageSessionIds) { + this.rollback = rollback; this.packageSessionIds = packageSessionIds; } @@ -1525,13 +1497,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { NewRollback createNewRollbackLocked(PackageInstaller.SessionInfo parentSession) { int rollbackId = allocateRollbackIdLocked(); - final RollbackData data; + final Rollback rollback; int parentSessionId = parentSession.getSessionId(); if (parentSession.isStaged()) { - data = mRollbackStore.createStagedRollback(rollbackId, parentSessionId); + rollback = mRollbackStore.createStagedRollback(rollbackId, parentSessionId); } else { - data = mRollbackStore.createNonStagedRollback(rollbackId); + rollback = mRollbackStore.createNonStagedRollback(rollbackId); } int[] packageSessionIds; @@ -1541,7 +1513,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { packageSessionIds = new int[]{parentSessionId}; } - return new NewRollback(data, packageSessionIds); + return new NewRollback(rollback, packageSessionIds); } /** @@ -1552,10 +1524,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { NewRollback getNewRollbackForPackageSessionLocked(int packageSessionId) { // We expect mNewRollbacks to be a very small list; linear search // should be plenty fast. - for (NewRollback newRollbackData : mNewRollbacks) { - for (int id : newRollbackData.packageSessionIds) { + for (NewRollback newRollback: mNewRollbacks) { + for (int id : newRollback.packageSessionIds) { if (id == packageSessionId) { - return newRollbackData; + return newRollback; } } } diff --git a/services/core/java/com/android/server/rollback/RollbackStore.java b/services/core/java/com/android/server/rollback/RollbackStore.java index 1c36dc7791e6..b2448f62bcd7 100644 --- a/services/core/java/com/android/server/rollback/RollbackStore.java +++ b/services/core/java/com/android/server/rollback/RollbackStore.java @@ -16,8 +16,8 @@ package com.android.server.rollback; -import static com.android.server.rollback.RollbackData.rollbackStateFromString; -import static com.android.server.rollback.RollbackData.rollbackStateToString; +import static com.android.server.rollback.Rollback.rollbackStateFromString; +import static com.android.server.rollback.Rollback.rollbackStateToString; import android.annotation.NonNull; import android.content.pm.VersionedPackage; @@ -73,17 +73,17 @@ class RollbackStore { } /** - * Reads the rollback data from persistent storage. + * Reads the rollbacks from persistent storage. */ - List<RollbackData> loadAllRollbackData() { - List<RollbackData> rollbacks = new ArrayList<>(); + List<Rollback> loadRollbacks() { + List<Rollback> rollbacks = new ArrayList<>(); mRollbackDataDir.mkdirs(); for (File rollbackDir : mRollbackDataDir.listFiles()) { if (rollbackDir.isDirectory()) { try { - rollbacks.add(loadRollbackData(rollbackDir)); + rollbacks.add(loadRollback(rollbackDir)); } catch (IOException e) { - Slog.e(TAG, "Unable to read rollback data at " + rollbackDir, e); + Slog.e(TAG, "Unable to read rollback at " + rollbackDir, e); removeFile(rollbackDir); } } @@ -191,21 +191,21 @@ class RollbackStore { } /** - * Creates a new RollbackData instance for a non-staged rollback with + * Creates a new Rollback instance for a non-staged rollback with * backupDir assigned. */ - RollbackData createNonStagedRollback(int rollbackId) { + Rollback createNonStagedRollback(int rollbackId) { File backupDir = new File(mRollbackDataDir, Integer.toString(rollbackId)); - return new RollbackData(rollbackId, backupDir, -1); + return new Rollback(rollbackId, backupDir, -1); } /** - * Creates a new RollbackData instance for a staged rollback with + * Creates a new Rollback instance for a staged rollback with * backupDir assigned. */ - RollbackData createStagedRollback(int rollbackId, int stagedSessionId) { + Rollback createStagedRollback(int rollbackId, int stagedSessionId) { File backupDir = new File(mRollbackDataDir, Integer.toString(rollbackId)); - return new RollbackData(rollbackId, backupDir, stagedSessionId); + return new Rollback(rollbackId, backupDir, stagedSessionId); } /** @@ -213,10 +213,10 @@ class RollbackStore { * For packages containing splits, this method should be called for each * of the package's split apks in addition to the base apk. */ - static void backupPackageCodePath(RollbackData data, String packageName, String codePath) + static void backupPackageCodePath(Rollback rollback, String packageName, String codePath) throws IOException { File sourceFile = new File(codePath); - File targetDir = new File(data.backupDir, packageName); + File targetDir = new File(rollback.backupDir, packageName); targetDir.mkdirs(); File targetFile = new File(targetDir, sourceFile.getName()); @@ -228,8 +228,8 @@ class RollbackStore { * Returns the apk or apex files backed up for the given package. * Includes the base apk and any splits. Returns null if none found. */ - static File[] getPackageCodePaths(RollbackData data, String packageName) { - File targetDir = new File(data.backupDir, packageName); + static File[] getPackageCodePaths(Rollback rollback, String packageName) { + File targetDir = new File(rollback.backupDir, packageName); File[] files = targetDir.listFiles(); if (files == null || files.length == 0) { return null; @@ -241,27 +241,27 @@ class RollbackStore { * Deletes all backed up apks and apex files associated with the given * rollback. */ - static void deletePackageCodePaths(RollbackData data) { - for (PackageRollbackInfo info : data.info.getPackages()) { - File targetDir = new File(data.backupDir, info.getPackageName()); + static void deletePackageCodePaths(Rollback rollback) { + for (PackageRollbackInfo info : rollback.info.getPackages()) { + File targetDir = new File(rollback.backupDir, info.getPackageName()); removeFile(targetDir); } } /** - * Saves the rollback data to persistent storage. + * Saves the given rollback to persistent storage. */ - void saveRollbackData(RollbackData data) throws IOException { + void saveRollback(Rollback rollback) throws IOException { try { JSONObject dataJson = new JSONObject(); - dataJson.put("info", rollbackInfoToJson(data.info)); - dataJson.put("timestamp", data.timestamp.toString()); - dataJson.put("stagedSessionId", data.stagedSessionId); - dataJson.put("state", rollbackStateToString(data.state)); - dataJson.put("apkSessionId", data.apkSessionId); - dataJson.put("restoreUserDataInProgress", data.restoreUserDataInProgress); - - PrintWriter pw = new PrintWriter(new File(data.backupDir, "rollback.json")); + dataJson.put("info", rollbackInfoToJson(rollback.info)); + dataJson.put("timestamp", rollback.timestamp.toString()); + dataJson.put("stagedSessionId", rollback.stagedSessionId); + dataJson.put("state", rollbackStateToString(rollback.state)); + dataJson.put("apkSessionId", rollback.apkSessionId); + dataJson.put("restoreUserDataInProgress", rollback.restoreUserDataInProgress); + + PrintWriter pw = new PrintWriter(new File(rollback.backupDir, "rollback.json")); pw.println(dataJson.toString()); pw.close(); } catch (JSONException e) { @@ -270,23 +270,23 @@ class RollbackStore { } /** - * Removes all persistant storage associated with the given rollback data. + * Removes all persistent storage associated with the given rollback. */ - void deleteRollbackData(RollbackData data) { - removeFile(data.backupDir); + void deleteRollback(Rollback rollback) { + removeFile(rollback.backupDir); } /** * Reads the metadata for a rollback from the given directory. * @throws IOException in case of error reading the data. */ - private static RollbackData loadRollbackData(File backupDir) throws IOException { + private static Rollback loadRollback(File backupDir) throws IOException { try { File rollbackJsonFile = new File(backupDir, "rollback.json"); JSONObject dataJson = new JSONObject( IoUtils.readFileAsString(rollbackJsonFile.getAbsolutePath())); - return new RollbackData( + return new Rollback( rollbackInfoFromJson(dataJson.getJSONObject("info")), backupDir, Instant.parse(dataJson.getString("timestamp")), @@ -319,13 +319,14 @@ class RollbackStore { IntArray pendingBackups = info.getPendingBackups(); List<RestoreInfo> pendingRestores = info.getPendingRestores(); - IntArray installedUsers = info.getInstalledUsers(); + IntArray snapshottedUsers = info.getSnapshottedUsers(); json.put("pendingBackups", convertToJsonArray(pendingBackups)); json.put("pendingRestores", convertToJsonArray(pendingRestores)); json.put("isApex", info.isApex()); - json.put("installedUsers", convertToJsonArray(installedUsers)); + // Field is named 'installedUsers' for legacy reasons. + json.put("installedUsers", convertToJsonArray(snapshottedUsers)); json.put("ceSnapshotInodes", ceSnapshotInodesToJson(info.getCeSnapshotInodes())); return json; @@ -345,12 +346,13 @@ class RollbackStore { final boolean isApex = json.getBoolean("isApex"); - final IntArray installedUsers = convertToIntArray(json.getJSONArray("installedUsers")); + // Field is named 'installedUsers' for legacy reasons. + final IntArray snapshottedUsers = convertToIntArray(json.getJSONArray("installedUsers")); final SparseLongArray ceSnapshotInodes = ceSnapshotInodesFromJson( json.getJSONArray("ceSnapshotInodes")); return new PackageRollbackInfo(versionRolledBackFrom, versionRolledBackTo, - pendingBackups, pendingRestores, isApex, installedUsers, ceSnapshotInodes); + pendingBackups, pendingRestores, isApex, snapshottedUsers, ceSnapshotInodes); } private static JSONArray versionedPackagesToJson(List<VersionedPackage> packages) diff --git a/services/core/java/com/android/server/security/KeyChainSystemService.java b/services/core/java/com/android/server/security/KeyChainSystemService.java index 2f681a3f568e..3c06d0ec7950 100644 --- a/services/core/java/com/android/server/security/KeyChainSystemService.java +++ b/services/core/java/com/android/server/security/KeyChainSystemService.java @@ -27,7 +27,7 @@ import android.os.UserHandle; import android.security.IKeyChainService; import android.util.Slog; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; import com.android.server.LocalServices; import com.android.server.SystemService; @@ -99,8 +99,8 @@ public class KeyChainSystemService extends SystemService { } final String packageName = intent.getComponent().getPackageName(); - final DeviceIdleController.LocalService idleController = - LocalServices.getService(DeviceIdleController.LocalService.class); + final DeviceIdleInternal idleController = + LocalServices.getService(DeviceIdleInternal.class); idleController.addPowerSaveTempWhitelistApp(Process.myUid(), packageName, KEYCHAIN_IDLE_WHITELIST_DURATION_MS, user.getIdentifier(), false, "keychain"); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index e14514be2207..d87a0ed966dc 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -5125,9 +5125,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // relative layering of multiple APPLICATION_MEDIA/OVERLAY has never // been defined and so we can use static layers and leave it that way. if (w.mAttrs.type == TYPE_APPLICATION_MEDIA) { - w.assignLayer(t, -2); + if (mWinAnimator.hasSurface()) { + w.assignRelativeLayer(t, mWinAnimator.mSurfaceController.mSurfaceControl, -2); + } else { + w.assignLayer(t, -2); + } } else if (w.mAttrs.type == TYPE_APPLICATION_MEDIA_OVERLAY) { - w.assignLayer(t, -1); + if (mWinAnimator.hasSurface()) { + w.assignRelativeLayer(t, mWinAnimator.mSurfaceController.mSurfaceControl, -1); + } else { + w.assignLayer(t, -1); + } } else { w.assignLayer(t, layer); } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 4ba75a60e4ab..ed900b15e8d8 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -25,6 +25,7 @@ import static android.view.Display.DEFAULT_DISPLAY; import static com.android.server.utils.TimingsTraceAndSlog.SYSTEM_SERVER_TIMING_TAG; import android.annotation.NonNull; +import android.annotation.StringRes; import android.app.ActivityThread; import android.app.INotificationManager; import android.app.usage.UsageStatsManagerInternal; @@ -1267,14 +1268,22 @@ public final class SystemServer { startSystemCaptionsManagerService(context, t); // App prediction manager service - t.traceBegin("StartAppPredictionService"); - mSystemServiceManager.startService(APP_PREDICTION_MANAGER_SERVICE_CLASS); - t.traceEnd(); + if (deviceHasConfigString(context, R.string.config_defaultAppPredictionService)) { + t.traceBegin("StartAppPredictionService"); + mSystemServiceManager.startService(APP_PREDICTION_MANAGER_SERVICE_CLASS); + t.traceEnd(); + } else { + Slog.d(TAG, "AppPredictionService not defined by OEM"); + } // Content suggestions manager service - t.traceBegin("StartContentSuggestionsService"); - mSystemServiceManager.startService(CONTENT_SUGGESTIONS_SERVICE_CLASS); - t.traceEnd(); + if (deviceHasConfigString(context, R.string.config_defaultContentSuggestionsService)) { + t.traceBegin("StartContentSuggestionsService"); + mSystemServiceManager.startService(CONTENT_SUGGESTIONS_SERVICE_CLASS); + t.traceEnd(); + } else { + Slog.d(TAG, "ContentSuggestionsService not defined by OEM"); + } t.traceBegin("InitConnectivityModuleConnector"); try { @@ -2242,11 +2251,14 @@ public final class SystemServer { t.traceEnd(); // startOtherServices } + private boolean deviceHasConfigString(@NonNull Context context, @StringRes int resId) { + String serviceName = context.getString(resId); + return !TextUtils.isEmpty(serviceName); + } + private void startSystemCaptionsManagerService(@NonNull Context context, @NonNull TimingsTraceAndSlog t) { - String serviceName = context.getString( - com.android.internal.R.string.config_defaultSystemCaptionsManagerService); - if (TextUtils.isEmpty(serviceName)) { + if (!deviceHasConfigString(context, R.string.config_defaultSystemCaptionsManagerService)) { Slog.d(TAG, "SystemCaptionsManagerService disabled because resource is not overlaid"); return; } @@ -2274,9 +2286,7 @@ public final class SystemServer { // Then check if OEM overlaid the resource that defines the service. if (!explicitlyEnabled) { - final String serviceName = context - .getString(com.android.internal.R.string.config_defaultContentCaptureService); - if (TextUtils.isEmpty(serviceName)) { + if (!deviceHasConfigString(context, R.string.config_defaultContentCaptureService)) { Slog.d(TAG, "ContentCaptureService disabled because resource is not overlaid"); return; } diff --git a/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java b/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java index c92737b96897..0c79f40857a5 100644 --- a/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java +++ b/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java @@ -21,8 +21,6 @@ import static android.Manifest.permission.DUMP; import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static android.Manifest.permission.PACKAGE_USAGE_STATS; -import static com.android.server.backup.testing.TransportData.backupTransport; - import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; @@ -38,13 +36,7 @@ import static org.testng.Assert.expectThrows; import android.annotation.UserIdInt; import android.app.Application; -import android.app.backup.IBackupManagerMonitor; -import android.app.backup.IBackupObserver; -import android.app.backup.IFullBackupRestoreObserver; -import android.app.backup.ISelectBackupTransportCallback; import android.content.Context; -import android.content.Intent; -import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.UserHandle; @@ -52,7 +44,6 @@ import android.os.UserManager; import android.platform.test.annotations.Presubmit; import android.util.SparseArray; -import com.android.server.backup.testing.TransportData; import com.android.server.testing.shadows.ShadowApplicationPackageManager; import com.android.server.testing.shadows.ShadowBinder; import com.android.server.testing.shadows.ShadowEnvironment; @@ -222,1255 +213,6 @@ public class BackupManagerServiceTest { } // --------------------------------------------- - // Backup agent tests - // --------------------------------------------- - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testDataChanged_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.dataChanged(mUserOneId, TEST_PACKAGE); - - verify(mUserOneService).dataChanged(TEST_PACKAGE); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testDataChanged_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.dataChanged(mUserTwoId, TEST_PACKAGE); - - verify(mUserOneService, never()).dataChanged(TEST_PACKAGE); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testAgentConnected_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - IBinder agentBinder = mock(IBinder.class); - - backupManagerService.agentConnected(mUserOneId, TEST_PACKAGE, agentBinder); - - verify(mUserOneService).agentConnected(TEST_PACKAGE, agentBinder); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testAgentConnected_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - IBinder agentBinder = mock(IBinder.class); - - backupManagerService.agentConnected(mUserTwoId, TEST_PACKAGE, agentBinder); - - verify(mUserOneService, never()).agentConnected(TEST_PACKAGE, agentBinder); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testAgentDisconnected_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.agentDisconnected(mUserOneId, TEST_PACKAGE); - - verify(mUserOneService).agentDisconnected(TEST_PACKAGE); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testAgentDisconnected_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.agentDisconnected(mUserTwoId, TEST_PACKAGE); - - verify(mUserOneService, never()).agentDisconnected(TEST_PACKAGE); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testOpComplete_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.opComplete(mUserOneId, /* token */ 0, /* result */ 0L); - - verify(mUserOneService).opComplete(/* token */ 0, /* result */ 0L); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testOpComplete_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.opComplete(mUserTwoId, /* token */ 0, /* result */ 0L); - - verify(mUserOneService, never()).opComplete(/* token */ 0, /* result */ 0L); - } - - // --------------------------------------------- - // Transport tests - // --------------------------------------------- - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testInitializeTransports_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - String[] transports = {TEST_TRANSPORT}; - - backupManagerService.initializeTransports(mUserOneId, transports, /* observer */ null); - - verify(mUserOneService).initializeTransports(transports, /* observer */ null); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testInitializeTransports_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - String[] transports = {TEST_TRANSPORT}; - - backupManagerService.initializeTransports(mUserTwoId, transports, /* observer */ null); - - verify(mUserOneService, never()).initializeTransports(transports, /* observer */ null); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testClearBackupData_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.clearBackupData(mUserOneId, TEST_TRANSPORT, TEST_PACKAGE); - - verify(mUserOneService).clearBackupData(TEST_TRANSPORT, TEST_PACKAGE); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testClearBackupData_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.clearBackupData(mUserTwoId, TEST_TRANSPORT, TEST_PACKAGE); - - verify(mUserOneService, never()).clearBackupData(TEST_TRANSPORT, TEST_PACKAGE); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testGetCurrentTransport_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.getCurrentTransport(mUserOneId); - - verify(mUserOneService).getCurrentTransport(); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testGetCurrentTransport_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.getCurrentTransport(mUserTwoId); - - verify(mUserOneService, never()).getCurrentTransport(); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testGetCurrentTransportComponent_onRegisteredUser_callsMethodForUser() - throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.getCurrentTransportComponent(mUserOneId); - - verify(mUserOneService).getCurrentTransportComponent(); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testGetCurrentTransportComponent_onUnknownUser_doesNotPropagateCall() - throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.getCurrentTransportComponent(mUserTwoId); - - verify(mUserOneService, never()).getCurrentTransportComponent(); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testListAllTransports_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.listAllTransports(mUserOneId); - - verify(mUserOneService).listAllTransports(); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testListAllTransports_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.listAllTransports(mUserTwoId); - - verify(mUserOneService, never()).listAllTransports(); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testListAllTransportComponents_onRegisteredUser_callsMethodForUser() - throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.listAllTransportComponents(mUserOneId); - - verify(mUserOneService).listAllTransportComponents(); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testListAllTransportComponents_onUnknownUser_doesNotPropagateCall() - throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.listAllTransportComponents(mUserTwoId); - - verify(mUserOneService, never()).listAllTransportComponents(); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testUpdateTransportAttributes_onRegisteredUser_callsMethodForUser() - throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - TransportData transport = backupTransport(); - Intent configurationIntent = new Intent(); - Intent dataManagementIntent = new Intent(); - - backupManagerService.updateTransportAttributes( - mUserOneId, - transport.getTransportComponent(), - transport.transportName, - configurationIntent, - "currentDestinationString", - dataManagementIntent, - "dataManagementLabel"); - - verify(mUserOneService) - .updateTransportAttributes( - transport.getTransportComponent(), - transport.transportName, - configurationIntent, - "currentDestinationString", - dataManagementIntent, - "dataManagementLabel"); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testUpdateTransportAttributes_onUnknownUser_doesNotPropagateCall() - throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - TransportData transport = backupTransport(); - Intent configurationIntent = new Intent(); - Intent dataManagementIntent = new Intent(); - - backupManagerService.updateTransportAttributes( - mUserTwoId, - transport.getTransportComponent(), - transport.transportName, - configurationIntent, - "currentDestinationString", - dataManagementIntent, - "dataManagementLabel"); - - verify(mUserOneService, never()) - .updateTransportAttributes( - transport.getTransportComponent(), - transport.transportName, - configurationIntent, - "currentDestinationString", - dataManagementIntent, - "dataManagementLabel"); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testSelectBackupTransport_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.selectBackupTransport(mUserOneId, TEST_TRANSPORT); - - verify(mUserOneService).selectBackupTransport(TEST_TRANSPORT); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testSelectBackupTransport_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.selectBackupTransport(mUserTwoId, TEST_TRANSPORT); - - verify(mUserOneService, never()).selectBackupTransport(TEST_TRANSPORT); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testSelectTransportAsync_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - TransportData transport = backupTransport(); - ISelectBackupTransportCallback callback = mock(ISelectBackupTransportCallback.class); - - backupManagerService.selectBackupTransportAsync( - mUserOneId, transport.getTransportComponent(), callback); - - verify(mUserOneService) - .selectBackupTransportAsync(transport.getTransportComponent(), callback); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testSelectBackupTransportAsync_onUnknownUser_doesNotPropagateCall() - throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - TransportData transport = backupTransport(); - ISelectBackupTransportCallback callback = mock(ISelectBackupTransportCallback.class); - - backupManagerService.selectBackupTransportAsync( - mUserTwoId, transport.getTransportComponent(), callback); - - verify(mUserOneService, never()) - .selectBackupTransportAsync(transport.getTransportComponent(), callback); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testGetConfigurationIntent_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.getConfigurationIntent(mUserOneId, TEST_TRANSPORT); - - verify(mUserOneService).getConfigurationIntent(TEST_TRANSPORT); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testGetConfigurationIntent_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.getConfigurationIntent(mUserTwoId, TEST_TRANSPORT); - - verify(mUserOneService, never()).getConfigurationIntent(TEST_TRANSPORT); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testGetDestinationString_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.getDestinationString(mUserOneId, TEST_TRANSPORT); - - verify(mUserOneService).getDestinationString(TEST_TRANSPORT); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testGetDestinationString_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.getDestinationString(mUserTwoId, TEST_TRANSPORT); - - verify(mUserOneService, never()).getDestinationString(TEST_TRANSPORT); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testGetDataManagementIntent_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.getDataManagementIntent(mUserOneId, TEST_TRANSPORT); - - verify(mUserOneService).getDataManagementIntent(TEST_TRANSPORT); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testGetDataManagementIntent_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.getDataManagementIntent(mUserTwoId, TEST_TRANSPORT); - - verify(mUserOneService, never()).getDataManagementIntent(TEST_TRANSPORT); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testGetDataManagementLabel_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.getDataManagementLabel(mUserOneId, TEST_TRANSPORT); - - verify(mUserOneService).getDataManagementLabel(TEST_TRANSPORT); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testGetDataManagementLabel_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.getDataManagementLabel(mUserTwoId, TEST_TRANSPORT); - - verify(mUserOneService, never()).getDataManagementLabel(TEST_TRANSPORT); - } - - // --------------------------------------------- - // Settings tests - // --------------------------------------------- - /** - * Test that the backup services throws a {@link SecurityException} if the caller does not have - * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. - */ - @Test - public void testSetBackupEnabled_withoutPermission_throwsSecurityExceptionForNonCallingUser() { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - expectThrows( - SecurityException.class, - () -> backupManagerService.setBackupEnabled(mUserTwoId, true)); - } - - /** - * Test that the backup service does not throw a {@link SecurityException} if the caller has - * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. - */ - @Test - public void testSetBackupEnabled_withPermission_propagatesForNonCallingUser() { - registerUser(mUserOneId, mUserOneService); - registerUser(mUserTwoId, mUserTwoService); - BackupManagerService backupManagerService = createService(); - - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true); - - backupManagerService.setBackupEnabled(mUserTwoId, true); - - verify(mUserTwoService).setBackupEnabled(true); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testSetBackupEnabled_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.setBackupEnabled(mUserOneId, true); - - verify(mUserOneService).setBackupEnabled(true); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testSetBackupEnabled_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.setBackupEnabled(mUserTwoId, true); - - verify(mUserOneService, never()).setBackupEnabled(true); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testSetAutoRestore_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.setAutoRestore(mUserOneId, true); - - verify(mUserOneService).setAutoRestore(true); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testSetAutoRestore_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.setAutoRestore(mUserTwoId, true); - - verify(mUserOneService, never()).setAutoRestore(true); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testIsBackupEnabled_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.isBackupEnabled(mUserOneId); - - verify(mUserOneService).isBackupEnabled(); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testIsBackupEnabled_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.isBackupEnabled(mUserTwoId); - - verify(mUserOneService, never()).isBackupEnabled(); - } - - // --------------------------------------------- - // Backup tests - // --------------------------------------------- - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testIsAppEligibleForBackup_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.isAppEligibleForBackup(mUserOneId, TEST_PACKAGE); - - verify(mUserOneService).isAppEligibleForBackup(TEST_PACKAGE); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testIsAppEligibleForBackup_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.isAppEligibleForBackup(mUserTwoId, TEST_PACKAGE); - - verify(mUserOneService, never()).isAppEligibleForBackup(TEST_PACKAGE); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testFilterAppsEligibleForBackup_onRegisteredUser_callsMethodForUser() - throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - String[] packages = {TEST_PACKAGE}; - - backupManagerService.filterAppsEligibleForBackup(mUserOneId, packages); - - verify(mUserOneService).filterAppsEligibleForBackup(packages); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testFilterAppsEligibleForBackup_onUnknownUser_doesNotPropagateCall() - throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - String[] packages = {TEST_PACKAGE}; - - backupManagerService.filterAppsEligibleForBackup(mUserTwoId, packages); - - verify(mUserOneService, never()).filterAppsEligibleForBackup(packages); - } - - /** - * Test verifying that {@link BackupManagerService#backupNow(int)} throws a {@link - * SecurityException} if the caller does not have INTERACT_ACROSS_USERS_FULL permission. - */ - @Test - public void testBackupNow_withoutPermission_throwsSecurityExceptionForNonCallingUser() { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - expectThrows(SecurityException.class, () -> backupManagerService.backupNow(mUserTwoId)); - } - - /** - * Test that the backup service does not throw a {@link SecurityException} if the caller has - * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. - */ - @Test - public void testBackupNow_withPermission_propagatesForNonCallingUser() { - registerUser(mUserOneId, mUserOneService); - registerUser(mUserTwoId, mUserTwoService); - BackupManagerService backupManagerService = createService(); - - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true); - - backupManagerService.backupNow(mUserTwoId); - - verify(mUserTwoService).backupNow(); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testBackupNow_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.backupNow(mUserOneId); - - verify(mUserOneService).backupNow(); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testBackupNow_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.backupNow(mUserTwoId); - - verify(mUserOneService, never()).backupNow(); - } - - /** - * Test that the backup services throws a {@link SecurityException} if the caller does not have - * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. - */ - @Test - public void testRequestBackup_withoutPermission_throwsSecurityExceptionForNonCallingUser() { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - String[] packages = {TEST_PACKAGE}; - IBackupObserver observer = mock(IBackupObserver.class); - IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class); - - expectThrows( - SecurityException.class, - () -> - backupManagerService.requestBackup( - mUserTwoId, packages, observer, monitor, 0)); - } - - /** - * Test that the backup service does not throw a {@link SecurityException} if the caller has - * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. - */ - @Test - public void testRequestBackup_withPermission_propagatesForNonCallingUser() { - registerUser(mUserOneId, mUserOneService); - registerUser(mUserTwoId, mUserTwoService); - BackupManagerService backupManagerService = createService(); - - String[] packages = {TEST_PACKAGE}; - IBackupObserver observer = mock(IBackupObserver.class); - IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true); - - backupManagerService.requestBackup(mUserTwoId, packages, observer, monitor, /* flags */ 0); - - verify(mUserTwoService).requestBackup(packages, observer, monitor, /* flags */ 0); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testRequestBackup_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - String[] packages = {TEST_PACKAGE}; - IBackupObserver observer = mock(IBackupObserver.class); - IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.requestBackup(mUserOneId, packages, observer, monitor, /* flags */ 0); - - verify(mUserOneService).requestBackup(packages, observer, monitor, /* flags */ 0); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testRequestBackup_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - String[] packages = {TEST_PACKAGE}; - IBackupObserver observer = mock(IBackupObserver.class); - IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.requestBackup(mUserTwoId, packages, observer, monitor, /* flags */ 0); - - verify(mUserOneService, never()).requestBackup(packages, observer, monitor, /* flags */ 0); - } - - /** - * Test verifying that {@link BackupManagerService#cancelBackups(int)} throws a {@link - * SecurityException} if the caller does not have INTERACT_ACROSS_USERS_FULL permission. - */ - @Test - public void testCancelBackups_withoutPermission_throwsSecurityExceptionForNonCallingUser() { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - expectThrows(SecurityException.class, () -> backupManagerService.cancelBackups(mUserTwoId)); - } - - /** - * Test that the backup service does not throw a {@link SecurityException} if the caller has - * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. - */ - @Test - public void testCancelBackups_withPermission_propagatesForNonCallingUser() { - registerUser(mUserOneId, mUserOneService); - registerUser(mUserTwoId, mUserTwoService); - BackupManagerService backupManagerService = createService(); - - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true); - - backupManagerService.cancelBackups(mUserTwoId); - - verify(mUserTwoService).cancelBackups(); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testCancelBackups_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.cancelBackups(mUserOneId); - - verify(mUserOneService).cancelBackups(); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testCancelBackups_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.cancelBackups(mUserTwoId); - - verify(mUserOneService, never()).cancelBackups(); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testBeginFullBackup_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(UserHandle.USER_SYSTEM, mUserOneService); - BackupManagerService backupManagerService = createService(); - FullBackupJob job = new FullBackupJob(); - - backupManagerService.beginFullBackup(UserHandle.USER_SYSTEM, job); - - verify(mUserOneService).beginFullBackup(job); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testBeginFullBackup_onUnknownUser_doesNotPropagateCall() throws Exception { - BackupManagerService backupManagerService = createService(); - FullBackupJob job = new FullBackupJob(); - - backupManagerService.beginFullBackup(UserHandle.USER_SYSTEM, job); - - verify(mUserOneService, never()).beginFullBackup(job); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testEndFullBackup_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(UserHandle.USER_SYSTEM, mUserOneService); - BackupManagerService backupManagerService = createService(); - - backupManagerService.endFullBackup(UserHandle.USER_SYSTEM); - - verify(mUserOneService).endFullBackup(); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testEndFullBackup_onUnknownUser_doesNotPropagateCall() throws Exception { - BackupManagerService backupManagerService = createService(); - - backupManagerService.endFullBackup(UserHandle.USER_SYSTEM); - - verify(mUserOneService, never()).endFullBackup(); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testFullTransportBackup_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - String[] packages = {TEST_PACKAGE}; - - backupManagerService.fullTransportBackup(mUserOneId, packages); - - verify(mUserOneService).fullTransportBackup(packages); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testFullTransportBackup_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - String[] packages = {TEST_PACKAGE}; - - backupManagerService.fullTransportBackup(mUserTwoId, packages); - - verify(mUserOneService, never()).fullTransportBackup(packages); - } - - // --------------------------------------------- - // Restore tests - // --------------------------------------------- - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testRestoreAtInstall_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.restoreAtInstall(mUserOneId, TEST_PACKAGE, /* token */ 0); - - verify(mUserOneService).restoreAtInstall(TEST_PACKAGE, /* token */ 0); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testRestoreAtInstall_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.restoreAtInstall(mUserTwoId, TEST_PACKAGE, /* token */ 0); - - verify(mUserOneService, never()).restoreAtInstall(TEST_PACKAGE, /* token */ 0); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testBeginRestoreSession_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.beginRestoreSession(mUserOneId, TEST_PACKAGE, TEST_TRANSPORT); - - verify(mUserOneService).beginRestoreSession(TEST_PACKAGE, TEST_TRANSPORT); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testBeginRestoreSession_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.beginRestoreSession(mUserTwoId, TEST_PACKAGE, TEST_TRANSPORT); - - verify(mUserOneService, never()).beginRestoreSession(TEST_PACKAGE, TEST_TRANSPORT); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testGetAvailableRestoreToken_onRegisteredUser_callsMethodForUser() - throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.getAvailableRestoreToken(mUserOneId, TEST_PACKAGE); - - verify(mUserOneService).getAvailableRestoreToken(TEST_PACKAGE); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testGetAvailableRestoreToken_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.getAvailableRestoreToken(mUserTwoId, TEST_PACKAGE); - - verify(mUserOneService, never()).getAvailableRestoreToken(TEST_PACKAGE); - } - - // --------------------------------------------- - // Adb backup/restore tests - // --------------------------------------------- - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testSetBackupPassword_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(UserHandle.USER_SYSTEM, mUserOneService); - BackupManagerService backupManagerService = createService(); - - backupManagerService.setBackupPassword("currentPassword", "newPassword"); - - verify(mUserOneService).setBackupPassword("currentPassword", "newPassword"); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testSetBackupPassword_onUnknownUser_doesNotPropagateCall() throws Exception { - BackupManagerService backupManagerService = createService(); - - backupManagerService.setBackupPassword("currentPassword", "newPassword"); - - verify(mUserOneService, never()).setBackupPassword("currentPassword", "newPassword"); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testHasBackupPassword_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(UserHandle.USER_SYSTEM, mUserOneService); - BackupManagerService backupManagerService = createService(); - - backupManagerService.hasBackupPassword(); - - verify(mUserOneService).hasBackupPassword(); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testHasBackupPassword_onUnknownUser_doesNotPropagateCall() throws Exception { - BackupManagerService backupManagerService = createService(); - - backupManagerService.hasBackupPassword(); - - verify(mUserOneService, never()).hasBackupPassword(); - } - - /** - * Test that the backup services throws a {@link SecurityException} if the caller does not have - * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. - */ - @Test - public void testAdbBackup_withoutPermission_throwsSecurityExceptionForNonCallingUser() { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - expectThrows( - SecurityException.class, - () -> - backupManagerService.adbBackup( - mUserTwoId, - /* parcelFileDescriptor*/ null, - /* includeApks */ true, - /* includeObbs */ true, - /* includeShared */ true, - /* doWidgets */ true, - /* doAllApps */ true, - /* includeSystem */ true, - /* doCompress */ true, - /* doKeyValue */ true, - null)); - } - - /** - * Test that the backup service does not throw a {@link SecurityException} if the caller has - * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. - */ - @Test - public void testAdbBackup_withPermission_propagatesForNonCallingUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - registerUser(mUserTwoId, mUserTwoService); - BackupManagerService backupManagerService = createService(); - - ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true); - - backupManagerService.adbBackup( - mUserTwoId, - parcelFileDescriptor, - /* includeApks */ true, - /* includeObbs */ true, - /* includeShared */ true, - /* doWidgets */ true, - /* doAllApps */ true, - /* includeSystem */ true, - /* doCompress */ true, - /* doKeyValue */ true, - ADB_TEST_PACKAGES); - - verify(mUserTwoService) - .adbBackup( - parcelFileDescriptor, - /* includeApks */ true, - /* includeObbs */ true, - /* includeShared */ true, - /* doWidgets */ true, - /* doAllApps */ true, - /* includeSystem */ true, - /* doCompress */ true, - /* doKeyValue */ true, - ADB_TEST_PACKAGES); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testAdbBackup_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.adbBackup( - mUserOneId, - parcelFileDescriptor, - /* includeApks */ true, - /* includeObbs */ true, - /* includeShared */ true, - /* doWidgets */ true, - /* doAllApps */ true, - /* includeSystem */ true, - /* doCompress */ true, - /* doKeyValue */ true, - ADB_TEST_PACKAGES); - - verify(mUserOneService) - .adbBackup( - parcelFileDescriptor, - /* includeApks */ true, - /* includeObbs */ true, - /* includeShared */ true, - /* doWidgets */ true, - /* doAllApps */ true, - /* includeSystem */ true, - /* doCompress */ true, - /* doKeyValue */ true, - ADB_TEST_PACKAGES); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testAdbBackup_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.adbBackup( - mUserTwoId, - parcelFileDescriptor, - /* includeApks */ true, - /* includeObbs */ true, - /* includeShared */ true, - /* doWidgets */ true, - /* doAllApps */ true, - /* includeSystem */ true, - /* doCompress */ true, - /* doKeyValue */ true, - ADB_TEST_PACKAGES); - - verify(mUserOneService, never()) - .adbBackup( - parcelFileDescriptor, - /* includeApks */ true, - /* includeObbs */ true, - /* includeShared */ true, - /* doWidgets */ true, - /* doAllApps */ true, - /* includeSystem */ true, - /* doCompress */ true, - /* doKeyValue */ true, - ADB_TEST_PACKAGES); - } - - /** - * Test that the backup services throws a {@link SecurityException} if the caller does not have - * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. - */ - @Test - public void testAdbRestore_withoutPermission_throwsSecurityExceptionForNonCallingUser() { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - expectThrows( - SecurityException.class, () -> backupManagerService.adbRestore(mUserTwoId, null)); - } - - /** - * Test that the backup service does not throw a {@link SecurityException} if the caller has - * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. - */ - @Test - public void testAdbRestore_withPermission_propagatesForNonCallingUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - registerUser(mUserTwoId, mUserTwoService); - BackupManagerService backupManagerService = createService(); - ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true); - - backupManagerService.adbRestore(mUserTwoId, parcelFileDescriptor); - - verify(mUserTwoService).adbRestore(parcelFileDescriptor); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testAdbRestore_onRegisteredUser_callsMethodForUser() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - - backupManagerService.adbRestore(mUserOneId, parcelFileDescriptor); - - verify(mUserOneService).adbRestore(parcelFileDescriptor); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testAdbRestore_onUnknownUser_doesNotPropagateCall() throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - - backupManagerService.adbRestore(mUserTwoId, parcelFileDescriptor); - - verify(mUserOneService, never()).adbRestore(parcelFileDescriptor); - } - - /** Test that the backup service routes methods correctly to the user that requests it. */ - @Test - public void testAcknowledgeAdbBackupOrRestore_onRegisteredUser_callsMethodForUser() - throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); - IFullBackupRestoreObserver observer = mock(IFullBackupRestoreObserver.class); - - backupManagerService.acknowledgeAdbBackupOrRestore( - mUserOneId, - /* token */ 0, - /* allow */ true, - "currentPassword", - "encryptionPassword", - observer); - - verify(mUserOneService) - .acknowledgeAdbBackupOrRestore( - /* token */ 0, - /* allow */ true, - "currentPassword", - "encryptionPassword", - observer); - } - - /** Test that the backup service does not route methods for non-registered users. */ - @Test - public void testAcknowledgeAdbBackupOrRestore_onUnknownUser_doesNotPropagateCall() - throws Exception { - registerUser(mUserOneId, mUserOneService); - BackupManagerService backupManagerService = createService(); - setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); - IFullBackupRestoreObserver observer = mock(IFullBackupRestoreObserver.class); - - backupManagerService.acknowledgeAdbBackupOrRestore( - mUserTwoId, - /* token */ 0, - /* allow */ true, - "currentPassword", - "encryptionPassword", - observer); - - verify(mUserOneService, never()) - .acknowledgeAdbBackupOrRestore( - /* token */ 0, - /* allow */ true, - "currentPassword", - "encryptionPassword", - observer); - } - - // --------------------------------------------- // Lifecycle tests // --------------------------------------------- diff --git a/services/robotests/backup/src/com/android/server/backup/TrampolineRoboTest.java b/services/robotests/backup/src/com/android/server/backup/TrampolineRoboTest.java index dfad1a9120d7..b9a926c5d619 100644 --- a/services/robotests/backup/src/com/android/server/backup/TrampolineRoboTest.java +++ b/services/robotests/backup/src/com/android/server/backup/TrampolineRoboTest.java @@ -19,21 +19,33 @@ package com.android.server.backup; import static android.Manifest.permission.BACKUP; import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; +import static com.android.server.backup.testing.TransportData.backupTransport; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.robolectric.Shadows.shadowOf; +import static org.testng.Assert.expectThrows; import android.annotation.UserIdInt; import android.app.Application; +import android.app.backup.IBackupManagerMonitor; +import android.app.backup.IBackupObserver; +import android.app.backup.IFullBackupRestoreObserver; +import android.app.backup.ISelectBackupTransportCallback; import android.content.Context; +import android.content.Intent; +import android.os.IBinder; +import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.platform.test.annotations.Presubmit; import android.util.SparseArray; +import com.android.server.backup.testing.TransportData; import com.android.server.testing.shadows.ShadowApplicationPackageManager; import com.android.server.testing.shadows.ShadowBinder; import com.android.server.testing.shadows.ShadowEnvironment; @@ -51,6 +63,8 @@ import org.robolectric.annotation.Config; import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowContextWrapper; +import java.io.File; + /** Tests for {@link com.android.server.backup.Trampoline}. */ @RunWith(RobolectricTestRunner.class) @Config( @@ -63,6 +77,10 @@ import org.robolectric.shadows.ShadowContextWrapper; }) @Presubmit public class TrampolineRoboTest { + private static final String TEST_PACKAGE = "package"; + private static final String TEST_TRANSPORT = "transport"; + private static final String[] ADB_TEST_PACKAGES = {TEST_PACKAGE}; + private Context mContext; private ShadowContextWrapper mShadowContext; private ShadowUserManager mShadowUserManager; @@ -161,10 +179,1257 @@ public class TrampolineRoboTest { assertThat(serviceUsers.size()).isEqualTo(0); } + // --------------------------------------------- + // Backup agent tests + // --------------------------------------------- + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testDataChanged_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.dataChanged(mUserOneId, TEST_PACKAGE); + + verify(mUserOneService).dataChanged(TEST_PACKAGE); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testDataChanged_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.dataChanged(mUserTwoId, TEST_PACKAGE); + + verify(mUserOneService, never()).dataChanged(TEST_PACKAGE); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testAgentConnected_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + IBinder agentBinder = mock(IBinder.class); + + backupManagerService.agentConnected(mUserOneId, TEST_PACKAGE, agentBinder); + + verify(mUserOneService).agentConnected(TEST_PACKAGE, agentBinder); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testAgentConnected_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + IBinder agentBinder = mock(IBinder.class); + + backupManagerService.agentConnected(mUserTwoId, TEST_PACKAGE, agentBinder); + + verify(mUserOneService, never()).agentConnected(TEST_PACKAGE, agentBinder); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testOpComplete_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.opComplete(mUserOneId, /* token */ 0, /* result */ 0L); + + verify(mUserOneService).opComplete(/* token */ 0, /* result */ 0L); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testOpComplete_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.opComplete(mUserTwoId, /* token */ 0, /* result */ 0L); + + verify(mUserOneService, never()).opComplete(/* token */ 0, /* result */ 0L); + } + + // --------------------------------------------- + // Transport tests + // --------------------------------------------- + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testInitializeTransports_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + String[] transports = {TEST_TRANSPORT}; + + backupManagerService.initializeTransports(mUserOneId, transports, /* observer */ null); + + verify(mUserOneService).initializeTransports(transports, /* observer */ null); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testInitializeTransports_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + String[] transports = {TEST_TRANSPORT}; + + backupManagerService.initializeTransports(mUserTwoId, transports, /* observer */ null); + + verify(mUserOneService, never()).initializeTransports(transports, /* observer */ null); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testClearBackupData_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.clearBackupData(mUserOneId, TEST_TRANSPORT, TEST_PACKAGE); + + verify(mUserOneService).clearBackupData(TEST_TRANSPORT, TEST_PACKAGE); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testClearBackupData_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.clearBackupData(mUserTwoId, TEST_TRANSPORT, TEST_PACKAGE); + + verify(mUserOneService, never()).clearBackupData(TEST_TRANSPORT, TEST_PACKAGE); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testGetCurrentTransport_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.getCurrentTransport(mUserOneId); + + verify(mUserOneService).getCurrentTransport(); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testGetCurrentTransport_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.getCurrentTransport(mUserTwoId); + + verify(mUserOneService, never()).getCurrentTransport(); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testGetCurrentTransportComponent_onRegisteredUser_callsMethodForUser() + throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.getCurrentTransportComponent(mUserOneId); + + verify(mUserOneService).getCurrentTransportComponent(); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testGetCurrentTransportComponent_onUnknownUser_doesNotPropagateCall() + throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.getCurrentTransportComponent(mUserTwoId); + + verify(mUserOneService, never()).getCurrentTransportComponent(); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testListAllTransports_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.listAllTransports(mUserOneId); + + verify(mUserOneService).listAllTransports(); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testListAllTransports_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.listAllTransports(mUserTwoId); + + verify(mUserOneService, never()).listAllTransports(); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testListAllTransportComponents_onRegisteredUser_callsMethodForUser() + throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.listAllTransportComponents(mUserOneId); + + verify(mUserOneService).listAllTransportComponents(); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testListAllTransportComponents_onUnknownUser_doesNotPropagateCall() + throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.listAllTransportComponents(mUserTwoId); + + verify(mUserOneService, never()).listAllTransportComponents(); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testSelectBackupTransport_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.selectBackupTransport(mUserOneId, TEST_TRANSPORT); + + verify(mUserOneService).selectBackupTransport(TEST_TRANSPORT); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testSelectBackupTransport_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.selectBackupTransport(mUserTwoId, TEST_TRANSPORT); + + verify(mUserOneService, never()).selectBackupTransport(TEST_TRANSPORT); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testSelectTransportAsync_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + TransportData transport = backupTransport(); + ISelectBackupTransportCallback callback = mock(ISelectBackupTransportCallback.class); + + backupManagerService.selectBackupTransportAsync( + mUserOneId, transport.getTransportComponent(), callback); + + verify(mUserOneService) + .selectBackupTransportAsync(transport.getTransportComponent(), callback); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testSelectBackupTransportAsync_onUnknownUser_doesNotPropagateCall() + throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + TransportData transport = backupTransport(); + ISelectBackupTransportCallback callback = mock(ISelectBackupTransportCallback.class); + + backupManagerService.selectBackupTransportAsync( + mUserTwoId, transport.getTransportComponent(), callback); + + verify(mUserOneService, never()) + .selectBackupTransportAsync(transport.getTransportComponent(), callback); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testGetConfigurationIntent_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.getConfigurationIntent(mUserOneId, TEST_TRANSPORT); + + verify(mUserOneService).getConfigurationIntent(TEST_TRANSPORT); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testGetConfigurationIntent_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.getConfigurationIntent(mUserTwoId, TEST_TRANSPORT); + + verify(mUserOneService, never()).getConfigurationIntent(TEST_TRANSPORT); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testGetDestinationString_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.getDestinationString(mUserOneId, TEST_TRANSPORT); + + verify(mUserOneService).getDestinationString(TEST_TRANSPORT); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testGetDestinationString_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.getDestinationString(mUserTwoId, TEST_TRANSPORT); + + verify(mUserOneService, never()).getDestinationString(TEST_TRANSPORT); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testGetDataManagementIntent_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.getDataManagementIntent(mUserOneId, TEST_TRANSPORT); + + verify(mUserOneService).getDataManagementIntent(TEST_TRANSPORT); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testGetDataManagementIntent_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.getDataManagementIntent(mUserTwoId, TEST_TRANSPORT); + + verify(mUserOneService, never()).getDataManagementIntent(TEST_TRANSPORT); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testGetDataManagementLabel_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.getDataManagementLabel(mUserOneId, TEST_TRANSPORT); + + verify(mUserOneService).getDataManagementLabel(TEST_TRANSPORT); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testGetDataManagementLabel_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.getDataManagementLabel(mUserTwoId, TEST_TRANSPORT); + + verify(mUserOneService, never()).getDataManagementLabel(TEST_TRANSPORT); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testUpdateTransportAttributes_onRegisteredUser_callsMethodForUser() + throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + TransportData transport = backupTransport(); + Intent configurationIntent = new Intent(); + Intent dataManagementIntent = new Intent(); + + backupManagerService.updateTransportAttributes( + mUserOneId, + transport.getTransportComponent(), + transport.transportName, + configurationIntent, + "currentDestinationString", + dataManagementIntent, + "dataManagementLabel"); + + verify(mUserOneService) + .updateTransportAttributes( + transport.getTransportComponent(), + transport.transportName, + configurationIntent, + "currentDestinationString", + dataManagementIntent, + "dataManagementLabel"); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testUpdateTransportAttributes_onUnknownUser_doesNotPropagateCall() + throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + TransportData transport = backupTransport(); + Intent configurationIntent = new Intent(); + Intent dataManagementIntent = new Intent(); + + backupManagerService.updateTransportAttributes( + mUserTwoId, + transport.getTransportComponent(), + transport.transportName, + configurationIntent, + "currentDestinationString", + dataManagementIntent, + "dataManagementLabel"); + + verify(mUserOneService, never()) + .updateTransportAttributes( + transport.getTransportComponent(), + transport.transportName, + configurationIntent, + "currentDestinationString", + dataManagementIntent, + "dataManagementLabel"); + } + + // --------------------------------------------- + // Settings tests + // --------------------------------------------- + + /** + * Test that the backup services throws a {@link SecurityException} if the caller does not have + * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. + */ + @Test + public void testSetBackupEnabled_withoutPermission_throwsSecurityExceptionForNonCallingUser() { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + expectThrows( + SecurityException.class, + () -> backupManagerService.setBackupEnabled(mUserTwoId, true)); + } + + /** + * Test that the backup service does not throw a {@link SecurityException} if the caller has + * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. + */ + @Test + public void testSetBackupEnabled_withPermission_propagatesForNonCallingUser() { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + registerUser(backupManagerService, mUserTwoId, mUserTwoService); + + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true); + + backupManagerService.setBackupEnabled(mUserTwoId, true); + + verify(mUserTwoService).setBackupEnabled(true); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testSetBackupEnabled_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.setBackupEnabled(mUserOneId, true); + + verify(mUserOneService).setBackupEnabled(true); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testSetBackupEnabled_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.setBackupEnabled(mUserTwoId, true); + + verify(mUserOneService, never()).setBackupEnabled(true); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testSetAutoRestore_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.setAutoRestore(mUserOneId, true); + + verify(mUserOneService).setAutoRestore(true); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testSetAutoRestore_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.setAutoRestore(mUserTwoId, true); + + verify(mUserOneService, never()).setAutoRestore(true); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testIsBackupEnabled_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.isBackupEnabled(mUserOneId); + + verify(mUserOneService).isBackupEnabled(); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testIsBackupEnabled_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.isBackupEnabled(mUserTwoId); + + verify(mUserOneService, never()).isBackupEnabled(); + } + + // --------------------------------------------- + // Backup tests + // --------------------------------------------- + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testIsAppEligibleForBackup_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.isAppEligibleForBackup(mUserOneId, TEST_PACKAGE); + + verify(mUserOneService).isAppEligibleForBackup(TEST_PACKAGE); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testIsAppEligibleForBackup_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.isAppEligibleForBackup(mUserTwoId, TEST_PACKAGE); + + verify(mUserOneService, never()).isAppEligibleForBackup(TEST_PACKAGE); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testFilterAppsEligibleForBackup_onRegisteredUser_callsMethodForUser() + throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + String[] packages = {TEST_PACKAGE}; + + backupManagerService.filterAppsEligibleForBackup(mUserOneId, packages); + + verify(mUserOneService).filterAppsEligibleForBackup(packages); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testFilterAppsEligibleForBackup_onUnknownUser_doesNotPropagateCall() + throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + String[] packages = {TEST_PACKAGE}; + + backupManagerService.filterAppsEligibleForBackup(mUserTwoId, packages); + + verify(mUserOneService, never()).filterAppsEligibleForBackup(packages); + } + + /** + * Test verifying that {@link BackupManagerService#backupNow(int)} throws a {@link + * SecurityException} if the caller does not have INTERACT_ACROSS_USERS_FULL permission. + */ + @Test + public void testBackupNow_withoutPermission_throwsSecurityExceptionForNonCallingUser() { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + expectThrows(SecurityException.class, () -> backupManagerService.backupNow(mUserTwoId)); + } + + /** + * Test that the backup service does not throw a {@link SecurityException} if the caller has + * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. + */ + @Test + public void testBackupNow_withPermission_propagatesForNonCallingUser() { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + registerUser(backupManagerService, mUserTwoId, mUserTwoService); + + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true); + + backupManagerService.backupNow(mUserTwoId); + + verify(mUserTwoService).backupNow(); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testBackupNow_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.backupNow(mUserOneId); + + verify(mUserOneService).backupNow(); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testBackupNow_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.backupNow(mUserTwoId); + + verify(mUserOneService, never()).backupNow(); + } + + /** + * Test that the backup services throws a {@link SecurityException} if the caller does not have + * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. + */ + @Test + public void testRequestBackup_withoutPermission_throwsSecurityExceptionForNonCallingUser() { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + String[] packages = {TEST_PACKAGE}; + IBackupObserver observer = mock(IBackupObserver.class); + IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class); + + expectThrows( + SecurityException.class, + () -> + backupManagerService.requestBackup( + mUserTwoId, packages, observer, monitor, 0)); + } + + /** + * Test that the backup service does not throw a {@link SecurityException} if the caller has + * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. + */ + @Test + public void testRequestBackup_withPermission_propagatesForNonCallingUser() { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + registerUser(backupManagerService, mUserTwoId, mUserTwoService); + + String[] packages = {TEST_PACKAGE}; + IBackupObserver observer = mock(IBackupObserver.class); + IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true); + + backupManagerService.requestBackup(mUserTwoId, packages, observer, monitor, /* flags */ 0); + + verify(mUserTwoService).requestBackup(packages, observer, monitor, /* flags */ 0); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testRequestBackup_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + String[] packages = {TEST_PACKAGE}; + IBackupObserver observer = mock(IBackupObserver.class); + IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.requestBackup(mUserOneId, packages, observer, monitor, /* flags */ 0); + + verify(mUserOneService).requestBackup(packages, observer, monitor, /* flags */ 0); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testRequestBackup_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + String[] packages = {TEST_PACKAGE}; + IBackupObserver observer = mock(IBackupObserver.class); + IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.requestBackup(mUserTwoId, packages, observer, monitor, /* flags */ 0); + + verify(mUserOneService, never()).requestBackup(packages, observer, monitor, /* flags */ 0); + } + + /** + * Test verifying that {@link BackupManagerService#cancelBackups(int)} throws a {@link + * SecurityException} if the caller does not have INTERACT_ACROSS_USERS_FULL permission. + */ + @Test + public void testCancelBackups_withoutPermission_throwsSecurityExceptionForNonCallingUser() { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + expectThrows(SecurityException.class, () -> backupManagerService.cancelBackups(mUserTwoId)); + } + + /** + * Test that the backup service does not throw a {@link SecurityException} if the caller has + * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. + */ + @Test + public void testCancelBackups_withPermission_propagatesForNonCallingUser() { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + registerUser(backupManagerService, mUserTwoId, mUserTwoService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true); + + backupManagerService.cancelBackups(mUserTwoId); + + verify(mUserTwoService).cancelBackups(); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testCancelBackups_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.cancelBackups(mUserOneId); + + verify(mUserOneService).cancelBackups(); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testCancelBackups_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.cancelBackups(mUserTwoId); + + verify(mUserOneService, never()).cancelBackups(); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testBeginFullBackup_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, UserHandle.USER_SYSTEM, mUserOneService); + FullBackupJob job = new FullBackupJob(); + + backupManagerService.beginFullBackup(UserHandle.USER_SYSTEM, job); + + verify(mUserOneService).beginFullBackup(job); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testBeginFullBackup_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + FullBackupJob job = new FullBackupJob(); + + backupManagerService.beginFullBackup(UserHandle.USER_SYSTEM, job); + + verify(mUserOneService, never()).beginFullBackup(job); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testEndFullBackup_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, UserHandle.USER_SYSTEM, mUserOneService); + + backupManagerService.endFullBackup(UserHandle.USER_SYSTEM); + + verify(mUserOneService).endFullBackup(); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testEndFullBackup_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + + backupManagerService.endFullBackup(UserHandle.USER_SYSTEM); + + verify(mUserOneService, never()).endFullBackup(); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testFullTransportBackup_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + String[] packages = {TEST_PACKAGE}; + + backupManagerService.fullTransportBackup(mUserOneId, packages); + + verify(mUserOneService).fullTransportBackup(packages); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testFullTransportBackup_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + String[] packages = {TEST_PACKAGE}; + + backupManagerService.fullTransportBackup(mUserTwoId, packages); + + verify(mUserOneService, never()).fullTransportBackup(packages); + } + + // --------------------------------------------- + // Restore tests + // --------------------------------------------- + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testRestoreAtInstall_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.restoreAtInstall(mUserOneId, TEST_PACKAGE, /* token */ 0); + + verify(mUserOneService).restoreAtInstall(TEST_PACKAGE, /* token */ 0); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testRestoreAtInstall_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.restoreAtInstall(mUserTwoId, TEST_PACKAGE, /* token */ 0); + + verify(mUserOneService, never()).restoreAtInstall(TEST_PACKAGE, /* token */ 0); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testBeginRestoreSession_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.beginRestoreSession(mUserOneId, TEST_PACKAGE, TEST_TRANSPORT); + + verify(mUserOneService).beginRestoreSession(TEST_PACKAGE, TEST_TRANSPORT); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testBeginRestoreSession_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.beginRestoreSession(mUserTwoId, TEST_PACKAGE, TEST_TRANSPORT); + + verify(mUserOneService, never()).beginRestoreSession(TEST_PACKAGE, TEST_TRANSPORT); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testGetAvailableRestoreToken_onRegisteredUser_callsMethodForUser() + throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.getAvailableRestoreToken(mUserOneId, TEST_PACKAGE); + + verify(mUserOneService).getAvailableRestoreToken(TEST_PACKAGE); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testGetAvailableRestoreToken_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.getAvailableRestoreToken(mUserTwoId, TEST_PACKAGE); + + verify(mUserOneService, never()).getAvailableRestoreToken(TEST_PACKAGE); + } + + // --------------------------------------------- + // Adb backup/restore tests + // --------------------------------------------- + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testSetBackupPassword_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, UserHandle.USER_SYSTEM, mUserOneService); + ShadowBinder.setCallingUserHandle(UserHandle.of(UserHandle.USER_SYSTEM)); + + backupManagerService.setBackupPassword("currentPassword", "newPassword"); + + verify(mUserOneService).setBackupPassword("currentPassword", "newPassword"); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testSetBackupPassword_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + + backupManagerService.setBackupPassword("currentPassword", "newPassword"); + + verify(mUserOneService, never()).setBackupPassword("currentPassword", "newPassword"); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testHasBackupPassword_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, UserHandle.USER_SYSTEM, mUserOneService); + ShadowBinder.setCallingUserHandle(UserHandle.of(UserHandle.USER_SYSTEM)); + + backupManagerService.hasBackupPassword(); + + verify(mUserOneService).hasBackupPassword(); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testHasBackupPassword_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createService(); + + backupManagerService.hasBackupPassword(); + + verify(mUserOneService, never()).hasBackupPassword(); + } + + /** + * Test that the backup services throws a {@link SecurityException} if the caller does not have + * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. + */ + @Test + public void testAdbBackup_withoutPermission_throwsSecurityExceptionForNonCallingUser() { + Trampoline backupManagerService = createSystemRegisteredService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + registerUser(backupManagerService, mUserTwoId, mUserTwoService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + expectThrows( + SecurityException.class, + () -> + backupManagerService.adbBackup( + mUserTwoId, + /* parcelFileDescriptor*/ null, + /* includeApks */ true, + /* includeObbs */ true, + /* includeShared */ true, + /* doWidgets */ true, + /* doAllApps */ true, + /* includeSystem */ true, + /* doCompress */ true, + /* doKeyValue */ true, + null)); + } + + /** + * Test that the backup service does not throw a {@link SecurityException} if the caller has + * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. + */ + @Test + public void testAdbBackup_withPermission_propagatesForNonCallingUser() throws Exception { + Trampoline backupManagerService = createSystemRegisteredService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + registerUser(backupManagerService, mUserTwoId, mUserTwoService); + + ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest(); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true); + + backupManagerService.adbBackup( + mUserTwoId, + parcelFileDescriptor, + /* includeApks */ true, + /* includeObbs */ true, + /* includeShared */ true, + /* doWidgets */ true, + /* doAllApps */ true, + /* includeSystem */ true, + /* doCompress */ true, + /* doKeyValue */ true, + ADB_TEST_PACKAGES); + + verify(mUserTwoService) + .adbBackup( + parcelFileDescriptor, + /* includeApks */ true, + /* includeObbs */ true, + /* includeShared */ true, + /* doWidgets */ true, + /* doAllApps */ true, + /* includeSystem */ true, + /* doCompress */ true, + /* doKeyValue */ true, + ADB_TEST_PACKAGES); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testAdbBackup_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createSystemRegisteredService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest(); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.adbBackup( + mUserOneId, + parcelFileDescriptor, + /* includeApks */ true, + /* includeObbs */ true, + /* includeShared */ true, + /* doWidgets */ true, + /* doAllApps */ true, + /* includeSystem */ true, + /* doCompress */ true, + /* doKeyValue */ true, + ADB_TEST_PACKAGES); + + verify(mUserOneService) + .adbBackup( + parcelFileDescriptor, + /* includeApks */ true, + /* includeObbs */ true, + /* includeShared */ true, + /* doWidgets */ true, + /* doAllApps */ true, + /* includeSystem */ true, + /* doCompress */ true, + /* doKeyValue */ true, + ADB_TEST_PACKAGES); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testAdbBackup_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createSystemRegisteredService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest(); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.adbBackup( + mUserTwoId, + parcelFileDescriptor, + /* includeApks */ true, + /* includeObbs */ true, + /* includeShared */ true, + /* doWidgets */ true, + /* doAllApps */ true, + /* includeSystem */ true, + /* doCompress */ true, + /* doKeyValue */ true, + ADB_TEST_PACKAGES); + + verify(mUserOneService, never()) + .adbBackup( + parcelFileDescriptor, + /* includeApks */ true, + /* includeObbs */ true, + /* includeShared */ true, + /* doWidgets */ true, + /* doAllApps */ true, + /* includeSystem */ true, + /* doCompress */ true, + /* doKeyValue */ true, + ADB_TEST_PACKAGES); + } + + /** + * Test that the backup services throws a {@link SecurityException} if the caller does not have + * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. + */ + @Test + public void testAdbRestore_withoutPermission_throwsSecurityExceptionForNonCallingUser() { + Trampoline backupManagerService = createSystemRegisteredService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + registerUser(backupManagerService, mUserTwoId, mUserTwoService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + expectThrows( + SecurityException.class, () -> backupManagerService.adbRestore(mUserTwoId, null)); + } + + /** + * Test that the backup service does not throw a {@link SecurityException} if the caller has + * INTERACT_ACROSS_USERS_FULL permission and passes a different user id. + */ + @Test + public void testAdbRestore_withPermission_propagatesForNonCallingUser() throws Exception { + Trampoline backupManagerService = createSystemRegisteredService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + registerUser(backupManagerService, mUserTwoId, mUserTwoService); + ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest(); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true); + + backupManagerService.adbRestore(mUserTwoId, parcelFileDescriptor); + + verify(mUserTwoService).adbRestore(parcelFileDescriptor); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testAdbRestore_onRegisteredUser_callsMethodForUser() throws Exception { + Trampoline backupManagerService = createSystemRegisteredService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest(); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + + backupManagerService.adbRestore(mUserOneId, parcelFileDescriptor); + + verify(mUserOneService).adbRestore(parcelFileDescriptor); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testAdbRestore_onUnknownUser_doesNotPropagateCall() throws Exception { + Trampoline backupManagerService = createSystemRegisteredService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest(); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + + backupManagerService.adbRestore(mUserTwoId, parcelFileDescriptor); + + verify(mUserOneService, never()).adbRestore(parcelFileDescriptor); + } + + private ParcelFileDescriptor getFileDescriptorForAdbTest() throws Exception { + File testFile = new File(mContext.getFilesDir(), "test"); + testFile.createNewFile(); + return ParcelFileDescriptor.open(testFile, ParcelFileDescriptor.MODE_READ_WRITE); + } + + /** Test that the backup service routes methods correctly to the user that requests it. */ + @Test + public void testAcknowledgeAdbBackupOrRestore_onRegisteredUser_callsMethodForUser() + throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false); + IFullBackupRestoreObserver observer = mock(IFullBackupRestoreObserver.class); + + backupManagerService.acknowledgeAdbBackupOrRestore( + mUserOneId, + /* token */ 0, + /* allow */ true, + "currentPassword", + "encryptionPassword", + observer); + + verify(mUserOneService) + .acknowledgeAdbBackupOrRestore( + /* token */ 0, + /* allow */ true, + "currentPassword", + "encryptionPassword", + observer); + } + + /** Test that the backup service does not route methods for non-registered users. */ + @Test + public void testAcknowledgeAdbBackupOrRestore_onUnknownUser_doesNotPropagateCall() + throws Exception { + Trampoline backupManagerService = createService(); + registerUser(backupManagerService, mUserOneId, mUserOneService); + setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false); + IFullBackupRestoreObserver observer = mock(IFullBackupRestoreObserver.class); + + backupManagerService.acknowledgeAdbBackupOrRestore( + mUserTwoId, + /* token */ 0, + /* allow */ true, + "currentPassword", + "encryptionPassword", + observer); + + verify(mUserOneService, never()) + .acknowledgeAdbBackupOrRestore( + /* token */ 0, + /* allow */ true, + "currentPassword", + "encryptionPassword", + observer); + } + private Trampoline createService() { return new Trampoline(mContext); } + private Trampoline createSystemRegisteredService() { + Trampoline trampoline = createService(); + registerUser(trampoline, UserHandle.USER_SYSTEM, mock(UserBackupManagerService.class)); + return trampoline; + } + + private void registerUser( + Trampoline trampoline, int userId, UserBackupManagerService userBackupManagerService) { + trampoline.setBackupServiceActive(userId, true); + trampoline.startServiceForUser(userId, userBackupManagerService); + } + private Trampoline createServiceAndRegisterUser( int userId, UserBackupManagerService userBackupManagerService) { Trampoline backupManagerService = createService(); @@ -172,4 +1437,19 @@ public class TrampolineRoboTest { backupManagerService.startServiceForUser(userId, userBackupManagerService); return backupManagerService; } + + /** + * Sets the calling user to {@code userId} and grants the permission INTERACT_ACROSS_USERS_FULL + * to the caller if {@code shouldGrantPermission} is {@code true}, else it denies the + * permission. + */ + private void setCallerAndGrantInteractUserPermission( + @UserIdInt int userId, boolean shouldGrantPermission) { + ShadowBinder.setCallingUserHandle(UserHandle.of(userId)); + if (shouldGrantPermission) { + mShadowContext.grantPermissions(INTERACT_ACROSS_USERS_FULL); + } else { + mShadowContext.denyPermissions(INTERACT_ACROSS_USERS_FULL); + } + } } diff --git a/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java index 1e29ed6ba5f3..6e8b86add2c4 100644 --- a/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java @@ -253,7 +253,7 @@ public class AlarmManagerServiceTest { doReturn(mIActivityManager).when(ActivityManager::getService); doReturn(mAppStateTracker).when(() -> LocalServices.getService(AppStateTracker.class)); doReturn(null) - .when(() -> LocalServices.getService(DeviceIdleController.LocalService.class)); + .when(() -> LocalServices.getService(DeviceIdleInternal.class)); doReturn(mUsageStatsManagerInternal).when( () -> LocalServices.getService(UsageStatsManagerInternal.class)); when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE), diff --git a/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java index 6feac520e538..108b017fc76c 100644 --- a/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java @@ -186,7 +186,7 @@ public class DeviceIdleControllerTest { @Override ConstraintController getConstraintController( - Handler handler, DeviceIdleController.LocalService localService) { + Handler handler, DeviceIdleInternal localService) { return constraintController; } @@ -291,7 +291,7 @@ public class DeviceIdleControllerTest { // DeviceIdleController adds these to LocalServices in the constructor, so we have to remove // them after each test, otherwise, subsequent tests will fail. LocalServices.removeServiceForTest(AppStateTracker.class); - LocalServices.removeServiceForTest(DeviceIdleController.LocalService.class); + LocalServices.removeServiceForTest(DeviceIdleInternal.class); } @Test diff --git a/services/tests/mockingservicestests/src/com/android/server/deviceidle/BluetoothConstraintTest.java b/services/tests/mockingservicestests/src/com/android/server/deviceidle/BluetoothConstraintTest.java index f74ac1f5317f..a9d1c2d60167 100644 --- a/services/tests/mockingservicestests/src/com/android/server/deviceidle/BluetoothConstraintTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/deviceidle/BluetoothConstraintTest.java @@ -39,7 +39,7 @@ import android.os.Handler; import androidx.test.runner.AndroidJUnit4; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; import org.junit.After; import org.junit.Before; @@ -71,7 +71,7 @@ public class BluetoothConstraintTest { private BluetoothManager mBluetoothManager; @Mock - private DeviceIdleController.LocalService mDeviceIdleService; + private DeviceIdleInternal mDeviceIdleService; private BluetoothConstraint mConstraint; diff --git a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java index 22cd3d39c982..71f7d2c27c86 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java @@ -53,7 +53,7 @@ import android.os.RemoteException; import android.os.SystemClock; import com.android.server.AppStateTracker; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; import com.android.server.LocalServices; import com.android.server.job.controllers.JobStatus; @@ -114,8 +114,8 @@ public class JobSchedulerServiceTest { when(mContext.getSystemService(NetworkPolicyManager.class)) .thenReturn(mock(NetworkPolicyManager.class)); // Called in DeviceIdleJobsController constructor. - doReturn(mock(DeviceIdleController.LocalService.class)) - .when(() -> LocalServices.getService(DeviceIdleController.LocalService.class)); + doReturn(mock(DeviceIdleInternal.class)) + .when(() -> LocalServices.getService(DeviceIdleInternal.class)); // Used in JobStatus. doReturn(mock(PackageManagerInternal.class)) .when(() -> LocalServices.getService(PackageManagerInternal.class)); diff --git a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java index 8c97e7ceeabd..ecf2d2f3be78 100644 --- a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java +++ b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java @@ -16,18 +16,18 @@ package com.android.server.backup; +import static com.google.common.truth.Truth.assertThat; + import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; -import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @@ -42,7 +42,6 @@ import android.app.backup.ISelectBackupTransportCallback; import android.app.job.JobScheduler; import android.content.ComponentName; import android.content.Context; -import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.UserInfo; import android.os.ConditionVariable; @@ -483,314 +482,6 @@ public class TrampolineTest { } @Test - public void dataChangedForUser_forwarded() throws Exception { - mTrampoline.dataChangedForUser(mUserId, PACKAGE_NAME); - - verify(mBackupManagerServiceMock).dataChanged(mUserId, PACKAGE_NAME); - } - - @Test - public void dataChanged_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.dataChanged(PACKAGE_NAME); - - verify(mBackupManagerServiceMock).dataChanged(mUserId, PACKAGE_NAME); - } - - @Test - public void clearBackupDataForUser_forwarded() throws Exception { - - mTrampoline.clearBackupDataForUser(mUserId, TRANSPORT_NAME, PACKAGE_NAME); - - verify(mBackupManagerServiceMock).clearBackupData(mUserId, TRANSPORT_NAME, PACKAGE_NAME); - } - - @Test - public void clearBackupData_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.clearBackupData(TRANSPORT_NAME, PACKAGE_NAME); - - verify(mBackupManagerServiceMock).clearBackupData(mUserId, TRANSPORT_NAME, PACKAGE_NAME); - } - - @Test - public void agentConnectedForUser_forwarded() throws Exception { - - mTrampoline.agentConnectedForUser(mUserId, PACKAGE_NAME, mAgentMock); - - verify(mBackupManagerServiceMock).agentConnected(mUserId, PACKAGE_NAME, mAgentMock); - } - - @Test - public void agentConnected_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.agentConnected(PACKAGE_NAME, mAgentMock); - - verify(mBackupManagerServiceMock).agentConnected(mUserId, PACKAGE_NAME, mAgentMock); - } - - @Test - public void agentDisconnectedForUser_forwarded() throws Exception { - - mTrampoline.agentDisconnectedForUser(mUserId, PACKAGE_NAME); - - verify(mBackupManagerServiceMock).agentDisconnected(mUserId, PACKAGE_NAME); - } - - @Test - public void agentDisconnected_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.agentDisconnected(PACKAGE_NAME); - - verify(mBackupManagerServiceMock).agentDisconnected(mUserId, PACKAGE_NAME); - } - - @Test - public void restoreAtInstallForUser_forwarded() throws Exception { - - mTrampoline.restoreAtInstallForUser(mUserId, PACKAGE_NAME, 123); - - verify(mBackupManagerServiceMock).restoreAtInstall(mUserId, PACKAGE_NAME, 123); - } - - @Test - public void restoreAtInstall_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.restoreAtInstall(PACKAGE_NAME, 123); - - verify(mBackupManagerServiceMock).restoreAtInstall(mUserId, PACKAGE_NAME, 123); - } - - @Test - public void setBackupEnabledForUser_forwarded() throws Exception { - - mTrampoline.setBackupEnabledForUser(mUserId, true); - - verify(mBackupManagerServiceMock).setBackupEnabled(mUserId, true); - } - - @Test - public void setBackupEnabled_forwardedToCallingUserId() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.setBackupEnabled(true); - - verify(mBackupManagerServiceMock).setBackupEnabled(mUserId, true); - } - - @Test - public void setAutoRestoreForUser_forwarded() throws Exception { - - mTrampoline.setAutoRestoreForUser(mUserId, true); - - verify(mBackupManagerServiceMock).setAutoRestore(mUserId, true); - } - - @Test - public void setAutoRestore_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.setAutoRestore(true); - - verify(mBackupManagerServiceMock).setAutoRestore(mUserId, true); - } - - @Test - public void isBackupEnabledForUser_forwarded() throws Exception { - - mTrampoline.isBackupEnabledForUser(mUserId); - - verify(mBackupManagerServiceMock).isBackupEnabled(mUserId); - } - - @Test - public void isBackupEnabled_forwardedToCallingUserId() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.isBackupEnabled(); - - verify(mBackupManagerServiceMock).isBackupEnabled(mUserId); - } - - @Test - public void setBackupPassword_forwarded() throws Exception { - mTrampoline.setBackupPassword(CURRENT_PASSWORD, NEW_PASSWORD); - verify(mBackupManagerServiceMock).setBackupPassword(CURRENT_PASSWORD, NEW_PASSWORD); - } - - @Test - public void hasBackupPassword_forwarded() throws Exception { - mTrampoline.hasBackupPassword(); - verify(mBackupManagerServiceMock).hasBackupPassword(); - } - - @Test - public void backupNowForUser_forwarded() throws Exception { - - mTrampoline.backupNowForUser(mUserId); - - verify(mBackupManagerServiceMock).backupNow(mUserId); - } - - @Test - public void backupNow_forwardedToCallingUserId() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.backupNow(); - - verify(mBackupManagerServiceMock).backupNow(mUserId); - } - - @Test - public void adbBackup_forwarded() throws Exception { - mTrampoline.adbBackup(mUserId, mParcelFileDescriptorMock, true, true, - true, true, true, true, true, true, - PACKAGE_NAMES); - verify(mBackupManagerServiceMock).adbBackup(mUserId, mParcelFileDescriptorMock, true, - true, true, true, true, true, true, true, PACKAGE_NAMES); - } - - @Test - public void fullTransportBackupForUser_forwarded() throws Exception { - - mTrampoline.fullTransportBackupForUser(mUserId, PACKAGE_NAMES); - - verify(mBackupManagerServiceMock).fullTransportBackup(mUserId, PACKAGE_NAMES); - } - - @Test - public void adbRestore_forwarded() throws Exception { - mTrampoline.adbRestore(mUserId, mParcelFileDescriptorMock); - verify(mBackupManagerServiceMock).adbRestore(mUserId, mParcelFileDescriptorMock); - } - - @Test - public void acknowledgeFullBackupOrRestoreForUser_forwarded() throws Exception { - - mTrampoline.acknowledgeFullBackupOrRestoreForUser( - mUserId, - 123, - true, - CURRENT_PASSWORD, - ENCRYPTION_PASSWORD, - mFullBackupRestoreObserverMock); - - verify(mBackupManagerServiceMock) - .acknowledgeAdbBackupOrRestore( - mUserId, - 123, - true, - CURRENT_PASSWORD, - ENCRYPTION_PASSWORD, - mFullBackupRestoreObserverMock); - } - - @Test - public void acknowledgeFullBackupOrRestore_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.acknowledgeFullBackupOrRestore(123, true, CURRENT_PASSWORD, ENCRYPTION_PASSWORD, - mFullBackupRestoreObserverMock); - - verify(mBackupManagerServiceMock) - .acknowledgeAdbBackupOrRestore( - mUserId, - 123, - true, - CURRENT_PASSWORD, - ENCRYPTION_PASSWORD, - mFullBackupRestoreObserverMock); - } - - @Test - public void getCurrentTransportForUser_forwarded() throws Exception { - when(mBackupManagerServiceMock.getCurrentTransport(mUserId)).thenReturn(TRANSPORT_NAME); - - assertEquals(TRANSPORT_NAME, mTrampoline.getCurrentTransportForUser(mUserId)); - verify(mBackupManagerServiceMock).getCurrentTransport(mUserId); - } - - @Test - public void getCurrentTransport_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - when(mBackupManagerServiceMock.getCurrentTransport(mUserId)).thenReturn(TRANSPORT_NAME); - - assertEquals(TRANSPORT_NAME, mTrampoline.getCurrentTransport()); - verify(mBackupManagerServiceMock).getCurrentTransport(mUserId); - } - - @Test - public void listAllTransportsForUser_forwarded() throws Exception { - when(mBackupManagerServiceMock.listAllTransports(mUserId)).thenReturn(TRANSPORTS); - - assertEquals(TRANSPORTS, mTrampoline.listAllTransportsForUser(mUserId)); - verify(mBackupManagerServiceMock).listAllTransports(mUserId); - } - - - @Test - public void listAllTransports_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - when(mBackupManagerServiceMock.listAllTransports(mUserId)).thenReturn(TRANSPORTS); - - assertEquals(TRANSPORTS, mTrampoline.listAllTransports()); - verify(mBackupManagerServiceMock).listAllTransports(mUserId); - } - - @Test - public void listAllTransportComponentsForUser_forwarded() throws Exception { - when(mBackupManagerServiceMock.listAllTransportComponents(mUserId)).thenReturn( - TRANSPORT_COMPONENTS); - - assertEquals(TRANSPORT_COMPONENTS, mTrampoline.listAllTransportComponentsForUser(mUserId)); - verify(mBackupManagerServiceMock).listAllTransportComponents(mUserId); - } - - @Test - public void updateTransportAttributesForUser_forwarded() { - mTrampoline.updateTransportAttributesForUser( - mUserId, - TRANSPORT_COMPONENT_NAME, - TRANSPORT_NAME, - null, - "Transport Destination", - null, - "Data Management"); - - verify(mBackupManagerServiceMock) - .updateTransportAttributes( - mUserId, - TRANSPORT_COMPONENT_NAME, - TRANSPORT_NAME, - null, - "Transport Destination", - null, - "Data Management"); - } - - @Test - public void selectBackupTransportForUser_forwarded() throws Exception { - - mTrampoline.selectBackupTransportForUser(mUserId, TRANSPORT_NAME); - - verify(mBackupManagerServiceMock).selectBackupTransport(mUserId, TRANSPORT_NAME); - } - - @Test - public void selectBackupTransport_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.selectBackupTransport(TRANSPORT_NAME); - - verify(mBackupManagerServiceMock).selectBackupTransport(mUserId, TRANSPORT_NAME); - } - - @Test public void selectBackupTransportAsyncForUser_beforeUserUnlocked_notifiesBackupNotAllowed() throws Exception { mUserServices.clear(); @@ -840,184 +531,6 @@ public class TrampolineTest { } @Test - public void selectBackupTransportAsyncForUser_forwarded() throws Exception { - - mTrampoline.selectBackupTransportAsyncForUser(mUserId, TRANSPORT_COMPONENT_NAME, null); - - verify(mBackupManagerServiceMock) - .selectBackupTransportAsync(mUserId, TRANSPORT_COMPONENT_NAME, null); - } - - @Test - public void getConfigurationIntentForUser_forwarded() throws Exception { - Intent configurationIntentStub = new Intent(); - when(mBackupManagerServiceMock.getConfigurationIntent(mUserId, TRANSPORT_NAME)).thenReturn( - configurationIntentStub); - - assertEquals( - configurationIntentStub, - mTrampoline.getConfigurationIntentForUser(mUserId, TRANSPORT_NAME)); - verify(mBackupManagerServiceMock).getConfigurationIntent(mUserId, TRANSPORT_NAME); - } - - @Test - public void getConfigurationIntent_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - Intent configurationIntentStub = new Intent(); - when(mBackupManagerServiceMock.getConfigurationIntent(mUserId, TRANSPORT_NAME)).thenReturn( - configurationIntentStub); - - assertEquals(configurationIntentStub, mTrampoline.getConfigurationIntent(TRANSPORT_NAME)); - verify(mBackupManagerServiceMock).getConfigurationIntent(mUserId, TRANSPORT_NAME); - } - - @Test - public void getDestinationStringForUser_forwarded() throws Exception { - when(mBackupManagerServiceMock.getDestinationString(mUserId, TRANSPORT_NAME)).thenReturn( - DESTINATION_STRING); - - assertEquals( - DESTINATION_STRING, - mTrampoline.getDestinationStringForUser(mUserId, TRANSPORT_NAME)); - verify(mBackupManagerServiceMock).getDestinationString(mUserId, TRANSPORT_NAME); - } - - @Test - public void getDestinationString_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - when(mBackupManagerServiceMock.getDestinationString(mUserId, TRANSPORT_NAME)).thenReturn( - DESTINATION_STRING); - - assertEquals(DESTINATION_STRING, mTrampoline.getDestinationString(TRANSPORT_NAME)); - verify(mBackupManagerServiceMock).getDestinationString(mUserId, TRANSPORT_NAME); - } - - @Test - public void getDataManagementIntentForUser_forwarded() throws Exception { - Intent dataManagementIntent = new Intent(); - when(mBackupManagerServiceMock.getDataManagementIntent(mUserId, TRANSPORT_NAME)).thenReturn( - dataManagementIntent); - - assertEquals( - dataManagementIntent, - mTrampoline.getDataManagementIntentForUser(mUserId, TRANSPORT_NAME)); - verify(mBackupManagerServiceMock).getDataManagementIntent(mUserId, TRANSPORT_NAME); - } - - @Test - public void getDataManagementIntent_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - Intent dataManagementIntent = new Intent(); - when(mBackupManagerServiceMock.getDataManagementIntent(mUserId, TRANSPORT_NAME)).thenReturn( - dataManagementIntent); - - assertEquals(dataManagementIntent, mTrampoline.getDataManagementIntent(TRANSPORT_NAME)); - verify(mBackupManagerServiceMock).getDataManagementIntent(mUserId, TRANSPORT_NAME); - } - - @Test - public void getDataManagementLabelForUser_forwarded() throws Exception { - when(mBackupManagerServiceMock.getDataManagementLabel(mUserId, TRANSPORT_NAME)).thenReturn( - DATA_MANAGEMENT_LABEL); - - assertEquals( - DATA_MANAGEMENT_LABEL, - mTrampoline.getDataManagementLabelForUser(mUserId, TRANSPORT_NAME)); - verify(mBackupManagerServiceMock).getDataManagementLabel(mUserId, TRANSPORT_NAME); - } - - @Test - public void beginRestoreSessionForUser_forwarded() throws Exception { - - mTrampoline.beginRestoreSessionForUser(mUserId, PACKAGE_NAME, TRANSPORT_NAME); - - verify(mBackupManagerServiceMock) - .beginRestoreSession(mUserId, PACKAGE_NAME, TRANSPORT_NAME); - } - - @Test - public void opComplete_forwarded() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.opComplete(1, 2); - - verify(mBackupManagerServiceMock).opComplete(mUserId, 1, 2); - } - - @Test - public void getAvailableRestoreTokenForUser_forwarded() { - when(mBackupManagerServiceMock.getAvailableRestoreToken(mUserId, PACKAGE_NAME)) - .thenReturn(123L); - - assertEquals(123, mTrampoline.getAvailableRestoreTokenForUser(mUserId, PACKAGE_NAME)); - verify(mBackupManagerServiceMock).getAvailableRestoreToken(mUserId, PACKAGE_NAME); - } - - @Test - public void isAppEligibleForBackupForUser_forwarded() { - when(mBackupManagerServiceMock.isAppEligibleForBackup(mUserId, PACKAGE_NAME)) - .thenReturn(true); - - assertTrue(mTrampoline.isAppEligibleForBackupForUser(mUserId, PACKAGE_NAME)); - verify(mBackupManagerServiceMock).isAppEligibleForBackup(mUserId, PACKAGE_NAME); - } - - @Test - public void requestBackupForUser_forwarded() throws Exception { - when(mBackupManagerServiceMock.requestBackup(mUserId, PACKAGE_NAMES, - mBackupObserverMock, mBackupManagerMonitorMock, 123)).thenReturn(456); - - assertEquals(456, mTrampoline.requestBackupForUser(mUserId, PACKAGE_NAMES, - mBackupObserverMock, mBackupManagerMonitorMock, 123)); - verify(mBackupManagerServiceMock).requestBackup(mUserId, PACKAGE_NAMES, - mBackupObserverMock, mBackupManagerMonitorMock, 123); - } - - @Test - public void requestBackup_forwardedToCallingUserId() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - when(mBackupManagerServiceMock.requestBackup(mUserId, PACKAGE_NAMES, - mBackupObserverMock, mBackupManagerMonitorMock, 123)).thenReturn(456); - - assertEquals(456, mTrampoline.requestBackup(PACKAGE_NAMES, - mBackupObserverMock, mBackupManagerMonitorMock, 123)); - verify(mBackupManagerServiceMock).requestBackup(mUserId, PACKAGE_NAMES, - mBackupObserverMock, mBackupManagerMonitorMock, 123); - } - - @Test - public void cancelBackupsForUser_forwarded() throws Exception { - - mTrampoline.cancelBackupsForUser(mUserId); - - verify(mBackupManagerServiceMock).cancelBackups(mUserId); - } - - @Test - public void cancelBackups_forwardedToCallingUserId() throws Exception { - TrampolineTestable.sCallingUserId = mUserId; - - mTrampoline.cancelBackups(); - - verify(mBackupManagerServiceMock).cancelBackups(mUserId); - } - - @Test - public void beginFullBackup_forwarded() throws Exception { - FullBackupJob fullBackupJob = new FullBackupJob(); - when(mBackupManagerServiceMock.beginFullBackup(mUserId, fullBackupJob)).thenReturn(true); - - assertTrue(mTrampoline.beginFullBackup(mUserId, fullBackupJob)); - verify(mBackupManagerServiceMock).beginFullBackup(mUserId, fullBackupJob); - } - - @Test - public void endFullBackup_forwarded() { - mTrampoline.endFullBackup(mUserId); - verify(mBackupManagerServiceMock).endFullBackup(mUserId); - } - - @Test public void dump_callerDoesNotHavePermission_ignored() { when(mContextMock.checkCallingOrSelfPermission( android.Manifest.permission.DUMP)).thenReturn( @@ -1042,17 +555,21 @@ public class TrampolineTest { public void testGetUserForAncestralSerialNumber() { TrampolineTestable.sBackupDisabled = false; Trampoline trampoline = new TrampolineTestable(mContextMock, mUserServices); + when(mUserBackupManagerService.getAncestralSerialNumber()).thenReturn(11L); + + UserHandle user = trampoline.getUserForAncestralSerialNumber(11L); - trampoline.getUserForAncestralSerialNumber(0L); - verify(mBackupManagerServiceMock).getUserForAncestralSerialNumber(anyInt()); + assertThat(user).isEqualTo(UserHandle.of(1)); } public void testGetUserForAncestralSerialNumber_whenDisabled() { TrampolineTestable.sBackupDisabled = true; Trampoline trampoline = new TrampolineTestable(mContextMock, mUserServices); + when(mUserBackupManagerService.getAncestralSerialNumber()).thenReturn(11L); + + UserHandle user = trampoline.getUserForAncestralSerialNumber(11L); - trampoline.getUserForAncestralSerialNumber(0L); - verify(mBackupManagerServiceMock, never()).getUserForAncestralSerialNumber(anyInt()); + assertThat(user).isNull(); } private static class TrampolineTestable extends Trampoline { diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java index 09ae3a2628bf..ba12b7393048 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java @@ -139,7 +139,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.telephony.PhoneConstants; import com.android.internal.util.test.BroadcastInterceptingContext; import com.android.internal.util.test.BroadcastInterceptingContext.FutureIntent; -import com.android.server.DeviceIdleController; +import com.android.server.DeviceIdleInternal; import com.android.server.LocalServices; import com.google.common.util.concurrent.AbstractFuture; @@ -293,7 +293,7 @@ public class NetworkPolicyManagerServiceTest { }; private void registerLocalServices() { - addLocalServiceMock(DeviceIdleController.LocalService.class); + addLocalServiceMock(DeviceIdleInternal.class); final UsageStatsManagerInternal usageStats = addLocalServiceMock(UsageStatsManagerInternal.class); @@ -442,7 +442,7 @@ public class NetworkPolicyManagerServiceTest { // Added in registerLocalServices() LocalServices.removeServiceForTest(ActivityManagerInternal.class); LocalServices.removeServiceForTest(PowerManagerInternal.class); - LocalServices.removeServiceForTest(DeviceIdleController.LocalService.class); + LocalServices.removeServiceForTest(DeviceIdleInternal.class); LocalServices.removeServiceForTest(UsageStatsManagerInternal.class); LocalServices.removeServiceForTest(NetworkStatsManagerInternal.class); } diff --git a/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java b/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java index 75e5847abe90..819091c378b8 100644 --- a/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java @@ -19,12 +19,12 @@ package com.android.server.pm; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.AppOpsManager; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; @@ -54,10 +54,7 @@ public class AppsFilterTest { IPermissionManager mPermissionManagerMock; @Mock - AppsFilter.ConfigProvider mConfigProviderMock; - - @Mock - AppOpsManager mAppOpsManager; + AppsFilter.FeatureConfig mFeatureConfigMock; private Map<String, PackageParser.Package> mExisting = new ArrayMap<>(); @@ -108,16 +105,23 @@ public class AppsFilterTest { when(mPermissionManagerMock .checkPermission(anyString(), anyString(), anyInt())) .thenReturn(PackageManager.PERMISSION_DENIED); - when(mConfigProviderMock.isEnabled()).thenReturn(true); - when(mAppOpsManager.checkOpNoThrow(eq(AppOpsManager.OP_QUERY_ALL_PACKAGES), eq( - DUMMY_CALLING_UID), anyString())).thenReturn(AppOpsManager.MODE_DEFAULT); + when(mFeatureConfigMock.isGloballyEnabled()).thenReturn(true); + when(mFeatureConfigMock.packageIsEnabled(any(PackageParser.Package.class))) + .thenReturn(true); + } + + @Test + public void testSystemReadyPropogates() throws Exception { + final AppsFilter appsFilter = + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); + appsFilter.onSystemReady(); + verify(mFeatureConfigMock).onSystemReady(); } @Test public void testQueriesAction_FilterMatches() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, - new String[]{}, false); + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package", new IntentFilter("TEST_ACTION"))).build(); @@ -130,8 +134,7 @@ public class AppsFilterTest { @Test public void testQueriesAction_NoMatchingAction_Filters() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, - new String[]{}, false); + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -144,7 +147,7 @@ public class AppsFilterTest { @Test public void testQueriesAction_NoMatchingActionFilterLowSdk_DoesntFilter() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -158,7 +161,7 @@ public class AppsFilterTest { @Test public void testNoQueries_Filters() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -171,7 +174,7 @@ public class AppsFilterTest { @Test public void testForceQueryable_DoesntFilter() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = @@ -186,7 +189,7 @@ public class AppsFilterTest { @Test public void testForceQueryableByDevice_SystemCaller_DoesntFilter() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{"com.some.package"}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")) @@ -201,7 +204,7 @@ public class AppsFilterTest { @Test public void testForceQueryableByDevice_NonSystemCaller_Filters() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{"com.some.package"}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -215,7 +218,7 @@ public class AppsFilterTest { @Test public void testSystemQueryable_DoesntFilter() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, true /* system force queryable */); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")) @@ -230,7 +233,7 @@ public class AppsFilterTest { @Test public void testQueriesPackage_DoesntFilter() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -241,55 +244,11 @@ public class AppsFilterTest { } @Test - public void testNoQueries_AppOpModeDeny_Filters() { - when(mAppOpsManager.checkOpNoThrow(eq(AppOpsManager.OP_QUERY_ALL_PACKAGES), eq( - DUMMY_CALLING_UID), anyString())).thenReturn(AppOpsManager.MODE_ERRORED); - final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, - new String[]{}, false); - - PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); - PackageSetting calling = simulateAddPackage(appsFilter, - pkg("com.some.other.package")).build(); - - assertTrue(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); - } - - @Test - public void testNoQueries_AppOpModeAllow_DoesntFilter() { - when(mAppOpsManager.checkOpNoThrow(eq(AppOpsManager.OP_QUERY_ALL_PACKAGES), eq( - DUMMY_CALLING_UID), anyString())).thenReturn(AppOpsManager.MODE_ALLOWED); - final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, - new String[]{}, false); - - PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); - PackageSetting calling = simulateAddPackage(appsFilter, - pkg("com.some.other.package")).build(); - - assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); - } - - @Test - public void testNoQueries_AppOpModeIgnore_Filters() { - when(mAppOpsManager.checkOpNoThrow(eq(AppOpsManager.OP_QUERY_ALL_PACKAGES), eq( - DUMMY_CALLING_UID), anyString())).thenReturn(AppOpsManager.MODE_IGNORED); - final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, - new String[]{}, false); - - PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); - PackageSetting calling = simulateAddPackage(appsFilter, - pkg("com.some.other.package")).build(); - - assertTrue(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); - } - - @Test public void testNoQueries_FeatureOff_DoesntFilter() { - when(mConfigProviderMock.isEnabled()).thenReturn(false); + when(mFeatureConfigMock.packageIsEnabled(any(PackageParser.Package.class))) + .thenReturn(false); final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -302,7 +261,7 @@ public class AppsFilterTest { @Test public void testSystemUid_DoesntFilter() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -315,7 +274,7 @@ public class AppsFilterTest { @Test public void testNonSystemUid_NoCallingSetting_Filters() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package")).build(); @@ -326,7 +285,7 @@ public class AppsFilterTest { @Test public void testNoTargetPackage_filters() { final AppsFilter appsFilter = - new AppsFilter(mConfigProviderMock, mPermissionManagerMock, mAppOpsManager, + new AppsFilter(mFeatureConfigMock, mPermissionManagerMock, new String[]{}, false); PackageSetting target = new PackageSettingBuilder() diff --git a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java index 798605568138..8cb5197f2601 100644 --- a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java @@ -16,6 +16,7 @@ package com.android.server.rollback; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; @@ -58,8 +59,8 @@ public class AppDataRollbackHelperTest { // All users are unlocked so we should snapshot data for them. doReturn(true).when(helper).isUserCredentialLocked(eq(10)); doReturn(true).when(helper).isUserCredentialLocked(eq(11)); - PackageRollbackInfo info = createPackageRollbackInfo("com.foo.bar", new int[]{10, 11}); - helper.snapshotAppData(5, info); + PackageRollbackInfo info = createPackageRollbackInfo("com.foo.bar"); + helper.snapshotAppData(5, info, new int[]{10, 11}); assertEquals(2, info.getPendingBackups().size()); assertEquals(10, info.getPendingBackups().get(0)); @@ -79,8 +80,8 @@ public class AppDataRollbackHelperTest { doReturn(true).when(helper).isUserCredentialLocked(eq(11)); when(installer.snapshotAppData(anyString(), anyInt(), anyInt(), anyInt())).thenReturn(239L); - PackageRollbackInfo info2 = createPackageRollbackInfo("com.foo.bar", new int[]{10, 11}); - helper.snapshotAppData(7, info2); + PackageRollbackInfo info2 = createPackageRollbackInfo("com.foo.bar"); + helper.snapshotAppData(7, info2, new int[]{10, 11}); assertEquals(1, info2.getPendingBackups().size()); assertEquals(11, info2.getPendingBackups().get(0)); @@ -234,22 +235,22 @@ public class AppDataRollbackHelperTest { wasRecentlyRestored.getPendingRestores().add( new RestoreInfo(73 /* userId */, 239 /* appId*/, "seInfo")); - RollbackData dataWithPendingBackup = new RollbackData(101, new File("/does/not/exist"), -1); + Rollback dataWithPendingBackup = new Rollback(101, new File("/does/not/exist"), -1); dataWithPendingBackup.info.getPackages().add(pendingBackup); - RollbackData dataWithRecentRestore = new RollbackData(17239, new File("/does/not/exist"), + Rollback dataWithRecentRestore = new Rollback(17239, new File("/does/not/exist"), -1); dataWithRecentRestore.info.getPackages().add(wasRecentlyRestored); - RollbackData dataForDifferentUser = new RollbackData(17239, new File("/does/not/exist"), + Rollback dataForDifferentUser = new Rollback(17239, new File("/does/not/exist"), -1); dataForDifferentUser.info.getPackages().add(ignoredInfo); - RollbackData dataForRestore = new RollbackData(17239, new File("/does/not/exist"), -1); + Rollback dataForRestore = new Rollback(17239, new File("/does/not/exist"), -1); dataForRestore.info.getPackages().add(pendingRestore); dataForRestore.info.getPackages().add(wasRecentlyRestored); - Set<RollbackData> changed = helper.commitPendingBackupAndRestoreForUser(37, + Set<Rollback> changed = helper.commitPendingBackupAndRestoreForUser(37, Arrays.asList(dataWithPendingBackup, dataWithRecentRestore, dataForDifferentUser, dataForRestore)); InOrder inOrder = Mockito.inOrder(installer); @@ -264,7 +265,7 @@ public class AppDataRollbackHelperTest { assertEquals(-1, pendingBackup.getPendingBackups().indexOf(37)); assertEquals(53, pendingBackup.getCeSnapshotInodes().get(37)); - // Check that changed returns correct RollbackData. + // Check that changed returns correct Rollback. assertEquals(3, changed.size()); assertTrue(changed.contains(dataWithPendingBackup)); assertTrue(changed.contains(dataWithRecentRestore)); @@ -278,4 +279,15 @@ public class AppDataRollbackHelperTest { inOrder.verifyNoMoreInteractions(); } + + @Test + public void snapshotAddDataSavesSnapshottedUsersToInfo() { + Installer installer = mock(Installer.class); + AppDataRollbackHelper helper = new AppDataRollbackHelper(installer); + + PackageRollbackInfo info = createPackageRollbackInfo("com.foo.bar"); + helper.snapshotAppData(5, info, new int[]{10, 11}); + + assertArrayEquals(info.getSnapshottedUsers().toArray(), new int[]{10, 11}); + } } diff --git a/telephony/java/android/telephony/data/DataServiceCallback.java b/telephony/java/android/telephony/data/DataServiceCallback.java index 5d8d79367ba4..89d30c0d4373 100644 --- a/telephony/java/android/telephony/data/DataServiceCallback.java +++ b/telephony/java/android/telephony/data/DataServiceCallback.java @@ -42,6 +42,8 @@ public class DataServiceCallback { private static final String TAG = DataServiceCallback.class.getSimpleName(); + private static final boolean DBG = true; + /** * Result of data requests * @hide @@ -81,6 +83,7 @@ public class DataServiceCallback { IDataServiceCallback callback = mCallback.get(); if (callback != null) { try { + if (DBG) Rlog.d(TAG, "onSetupDataCallComplete"); callback.onSetupDataCallComplete(result, response); } catch (RemoteException e) { Rlog.e(TAG, "Failed to onSetupDataCallComplete on the remote"); @@ -98,6 +101,7 @@ public class DataServiceCallback { IDataServiceCallback callback = mCallback.get(); if (callback != null) { try { + if (DBG) Rlog.d(TAG, "onDeactivateDataCallComplete"); callback.onDeactivateDataCallComplete(result); } catch (RemoteException e) { Rlog.e(TAG, "Failed to onDeactivateDataCallComplete on the remote"); @@ -169,6 +173,7 @@ public class DataServiceCallback { IDataServiceCallback callback = mCallback.get(); if (callback != null) { try { + if (DBG) Rlog.d(TAG, "onDataCallListChanged"); callback.onDataCallListChanged(dataCallList); } catch (RemoteException e) { Rlog.e(TAG, "Failed to onDataCallListChanged on the remote"); diff --git a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java index e9a177defd26..4e1ff8f5b7cd 100644 --- a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java +++ b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java @@ -32,9 +32,11 @@ import android.os.UserHandle; import android.os.UserManager; import android.provider.ContactsContract.PhoneLookup; import android.telephony.PhoneNumberUtils; -import android.text.TextUtils; import android.telephony.Rlog; import android.telephony.SubscriptionManager; +import android.text.TextUtils; + +import dalvik.annotation.compat.UnsupportedAppUsage; import java.util.ArrayList; import java.util.List; @@ -80,6 +82,10 @@ public class CallerInfoAsyncQuery { * classes. */ private static final class CookieWrapper { + @UnsupportedAppUsage + private CookieWrapper() { + } + public OnQueryCompleteListener listener; public Object cookie; public int event; @@ -527,6 +533,7 @@ public class CallerInfoAsyncQuery { /** * Releases the relevant data. */ + @UnsupportedAppUsage private void release() { mHandler.mContext = null; mHandler.mQueryUri = null; diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java index cde6db4888fa..e1113eba006f 100644 --- a/telephony/java/com/android/internal/telephony/DctConstants.java +++ b/telephony/java/com/android/internal/telephony/DctConstants.java @@ -17,6 +17,8 @@ package com.android.internal.telephony; import com.android.internal.util.Protocol; +import dalvik.annotation.compat.UnsupportedAppUsage; + /** * @hide */ @@ -37,20 +39,34 @@ public class DctConstants { * RETRYING or CONNECTING: CONNECTING * CONNECTED : CONNECTED or DISCONNECTING */ + @UnsupportedAppUsage(implicitMember = + "values()[Lcom/android/internal/telephony/DctConstants$State;") public enum State { + @UnsupportedAppUsage IDLE, + @UnsupportedAppUsage CONNECTING, + @UnsupportedAppUsage RETRYING, + @UnsupportedAppUsage CONNECTED, + @UnsupportedAppUsage DISCONNECTING, + @UnsupportedAppUsage FAILED, } + @UnsupportedAppUsage(implicitMember = + "values()[Lcom/android/internal/telephony/DctConstants$Activity;") public enum Activity { NONE, + @UnsupportedAppUsage DATAIN, + @UnsupportedAppUsage DATAOUT, + @UnsupportedAppUsage DATAINANDOUT, + @UnsupportedAppUsage DORMANT } diff --git a/telephony/java/com/android/internal/telephony/GsmAlphabet.java b/telephony/java/com/android/internal/telephony/GsmAlphabet.java index a75096f2c082..5fb4e90b9666 100644 --- a/telephony/java/com/android/internal/telephony/GsmAlphabet.java +++ b/telephony/java/com/android/internal/telephony/GsmAlphabet.java @@ -16,19 +16,17 @@ package com.android.internal.telephony; +import android.annotation.UnsupportedAppUsage; import android.content.res.Resources; +import android.os.Build; +import android.telephony.Rlog; import android.text.TextUtils; import android.util.SparseIntArray; -import android.annotation.UnsupportedAppUsage; -import android.os.Build; -import android.telephony.Rlog; +import com.android.internal.R; import java.nio.ByteBuffer; import java.nio.charset.Charset; -import com.android.internal.telephony.SmsConstants; -import com.android.internal.R; - import java.util.ArrayList; import java.util.List; @@ -83,6 +81,11 @@ public class GsmAlphabet { * data. */ public static class TextEncodingDetails { + + @UnsupportedAppUsage + public TextEncodingDetails() { + } + /** *The number of SMS's required to encode the text. */ diff --git a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl index 5b509b7260ba..15e7fc26ed47 100644 --- a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl +++ b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl @@ -27,6 +27,7 @@ interface IPhoneSubInfo { /** * Retrieves the unique device ID, e.g., IMEI for GSM phones. */ + @UnsupportedAppUsage String getDeviceId(String callingPackage); /** diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index a65acac737d9..9f1a2f765eee 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -94,6 +94,7 @@ interface ITelephony { * @param callingPackage the name of the package making the call. * @return returns true if the radio is on. */ + @UnsupportedAppUsage boolean isRadioOn(String callingPackage); /** @@ -1254,6 +1255,7 @@ interface ITelephony { * <p>Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} */ + @UnsupportedAppUsage String getDeviceId(String callingPackage); /** diff --git a/telephony/java/com/android/internal/telephony/IccCardConstants.java b/telephony/java/com/android/internal/telephony/IccCardConstants.java index d57f9afa01e9..6ff27b1152c8 100644 --- a/telephony/java/com/android/internal/telephony/IccCardConstants.java +++ b/telephony/java/com/android/internal/telephony/IccCardConstants.java @@ -17,6 +17,8 @@ package com.android.internal.telephony; import android.telephony.TelephonyManager; +import dalvik.annotation.compat.UnsupportedAppUsage; + /** * {@hide} */ @@ -65,15 +67,26 @@ public class IccCardConstants { * * The ordinal values much match {@link TelephonyManager#SIM_STATE_UNKNOWN} ... */ + @UnsupportedAppUsage(implicitMember = + "values()[Lcom/android/internal/telephony/IccCardConstants$State;") public enum State { + @UnsupportedAppUsage UNKNOWN, /** ordinal(0) == {@See TelephonyManager#SIM_STATE_UNKNOWN} */ + @UnsupportedAppUsage ABSENT, /** ordinal(1) == {@See TelephonyManager#SIM_STATE_ABSENT} */ + @UnsupportedAppUsage PIN_REQUIRED, /** ordinal(2) == {@See TelephonyManager#SIM_STATE_PIN_REQUIRED} */ + @UnsupportedAppUsage PUK_REQUIRED, /** ordinal(3) == {@See TelephonyManager#SIM_STATE_PUK_REQUIRED} */ + @UnsupportedAppUsage NETWORK_LOCKED, /** ordinal(4) == {@See TelephonyManager#SIM_STATE_NETWORK_LOCKED} */ + @UnsupportedAppUsage READY, /** ordinal(5) == {@See TelephonyManager#SIM_STATE_READY} */ + @UnsupportedAppUsage NOT_READY, /** ordinal(6) == {@See TelephonyManager#SIM_STATE_NOT_READY} */ + @UnsupportedAppUsage PERM_DISABLED, /** ordinal(7) == {@See TelephonyManager#SIM_STATE_PERM_DISABLED} */ + @UnsupportedAppUsage CARD_IO_ERROR, /** ordinal(8) == {@See TelephonyManager#SIM_STATE_CARD_IO_ERROR} */ CARD_RESTRICTED,/** ordinal(9) == {@See TelephonyManager#SIM_STATE_CARD_RESTRICTED} */ LOADED; /** ordinal(9) == {@See TelephonyManager#SIM_STATE_LOADED} */ diff --git a/telephony/java/com/android/internal/telephony/PhoneConstants.java b/telephony/java/com/android/internal/telephony/PhoneConstants.java index d5061a32ba6d..ee1a4766bf68 100644 --- a/telephony/java/com/android/internal/telephony/PhoneConstants.java +++ b/telephony/java/com/android/internal/telephony/PhoneConstants.java @@ -15,6 +15,8 @@ */ package com.android.internal.telephony; +import dalvik.annotation.compat.UnsupportedAppUsage; + /** * @hide */ @@ -31,8 +33,12 @@ public class PhoneConstants { * ringing or waiting.</li> * </ul> */ + @UnsupportedAppUsage(implicitMember = + "values()[Lcom/android/internal/telephony/PhoneConstants$State;") public enum State { - IDLE, RINGING, OFFHOOK; + @UnsupportedAppUsage IDLE, + @UnsupportedAppUsage RINGING, + @UnsupportedAppUsage OFFHOOK; }; /** @@ -46,8 +52,13 @@ public class PhoneConstants { * in 2G network</li> * </ul> */ + @UnsupportedAppUsage(implicitMember = + "values()[Lcom/android/internal/telephony/PhoneConstants$DataState;") public enum DataState { - CONNECTED, CONNECTING, DISCONNECTED, SUSPENDED; + @UnsupportedAppUsage CONNECTED, + @UnsupportedAppUsage CONNECTING, + @UnsupportedAppUsage DISCONNECTED, + @UnsupportedAppUsage SUSPENDED; }; public static final String STATE_KEY = "state"; @@ -69,9 +80,13 @@ public class PhoneConstants { public static final int LTE_ON_CDMA_TRUE = RILConstants.LTE_ON_CDMA_TRUE; // Number presentation type for caller id display (From internal/Connection.java) + @UnsupportedAppUsage public static final int PRESENTATION_ALLOWED = 1; // normal + @UnsupportedAppUsage public static final int PRESENTATION_RESTRICTED = 2; // block by user + @UnsupportedAppUsage public static final int PRESENTATION_UNKNOWN = 3; // no specified or unknown by network + @UnsupportedAppUsage public static final int PRESENTATION_PAYPHONE = 4; // show pay phone info // Sim activation type diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java index 5205973669ac..03ea9208d064 100644 --- a/telephony/java/com/android/internal/telephony/RILConstants.java +++ b/telephony/java/com/android/internal/telephony/RILConstants.java @@ -18,6 +18,8 @@ package com.android.internal.telephony; import android.telephony.TelephonyManager; +import dalvik.annotation.compat.UnsupportedAppUsage; + /** * {@hide} */ @@ -230,6 +232,7 @@ public interface RILConstants { /** NR 5G, LTE, TD-SCDMA, CDMA, EVDO, GSM and WCDMA */ int NETWORK_MODE_NR_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 33; + @UnsupportedAppUsage int PREFERRED_NETWORK_MODE = Integer.parseInt(TelephonyManager.getTelephonyProperty(0, "ro.telephony.default_network", Integer.toString(NETWORK_MODE_WCDMA_PREF))); diff --git a/telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java b/telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java index 49c737fc3440..2cdf2f63e02f 100644 --- a/telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java +++ b/telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java @@ -16,27 +16,28 @@ package com.android.internal.telephony; -import android.telephony.Rlog; -import android.os.Build; -import android.util.SparseIntArray; import android.content.res.Resources; import android.content.res.XmlResourceParser; -import android.telephony.SmsManager; -import android.telephony.TelephonyManager; +import android.os.Build; +import android.telephony.Rlog; +import android.util.SparseIntArray; -import com.android.internal.util.XmlUtils; import com.android.internal.telephony.cdma.sms.UserData; +import com.android.internal.util.XmlUtils; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; +import dalvik.annotation.compat.UnsupportedAppUsage; public class Sms7BitEncodingTranslator { private static final String TAG = "Sms7BitEncodingTranslator"; + @UnsupportedAppUsage private static final boolean DBG = Build.IS_DEBUGGABLE ; private static boolean mIs7BitTranslationTableLoaded = false; private static SparseIntArray mTranslationTable = null; + @UnsupportedAppUsage private static SparseIntArray mTranslationTableCommon = null; + @UnsupportedAppUsage private static SparseIntArray mTranslationTableGSM = null; + @UnsupportedAppUsage private static SparseIntArray mTranslationTableCDMA = null; // Parser variables diff --git a/telephony/java/com/android/internal/telephony/SmsApplication.java b/telephony/java/com/android/internal/telephony/SmsApplication.java index 62d3536763d6..f10398f09603 100644 --- a/telephony/java/com/android/internal/telephony/SmsApplication.java +++ b/telephony/java/com/android/internal/telephony/SmsApplication.java @@ -48,6 +48,8 @@ import com.android.internal.content.PackageMonitor; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import dalvik.annotation.compat.UnsupportedAppUsage; + import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -91,6 +93,7 @@ public final class SmsApplication { /** * Name of this SMS app for display. */ + @UnsupportedAppUsage private String mApplicationName; /** @@ -191,7 +194,7 @@ public final class SmsApplication { * @return */ private static int getIncomingUserId(Context context) { - int contextUserId = context.getUserId(); + int contextUserId = UserHandle.myUserId(); final int callingUid = Binder.getCallingUid(); if (DEBUG_MULTIUSER) { Log.i(LOG_TAG, "getIncomingUserHandle caller=" + callingUid + ", myuid=" @@ -224,6 +227,7 @@ public final class SmsApplication { * Implement ACTION_SENDTO intent. * Support smsto Uri scheme. */ + @UnsupportedAppUsage public static Collection<SmsApplicationData> getApplicationCollection(Context context) { return getApplicationCollectionAsUser(context, getIncomingUserId(context)); } @@ -425,9 +429,6 @@ public final class SmsApplication { final SmsApplicationData smsApplicationData = receivers.get(packageName); if (smsApplicationData != null) { if (!smsApplicationData.isComplete()) { - Log.w(LOG_TAG, "Package " + packageName - + " lacks required manifest declarations to be a default sms app: " - + smsApplicationData); receivers.remove(packageName); } } @@ -579,6 +580,7 @@ public final class SmsApplication { * Sets the specified package as the default SMS/MMS application. The caller of this method * needs to have permission to set AppOps and write to secure settings. */ + @UnsupportedAppUsage public static void setDefaultApplication(String packageName, Context context) { setDefaultApplicationAsUser(packageName, context, getIncomingUserId(context)); } @@ -826,6 +828,7 @@ public final class SmsApplication { sSmsPackageMonitor.register(context, context.getMainLooper(), UserHandle.ALL, false); } + @UnsupportedAppUsage private static void configurePreferredActivity(PackageManager packageManager, ComponentName componentName, int userId) { // Add the four activity preferences we want to direct to this app. @@ -868,6 +871,7 @@ public final class SmsApplication { * Returns SmsApplicationData for this package if this package is capable of being set as the * default SMS application. */ + @UnsupportedAppUsage public static SmsApplicationData getSmsApplicationData(String packageName, Context context) { Collection<SmsApplicationData> applications = getApplicationCollection(context); return getApplicationForPackage(applications, packageName); @@ -879,6 +883,7 @@ public final class SmsApplication { * @param updateIfNeeded update the default app if there is no valid default app configured. * @return component name of the app and class to deliver SMS messages to */ + @UnsupportedAppUsage public static ComponentName getDefaultSmsApplication(Context context, boolean updateIfNeeded) { return getDefaultSmsApplicationAsUser(context, updateIfNeeded, getIncomingUserId(context)); } @@ -913,6 +918,7 @@ public final class SmsApplication { * @param updateIfNeeded update the default app if there is no valid default app configured. * @return component name of the app and class to deliver MMS messages to */ + @UnsupportedAppUsage public static ComponentName getDefaultMmsApplication(Context context, boolean updateIfNeeded) { int userId = getIncomingUserId(context); final long token = Binder.clearCallingIdentity(); @@ -936,6 +942,7 @@ public final class SmsApplication { * @param updateIfNeeded update the default app if there is no valid default app configured. * @return component name of the app and class to direct Respond Via Message intent to */ + @UnsupportedAppUsage public static ComponentName getDefaultRespondViaMessageApplication(Context context, boolean updateIfNeeded) { int userId = getIncomingUserId(context); @@ -1036,6 +1043,7 @@ public final class SmsApplication { * <p> * Caller must pass in the correct user context if calling from a singleton service. */ + @UnsupportedAppUsage public static boolean shouldWriteMessageForPackage(String packageName, Context context) { if (SmsManager.getDefault().getAutoPersisting()) { return true; @@ -1050,6 +1058,7 @@ public final class SmsApplication { * @param packageName the name of the package to be checked * @return true if the package is default sms app or bluetooth */ + @UnsupportedAppUsage public static boolean isDefaultSmsApplication(Context context, String packageName) { if (packageName == null) { return false; diff --git a/telephony/java/com/android/internal/telephony/SmsHeader.java b/telephony/java/com/android/internal/telephony/SmsHeader.java index 9fe1718df6b6..dd77b0179487 100644 --- a/telephony/java/com/android/internal/telephony/SmsHeader.java +++ b/telephony/java/com/android/internal/telephony/SmsHeader.java @@ -16,13 +16,12 @@ package com.android.internal.telephony; -import com.android.internal.telephony.SmsConstants; +import android.annotation.UnsupportedAppUsage; + import com.android.internal.util.HexDump; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; - -import android.annotation.UnsupportedAppUsage; import java.util.ArrayList; /** @@ -74,6 +73,10 @@ public class SmsHeader { public static class PortAddrs { @UnsupportedAppUsage + public PortAddrs() { + } + + @UnsupportedAppUsage public int destPort; @UnsupportedAppUsage public int origPort; @@ -82,6 +85,10 @@ public class SmsHeader { public static class ConcatRef { @UnsupportedAppUsage + public ConcatRef() { + } + + @UnsupportedAppUsage public int refNumber; @UnsupportedAppUsage public int seqNumber; diff --git a/telephony/java/com/android/internal/telephony/SmsMessageBase.java b/telephony/java/com/android/internal/telephony/SmsMessageBase.java index ffdc4b676f90..f0687b4ae7be 100644 --- a/telephony/java/com/android/internal/telephony/SmsMessageBase.java +++ b/telephony/java/com/android/internal/telephony/SmsMessageBase.java @@ -16,18 +16,17 @@ package com.android.internal.telephony; -import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; -import com.android.internal.telephony.SmsConstants; -import com.android.internal.telephony.SmsHeader; -import java.text.BreakIterator; -import java.util.Arrays; - import android.annotation.UnsupportedAppUsage; import android.os.Build; import android.provider.Telephony; import android.telephony.SmsMessage; import android.text.Emoji; +import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; + +import java.text.BreakIterator; +import java.util.Arrays; + /** * Base class declaring the specific methods and members for SmsMessage. * {@hide} @@ -102,6 +101,10 @@ public abstract class SmsMessageBase { @UnsupportedAppUsage public int mMessageRef; + @UnsupportedAppUsage + public SmsMessageBase() { + } + // TODO(): This class is duplicated in SmsMessage.java. Refactor accordingly. public static abstract class SubmitPduBase { @UnsupportedAppUsage diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java index dd9b2421a333..ef4850716701 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java +++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java @@ -16,6 +16,8 @@ package com.android.internal.telephony; +import dalvik.annotation.compat.UnsupportedAppUsage; + /** * Contains a list of string constants used to get or set telephone properties * in the system. You can use {@link android.os.SystemProperties os.SystemProperties} @@ -101,6 +103,7 @@ public interface TelephonyProperties * provider of the SIM. 5 or 6 decimal digits. * Availability: SIM state must be "READY" */ + @UnsupportedAppUsage static String PROPERTY_ICC_OPERATOR_NUMERIC = "gsm.sim.operator.numeric"; /** PROPERTY_ICC_OPERATOR_ALPHA is also known as the SPN, or Service Provider Name. diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java index e2a8913b91e6..6b3126dd8f1c 100644 --- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java @@ -19,17 +19,17 @@ package com.android.internal.telephony.cdma; import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_IDP_STRING; import android.content.res.Resources; -import android.os.Parcel; import android.os.SystemProperties; import android.telephony.PhoneNumberUtils; +import android.telephony.Rlog; import android.telephony.SmsCbLocation; import android.telephony.SmsCbMessage; import android.telephony.cdma.CdmaSmsCbProgramData; -import android.telephony.Rlog; import android.text.TextUtils; import android.util.Log; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; +import com.android.internal.telephony.Sms7BitEncodingTranslator; import com.android.internal.telephony.SmsAddress; import com.android.internal.telephony.SmsConstants; import com.android.internal.telephony.SmsHeader; @@ -43,7 +43,8 @@ import com.android.internal.telephony.cdma.sms.UserData; import com.android.internal.telephony.uicc.IccUtils; import com.android.internal.util.BitwiseInputStream; import com.android.internal.util.HexDump; -import com.android.internal.telephony.Sms7BitEncodingTranslator; + +import dalvik.annotation.compat.UnsupportedAppUsage; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; @@ -109,7 +110,9 @@ public class SmsMessage extends SmsMessageBase { private static final int PRIORITY_URGENT = 0x2; private static final int PRIORITY_EMERGENCY = 0x3; + @UnsupportedAppUsage private SmsEnvelope mEnvelope; + @UnsupportedAppUsage private BearerData mBearerData; /** @hide */ @@ -119,15 +122,20 @@ public class SmsMessage extends SmsMessageBase { createPdu(); } + @UnsupportedAppUsage public SmsMessage() {} public static class SubmitPdu extends SubmitPduBase { + @UnsupportedAppUsage + public SubmitPdu() { + } } /** * Create an SmsMessage from a raw PDU. * Note: In CDMA the PDU is just a byte representation of the received Sms. */ + @UnsupportedAppUsage public static SmsMessage createFromPdu(byte[] pdu) { SmsMessage msg = new SmsMessage(); @@ -153,6 +161,7 @@ public class SmsMessage extends SmsMessageBase { * * @hide */ + @UnsupportedAppUsage public static SmsMessage createFromEfRecord(int index, byte[] data) { try { SmsMessage msg = new SmsMessage(); @@ -219,6 +228,7 @@ public class SmsMessage extends SmsMessageBase { * Returns null on encode error. * @hide */ + @UnsupportedAppUsage public static SubmitPdu getSubmitPdu(String scAddr, String destAddr, String message, boolean statusReportRequested, SmsHeader smsHeader) { return getSubmitPdu(scAddr, destAddr, message, statusReportRequested, smsHeader, -1); @@ -239,6 +249,7 @@ public class SmsMessage extends SmsMessageBase { * Returns null on encode error. * @hide */ + @UnsupportedAppUsage public static SubmitPdu getSubmitPdu(String scAddr, String destAddr, String message, boolean statusReportRequested, SmsHeader smsHeader, int priority) { @@ -269,6 +280,7 @@ public class SmsMessage extends SmsMessageBase { * address, if applicable, and the encoded message. * Returns null on encode error. */ + @UnsupportedAppUsage public static SubmitPdu getSubmitPdu(String scAddr, String destAddr, int destPort, byte[] data, boolean statusReportRequested) { @@ -306,6 +318,7 @@ public class SmsMessage extends SmsMessageBase { * address, if applicable, and the encoded message. * Returns null on encode error. */ + @UnsupportedAppUsage public static SubmitPdu getSubmitPdu(String destAddr, UserData userData, boolean statusReportRequested) { return privateGetSubmitPdu(destAddr, statusReportRequested, userData); @@ -322,6 +335,7 @@ public class SmsMessage extends SmsMessageBase { * address, if applicable, and the encoded message. * Returns null on encode error. */ + @UnsupportedAppUsage public static SubmitPdu getSubmitPdu(String destAddr, UserData userData, boolean statusReportRequested, int priority) { return privateGetSubmitPdu(destAddr, statusReportRequested, userData, priority); @@ -393,6 +407,7 @@ public class SmsMessage extends SmsMessageBase { } /** Return true iff the bearer data message type is DELIVERY_ACK. */ + @UnsupportedAppUsage @Override public boolean isStatusReportMessage() { return (mBearerData.messageType == BearerData.MESSAGE_TYPE_DELIVERY_ACK); @@ -415,6 +430,7 @@ public class SmsMessage extends SmsMessageBase { * @param isEntireMsg indicates if this is entire msg or a segment in multipart msg * @return TextEncodingDetails */ + @UnsupportedAppUsage public static TextEncodingDetails calculateLength(CharSequence messageBody, boolean use7bitOnly, boolean isEntireMsg) { CharSequence newMsgBody = null; @@ -437,6 +453,7 @@ public class SmsMessage extends SmsMessageBase { * {@link com.android.internal.telephony.cdma.sms.SmsEnvelope#TELESERVICE_VMN}, * {@link com.android.internal.telephony.cdma.sms.SmsEnvelope#TELESERVICE_WAP} */ + @UnsupportedAppUsage public int getTeleService() { return mEnvelope.teleService; } @@ -448,6 +465,7 @@ public class SmsMessage extends SmsMessageBase { * {@link com.android.internal.telephony.cdma.sms.SmsEnvelope#MESSAGE_TYPE_BROADCAST}, * {@link com.android.internal.telephony.cdma.sms.SmsEnvelope#MESSAGE_TYPE_ACKNOWLEDGE}, */ + @UnsupportedAppUsage public int getMessageType() { // NOTE: mEnvelope.messageType is not set correctly for cell broadcasts with some RILs. // Use the service category parameter to detect CMAS and other cell broadcast messages. @@ -680,6 +698,7 @@ public class SmsMessage extends SmsMessageBase { /** * Parses a SMS message from its BearerData stream. */ + @UnsupportedAppUsage public void parseSms() { // Message Waiting Info Record defined in 3GPP2 C.S-0005, 3.7.5.6 // It contains only an 8-bit number with the number of messages waiting @@ -816,6 +835,7 @@ public class SmsMessage extends SmsMessageBase { * binder-call, and hence should be thread-safe, it has been * synchronized. */ + @UnsupportedAppUsage public synchronized static int getNextMessageId() { // Testing and dialog with partners has indicated that // msgId==0 is (sometimes?) treated specially by lower levels. @@ -840,6 +860,7 @@ public class SmsMessage extends SmsMessageBase { * Creates BearerData and Envelope from parameters for a Submit SMS. * @return byte stream for SubmitPdu. */ + @UnsupportedAppUsage private static SubmitPdu privateGetSubmitPdu(String destAddrStr, boolean statusReportRequested, UserData userData) { return privateGetSubmitPdu(destAddrStr, statusReportRequested, userData, -1); @@ -1025,6 +1046,7 @@ public class SmsMessage extends SmsMessageBase { /** This function shall be called to get the number of voicemails. * @hide */ + @UnsupportedAppUsage public int getNumOfVoicemails() { return mBearerData.numberOfMessages; } @@ -1036,6 +1058,7 @@ public class SmsMessage extends SmsMessageBase { * @return byte array uniquely identifying the message. * @hide */ + @UnsupportedAppUsage public byte[] getIncomingSmsFingerprint() { ByteArrayOutputStream output = new ByteArrayOutputStream(); diff --git a/telephony/java/com/android/internal/telephony/cdma/UserData.java b/telephony/java/com/android/internal/telephony/cdma/UserData.java index f87956098e5c..7187ae4f990c 100644 --- a/telephony/java/com/android/internal/telephony/cdma/UserData.java +++ b/telephony/java/com/android/internal/telephony/cdma/UserData.java @@ -21,6 +21,8 @@ import android.util.SparseIntArray; import com.android.internal.telephony.SmsHeader; import com.android.internal.util.HexDump; +import dalvik.annotation.compat.UnsupportedAppUsage; + public class UserData { /** @@ -92,6 +94,7 @@ public class UserData { public static final int PRINTABLE_ASCII_MIN_INDEX = 0x20; public static final int ASCII_NL_INDEX = 0x0A; public static final int ASCII_CR_INDEX = 0x0D; + @UnsupportedAppUsage public static final SparseIntArray charToAscii = new SparseIntArray(); static { for (int i = 0; i < ASCII_MAP.length; i++) { @@ -101,6 +104,10 @@ public class UserData { charToAscii.put('\r', ASCII_CR_INDEX); } + @UnsupportedAppUsage + public UserData() { + } + /* * TODO(cleanup): Move this very generic functionality somewhere * more general. @@ -131,12 +138,15 @@ public class UserData { /** * Contains the data header of the user data */ + @UnsupportedAppUsage public SmsHeader userDataHeader; /** * Contains the data encoding type for the SMS message */ + @UnsupportedAppUsage public int msgEncoding; + @UnsupportedAppUsage public boolean msgEncodingSet = false; public int msgType; @@ -146,13 +156,16 @@ public class UserData { */ public int paddingBits; + @UnsupportedAppUsage public int numFields; /** * Contains the user data of a SMS message * (See 3GPP2 C.S0015-B, v2, 4.5.2) */ + @UnsupportedAppUsage public byte[] payload; + @UnsupportedAppUsage public String payloadStr; @Override diff --git a/telephony/java/com/android/internal/telephony/cdma/BearerData.java b/telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java index 9e6f19f9243d..2181bc425a78 100644 --- a/telephony/java/com/android/internal/telephony/cdma/BearerData.java +++ b/telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java @@ -17,10 +17,10 @@ package com.android.internal.telephony.cdma.sms; import android.content.res.Resources; +import android.telephony.Rlog; import android.telephony.SmsCbCmasInfo; import android.telephony.cdma.CdmaSmsCbProgramData; import android.telephony.cdma.CdmaSmsCbProgramResults; -import android.telephony.Rlog; import com.android.internal.telephony.GsmAlphabet; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; @@ -31,6 +31,8 @@ import com.android.internal.telephony.uicc.IccUtils; import com.android.internal.util.BitwiseInputStream; import com.android.internal.util.BitwiseOutputStream; +import dalvik.annotation.compat.UnsupportedAppUsage; + import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; @@ -95,6 +97,7 @@ public final class BearerData { * (Special rules apply for WAP-messages.) * (See 3GPP2 C.S0015-B, v2, 4.5.1) */ + @UnsupportedAppUsage public int messageId; /** @@ -106,7 +109,9 @@ public final class BearerData { public static final int PRIORITY_URGENT = 0x2; public static final int PRIORITY_EMERGENCY = 0x3; + @UnsupportedAppUsage public boolean priorityIndicatorSet = false; + @UnsupportedAppUsage public int priority = PRIORITY_NORMAL; /** @@ -144,6 +149,7 @@ public final class BearerData { public static final int DISPLAY_MODE_USER = 0x2; public boolean displayModeSet = false; + @UnsupportedAppUsage public int displayMode = DISPLAY_MODE_DEFAULT; /** @@ -207,6 +213,7 @@ public final class BearerData { * presence of a UDH in the structured data, any existing setting * will be overwritten. */ + @UnsupportedAppUsage public boolean hasUserDataHeader; /** @@ -214,6 +221,7 @@ public final class BearerData { * (e.g. padding bits, user data, user data header, etc) * (See 3GPP2 C.S.0015-B, v2, 4.5.2) */ + @UnsupportedAppUsage public UserData userData; /** @@ -226,6 +234,10 @@ public final class BearerData { public boolean userResponseCodeSet = false; public int userResponseCode; + @UnsupportedAppUsage + public BearerData() { + } + /** * 6-byte-field, see 3GPP2 C.S0015-B, v2, 4.5.4 */ @@ -244,6 +256,7 @@ public final class BearerData { private ZoneId mZoneId; + @UnsupportedAppUsage public TimeStamp() { mZoneId = ZoneId.systemDefault(); // 3GPP2 timestamps use the local timezone } @@ -295,6 +308,7 @@ public final class BearerData { } } + @UnsupportedAppUsage public TimeStamp msgCenterTimeStamp; public TimeStamp validityPeriodAbsolute; public TimeStamp deferredDeliveryTimeAbsolute; @@ -383,6 +397,7 @@ public final class BearerData { private static class CodingException extends Exception { + @UnsupportedAppUsage public CodingException(String s) { super(s); } @@ -476,6 +491,7 @@ public final class BearerData { outStream.skip(3); } + @UnsupportedAppUsage private static int countAsciiSeptets(CharSequence msg, boolean force) { int msgLen = msg.length(); if (force) return msgLen; @@ -518,6 +534,7 @@ public final class BearerData { return ted; } + @UnsupportedAppUsage private static byte[] encode7bitAscii(String msg, boolean force) throws CodingException { @@ -949,6 +966,7 @@ public final class BearerData { * * @return byte array of raw encoded SMS bearer data. */ + @UnsupportedAppUsage public static byte[] encode(BearerData bData) { bData.hasUserDataHeader = ((bData.userData != null) && (bData.userData.userDataHeader != null)); @@ -1200,6 +1218,7 @@ public final class BearerData { } } + @UnsupportedAppUsage private static void decodeUserDataPayload(UserData userData, boolean hasUserDataHeader) throws CodingException { @@ -1845,6 +1864,7 @@ public final class BearerData { * @return the number of bits to read from the stream * @throws CodingException if the specified encoding is not supported */ + @UnsupportedAppUsage private static int getBitsForNumFields(int msgEncoding, int numFields) throws CodingException { switch (msgEncoding) { diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaSmsAddress.java b/telephony/java/com/android/internal/telephony/cdma/sms/CdmaSmsAddress.java index d27a75815980..a82b9755045f 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaSmsAddress.java +++ b/telephony/java/com/android/internal/telephony/cdma/sms/CdmaSmsAddress.java @@ -16,11 +16,11 @@ package com.android.internal.telephony.cdma.sms; +import android.annotation.UnsupportedAppUsage; import android.util.SparseBooleanArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.SmsAddress; -import com.android.internal.telephony.cdma.sms.UserData; import com.android.internal.util.HexDump; public class CdmaSmsAddress extends SmsAddress { @@ -33,6 +33,7 @@ public class CdmaSmsAddress extends SmsAddress { static public final int DIGIT_MODE_4BIT_DTMF = 0x00; static public final int DIGIT_MODE_8BIT_CHAR = 0x01; + @UnsupportedAppUsage public int digitMode; /** @@ -43,6 +44,7 @@ public class CdmaSmsAddress extends SmsAddress { static public final int NUMBER_MODE_NOT_DATA_NETWORK = 0x00; static public final int NUMBER_MODE_DATA_NETWORK = 0x01; + @UnsupportedAppUsage public int numberMode; /** @@ -70,6 +72,7 @@ public class CdmaSmsAddress extends SmsAddress { * This field shall be set to the number of address digits * (See 3GPP2 C.S0015-B, v2, 3.4.3.3) */ + @UnsupportedAppUsage public int numberOfDigits; /** @@ -83,6 +86,7 @@ public class CdmaSmsAddress extends SmsAddress { //static protected final int NUMBERING_PLAN_TELEX = 0x4; //static protected final int NUMBERING_PLAN_PRIVATE = 0x9; + @UnsupportedAppUsage public int numberPlan; /** @@ -91,6 +95,7 @@ public class CdmaSmsAddress extends SmsAddress { * respectively. */ + @UnsupportedAppUsage public CdmaSmsAddress(){ } @@ -194,6 +199,7 @@ public class CdmaSmsAddress extends SmsAddress { * common punctuation. For alpha addresses, the string is cleaned * up by removing whitespace. */ + @UnsupportedAppUsage public static CdmaSmsAddress parse(String address) { CdmaSmsAddress addr = new CdmaSmsAddress(); addr.address = address; diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaSmsSubaddress.java b/telephony/java/com/android/internal/telephony/cdma/sms/CdmaSmsSubaddress.java index 0d5b502b9102..0d5b502b9102 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaSmsSubaddress.java +++ b/telephony/java/com/android/internal/telephony/cdma/sms/CdmaSmsSubaddress.java diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsEnvelope.java b/telephony/java/com/android/internal/telephony/cdma/sms/SmsEnvelope.java index de93b573f215..6af174c851cc 100644 --- a/telephony/java/com/android/internal/telephony/cdma/SmsEnvelope.java +++ b/telephony/java/com/android/internal/telephony/cdma/sms/SmsEnvelope.java @@ -17,7 +17,7 @@ package com.android.internal.telephony.cdma.sms; -import com.android.internal.telephony.cdma.sms.CdmaSmsSubaddress; +import android.annotation.UnsupportedAppUsage; public final class SmsEnvelope { /** @@ -69,6 +69,7 @@ public final class SmsEnvelope { * or receiving the message. * (See 3GPP2 C.S0015-B, v2, 3.4.3.1) */ + @UnsupportedAppUsage public int teleService = TELESERVICE_NOT_SET; /** @@ -76,6 +77,7 @@ public final class SmsEnvelope { * by the SMS message. * (See 3GPP2 C.S0015-B, v2, 3.4.3.2) */ + @UnsupportedAppUsage public int serviceCategory; /** @@ -126,8 +128,10 @@ public final class SmsEnvelope { * encoded bearer data * (See 3GPP2 C.S0015-B, v2, 3.4.3.7) */ + @UnsupportedAppUsage public byte[] bearerData; + @UnsupportedAppUsage public SmsEnvelope() { // nothing to see here } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmSmsAddress.java b/telephony/java/com/android/internal/telephony/gsm/GsmSmsAddress.java index bd8c83e63055..17f69b3ef9d9 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmSmsAddress.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmSmsAddress.java @@ -18,10 +18,13 @@ package com.android.internal.telephony.gsm; import android.telephony.PhoneNumberUtils; -import java.text.ParseException; import com.android.internal.telephony.GsmAlphabet; import com.android.internal.telephony.SmsAddress; +import dalvik.annotation.compat.UnsupportedAppUsage; + +import java.text.ParseException; + public class GsmSmsAddress extends SmsAddress { static final int OFFSET_ADDRESS_LENGTH = 0; @@ -38,7 +41,7 @@ public class GsmSmsAddress extends SmsAddress { * (addressLength + 1) / 2" * @throws ParseException */ - + @UnsupportedAppUsage public GsmSmsAddress(byte[] data, int offset, int length) throws ParseException { origBytes = new byte[length]; System.arraycopy(data, offset, origBytes, 0, length); @@ -136,6 +139,7 @@ public class GsmSmsAddress extends SmsAddress { * address indicating a "set" of "indicator 1" of type "voice message * waiting" */ + @UnsupportedAppUsage public boolean isCphsVoiceMessageSet() { // 0x11 means "set" "voice message waiting" "indicator 1" return isCphsVoiceMessageIndicatorAddress() @@ -148,6 +152,7 @@ public class GsmSmsAddress extends SmsAddress { * address indicating a "clear" of "indicator 1" of type "voice message * waiting" */ + @UnsupportedAppUsage public boolean isCphsVoiceMessageClear() { // 0x10 means "clear" "voice message waiting" "indicator 1" return isCphsVoiceMessageIndicatorAddress() diff --git a/telephony/java/com/android/internal/telephony/gsm/SmsCbHeader.java b/telephony/java/com/android/internal/telephony/gsm/SmsCbHeader.java index 0dbc186ef2cf..996edfc18eee 100644 --- a/telephony/java/com/android/internal/telephony/gsm/SmsCbHeader.java +++ b/telephony/java/com/android/internal/telephony/gsm/SmsCbHeader.java @@ -19,6 +19,8 @@ package com.android.internal.telephony.gsm; import android.telephony.SmsCbCmasInfo; import android.telephony.SmsCbEtwsInfo; +import dalvik.annotation.compat.UnsupportedAppUsage; + import java.util.Arrays; /** @@ -74,6 +76,7 @@ public class SmsCbHeader { private final int mSerialNumber; /** The Message Identifier in 3GPP is the same as the Service Category in CDMA. */ + @UnsupportedAppUsage private final int mMessageIdentifier; private final int mDataCodingScheme; @@ -90,6 +93,7 @@ public class SmsCbHeader { /** CMAS warning notification info. */ private final SmsCbCmasInfo mCmasInfo; + @UnsupportedAppUsage public SmsCbHeader(byte[] pdu) throws IllegalArgumentException { if (pdu == null || pdu.length < PDU_HEADER_LENGTH) { throw new IllegalArgumentException("Illegal PDU"); @@ -183,14 +187,17 @@ public class SmsCbHeader { } } + @UnsupportedAppUsage int getGeographicalScope() { return mGeographicalScope; } + @UnsupportedAppUsage int getSerialNumber() { return mSerialNumber; } + @UnsupportedAppUsage int getServiceCategory() { return mMessageIdentifier; } @@ -199,10 +206,12 @@ public class SmsCbHeader { return mDataCodingScheme; } + @UnsupportedAppUsage int getPageIndex() { return mPageIndex; } + @UnsupportedAppUsage int getNumberOfPages() { return mNrOfPages; } diff --git a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java index 5667387bdc1b..5bb818bd3286 100644 --- a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java @@ -16,18 +16,29 @@ package com.android.internal.telephony.gsm; +import static com.android.internal.telephony.SmsConstants.ENCODING_16BIT; +import static com.android.internal.telephony.SmsConstants.ENCODING_7BIT; +import static com.android.internal.telephony.SmsConstants.ENCODING_8BIT; +import static com.android.internal.telephony.SmsConstants.ENCODING_KSC5601; +import static com.android.internal.telephony.SmsConstants.ENCODING_UNKNOWN; +import static com.android.internal.telephony.SmsConstants.MAX_USER_DATA_BYTES; +import static com.android.internal.telephony.SmsConstants.MAX_USER_DATA_SEPTETS; +import static com.android.internal.telephony.SmsConstants.MessageClass; + +import android.content.res.Resources; import android.telephony.PhoneNumberUtils; import android.telephony.Rlog; -import android.content.res.Resources; import android.text.TextUtils; import com.android.internal.telephony.EncodeException; import com.android.internal.telephony.GsmAlphabet; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; -import com.android.internal.telephony.uicc.IccUtils; +import com.android.internal.telephony.Sms7BitEncodingTranslator; import com.android.internal.telephony.SmsHeader; import com.android.internal.telephony.SmsMessageBase; -import com.android.internal.telephony.Sms7BitEncodingTranslator; +import com.android.internal.telephony.uicc.IccUtils; + +import dalvik.annotation.compat.UnsupportedAppUsage; import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; @@ -35,16 +46,6 @@ import java.text.ParseException; import java.time.LocalDateTime; import java.time.ZoneOffset; -import static com.android.internal.telephony.SmsConstants.MessageClass; -import static com.android.internal.telephony.SmsConstants.ENCODING_UNKNOWN; -import static com.android.internal.telephony.SmsConstants.ENCODING_7BIT; -import static com.android.internal.telephony.SmsConstants.ENCODING_8BIT; -import static com.android.internal.telephony.SmsConstants.ENCODING_16BIT; -import static com.android.internal.telephony.SmsConstants.ENCODING_KSC5601; -import static com.android.internal.telephony.SmsConstants.MAX_USER_DATA_SEPTETS; -import static com.android.internal.telephony.SmsConstants.MAX_USER_DATA_BYTES; -import static com.android.internal.telephony.SmsConstants.MAX_USER_DATA_BYTES_WITH_HEADER; - /** * A Short Message Service message. * @@ -100,11 +101,18 @@ public class SmsMessage extends SmsMessageBase { private static final int INVALID_VALIDITY_PERIOD = -1; public static class SubmitPdu extends SubmitPduBase { + @UnsupportedAppUsage + public SubmitPdu() {} + } + + @UnsupportedAppUsage + public SmsMessage() { } /** * Create an SmsMessage from a raw PDU. */ + @UnsupportedAppUsage public static SmsMessage createFromPdu(byte[] pdu) { try { SmsMessage msg = new SmsMessage(); @@ -169,6 +177,7 @@ public class SmsMessage extends SmsMessageBase { * * @hide */ + @UnsupportedAppUsage public static SmsMessage createFromEfRecord(int index, byte[] data) { try { SmsMessage msg = new SmsMessage(); @@ -259,6 +268,7 @@ public class SmsMessage extends SmsMessageBase { * Returns null on encode error. * @hide */ + @UnsupportedAppUsage public static SubmitPdu getSubmitPdu(String scAddress, String destinationAddress, String message, boolean statusReportRequested, byte[] header) { @@ -281,6 +291,7 @@ public class SmsMessage extends SmsMessageBase { * Returns null on encode error. * @hide */ + @UnsupportedAppUsage public static SubmitPdu getSubmitPdu(String scAddress, String destinationAddress, String message, boolean statusReportRequested, byte[] header, int encoding, @@ -304,6 +315,7 @@ public class SmsMessage extends SmsMessageBase { * Returns null on encode error. * @hide */ + @UnsupportedAppUsage public static SubmitPdu getSubmitPdu(String scAddress, String destinationAddress, String message, boolean statusReportRequested, byte[] header, int encoding, @@ -444,6 +456,7 @@ public class SmsMessage extends SmsMessageBase { * @throws UnsupportedEncodingException * @throws EncodeException if String is too large to encode */ + @UnsupportedAppUsage private static byte[] encodeUCS2(String message, byte[] header) throws UnsupportedEncodingException, EncodeException { byte[] userData, textPart; @@ -478,6 +491,7 @@ public class SmsMessage extends SmsMessageBase { * address, if applicable, and the encoded message. * Returns null on encode error. */ + @UnsupportedAppUsage public static SubmitPdu getSubmitPdu(String scAddress, String destinationAddress, String message, boolean statusReportRequested) { @@ -496,6 +510,7 @@ public class SmsMessage extends SmsMessageBase { * address, if applicable, and the encoded message. * Returns null on encode error. */ + @UnsupportedAppUsage public static SubmitPdu getSubmitPdu(String scAddress, String destinationAddress, String message, boolean statusReportRequested, int validityPeriod) { @@ -576,6 +591,7 @@ public class SmsMessage extends SmsMessageBase { * @param ret <code>SubmitPdu</code> containing the encoded SC * address, if applicable, and the encoded message. Returns null on encode error. */ + @UnsupportedAppUsage private static ByteArrayOutputStream getSubmitPduHead( String scAddress, String destinationAddress, byte mtiByte, boolean statusReportRequested, SubmitPdu ret) { @@ -622,12 +638,16 @@ public class SmsMessage extends SmsMessageBase { } private static class PduParser { + @UnsupportedAppUsage byte mPdu[]; + @UnsupportedAppUsage int mCur; SmsHeader mUserDataHeader; byte[] mUserData; + @UnsupportedAppUsage int mUserDataSeptetPadding; + @UnsupportedAppUsage PduParser(byte[] pdu) { mPdu = pdu; mCur = 0; @@ -667,6 +687,7 @@ public class SmsMessage extends SmsMessageBase { /** * returns non-sign-extended byte value */ + @UnsupportedAppUsage int getByte() { return mPdu[mCur++] & 0xff; } @@ -808,6 +829,7 @@ public class SmsMessage extends SmsMessageBase { * * @return the user data payload, not including the headers */ + @UnsupportedAppUsage byte[] getUserData() { return mUserData; } @@ -864,6 +886,7 @@ public class SmsMessage extends SmsMessageBase { * @param byteCount the number of bytes in the user data payload * @return a String with the decoded characters */ + @UnsupportedAppUsage String getUserDataUCS2(int byteCount) { String ret; @@ -912,6 +935,7 @@ public class SmsMessage extends SmsMessageBase { * @param use7bitOnly ignore (but still count) illegal characters if true * @return TextEncodingDetails */ + @UnsupportedAppUsage public static TextEncodingDetails calculateLength(CharSequence msgBody, boolean use7bitOnly) { CharSequence newMsgBody = null; @@ -959,6 +983,7 @@ public class SmsMessage extends SmsMessageBase { } /** {@inheritDoc} */ + @UnsupportedAppUsage @Override public boolean isMWIClearMessage() { if (mIsMwi && !mMwiSense) { @@ -970,6 +995,7 @@ public class SmsMessage extends SmsMessageBase { } /** {@inheritDoc} */ + @UnsupportedAppUsage @Override public boolean isMWISetMessage() { if (mIsMwi && mMwiSense) { @@ -981,6 +1007,7 @@ public class SmsMessage extends SmsMessageBase { } /** {@inheritDoc} */ + @UnsupportedAppUsage @Override public boolean isMwiDontStore() { if (mIsMwi && mMwiDontStore) { @@ -1000,12 +1027,14 @@ public class SmsMessage extends SmsMessageBase { } /** {@inheritDoc} */ + @UnsupportedAppUsage @Override public int getStatus() { return mStatus; } /** {@inheritDoc} */ + @UnsupportedAppUsage @Override public boolean isStatusReportMessage() { return mIsStatusReportMessage; diff --git a/telephony/java/com/android/internal/telephony/uicc/IccUtils.java b/telephony/java/com/android/internal/telephony/uicc/IccUtils.java index 6b3df94063bf..9c69e2d6e08f 100644 --- a/telephony/java/com/android/internal/telephony/uicc/IccUtils.java +++ b/telephony/java/com/android/internal/telephony/uicc/IccUtils.java @@ -24,6 +24,8 @@ import android.telephony.Rlog; import com.android.internal.telephony.GsmAlphabet; +import dalvik.annotation.compat.UnsupportedAppUsage; + import java.io.UnsupportedEncodingException; /** @@ -46,6 +48,7 @@ public class IccUtils { * * Stops on invalid BCD value, returning string so far */ + @UnsupportedAppUsage public static String bcdToString(byte[] data, int offset, int length) { StringBuilder ret = new StringBuilder(length*2); @@ -173,6 +176,7 @@ public class IccUtils { /** * Decode cdma byte into String. */ + @UnsupportedAppUsage public static String cdmaBcdToString(byte[] data, int offset, int length) { StringBuilder ret = new StringBuilder(length); @@ -208,6 +212,7 @@ public class IccUtils { * assume the digit is set to 0 but shall store the entire field * exactly as received" */ + @UnsupportedAppUsage public static int gsmBcdByteToInt(byte b) { int ret = 0; @@ -230,6 +235,7 @@ public class IccUtils { * is in the least significant nibble and the most significant * is in the most significant nibble. */ + @UnsupportedAppUsage public static int cdmaBcdByteToInt(byte b) { int ret = 0; @@ -281,6 +287,7 @@ public class IccUtils { * contain a 16 bit number which defines the complete 16 bit * base pointer to a "half page" in the UCS2 code space... */ + @UnsupportedAppUsage public static String adnStringFieldToString(byte[] data, int offset, int length) { if (length == 0) { @@ -372,6 +379,7 @@ public class IccUtils { return GsmAlphabet.gsm8BitUnpackedToString(data, offset, length, defaultCharset.trim()); } + @UnsupportedAppUsage public static int hexCharToInt(char c) { if (c >= '0' && c <= '9') return (c - '0'); @@ -391,6 +399,7 @@ public class IccUtils { * * @throws RuntimeException on invalid format */ + @UnsupportedAppUsage public static byte[] hexStringToBytes(String s) { byte[] ret; @@ -417,6 +426,7 @@ public class IccUtils { * * @return hex string representation of bytes array */ + @UnsupportedAppUsage public static String bytesToHexString(byte[] bytes) { if (bytes == null) return null; @@ -444,6 +454,7 @@ public class IccUtils { * "offset" points to "octet 3", the coding scheme byte * empty string returned on decode error */ + @UnsupportedAppUsage public static String networkNameToString(byte[] data, int offset, int length) { String ret; @@ -494,6 +505,7 @@ public class IccUtils { * @param length The length of image body * @return The bitmap */ + @UnsupportedAppUsage public static Bitmap parseToBnW(byte[] data, int length){ int valueIndex = 0; int width = data[valueIndex++] & 0xFF; @@ -536,6 +548,7 @@ public class IccUtils { * @param transparency with or without transparency * @return The color bitmap */ + @UnsupportedAppUsage public static Bitmap parseToRGB(byte[] data, int length, boolean transparency) { int valueIndex = 0; diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp index bbf71e70c396..99a686be1390 100644 --- a/tools/aapt2/cmd/Link.cpp +++ b/tools/aapt2/cmd/Link.cpp @@ -1084,7 +1084,8 @@ class Linker { case OutputFormat::kProto: { pb::ResourceTable pb_table; - SerializeTableToPb(*table, &pb_table, context_->GetDiagnostics()); + SerializeTableToPb(*table, &pb_table, context_->GetDiagnostics(), + options_.proto_table_flattener_options); return io::CopyProtoToArchive(context_, &pb_table, kProtoResourceTablePath, ArchiveEntry::kCompress, writer); } break; diff --git a/tools/aapt2/cmd/Link.h b/tools/aapt2/cmd/Link.h index 324807c55215..56bff8fe0fe8 100644 --- a/tools/aapt2/cmd/Link.h +++ b/tools/aapt2/cmd/Link.h @@ -24,6 +24,7 @@ #include "Resource.h" #include "split/TableSplitter.h" #include "format/binary/TableFlattener.h" +#include "format/proto/ProtoSerialize.h" #include "link/ManifestFixer.h" #include "trace/TraceBuffer.h" @@ -81,6 +82,7 @@ struct LinkOptions { // Flattening options. TableFlattenerOptions table_flattener_options; + SerializeTableOptions proto_table_flattener_options; bool keep_raw_values = false; // Split APK options. @@ -245,9 +247,9 @@ class LinkCommand : public Command { "<add-resource> tags.", &options_.auto_add_overlay); AddOptionalSwitch("--override-styles-instead-of-overlaying", - "Causes styles defined in -R resources to replace previous definitions\n" - "instead of merging into them\n", - &options_.override_styles_instead_of_overlaying); + "Causes styles defined in -R resources to replace previous definitions\n" + "instead of merging into them\n", + &options_.override_styles_instead_of_overlaying); AddOptionalFlag("--rename-manifest-package", "Renames the package in AndroidManifest.xml.", &options_.manifest_fixer_options.rename_manifest_package); AddOptionalFlag("--rename-instrumentation-target-package", @@ -283,13 +285,18 @@ class LinkCommand : public Command { AddOptionalSwitch("--strict-visibility", "Do not allow overlays with different visibility levels.", &options_.strict_visibility); - AddOptionalSwitch("-v", "Enables verbose logging.", &verbose_); - AddOptionalFlag("--trace-folder", "Generate systrace json trace fragment to specified folder.", - &trace_folder_); + AddOptionalSwitch("--exclude-sources", + "Do not serialize source file information when generating resources in\n" + "Protobuf format.", + &options_.proto_table_flattener_options.exclude_sources); + AddOptionalFlag("--trace-folder", + "Generate systrace json trace fragment to specified folder.", + &trace_folder_); AddOptionalSwitch("--merge-only", - "Only merge the resources, without verifying resource references. This flag\n" - "should only be used together with the --static-lib flag.", - &options_.merge_only); + "Only merge the resources, without verifying resource references. This flag\n" + "should only be used together with the --static-lib flag.", + &options_.merge_only); + AddOptionalSwitch("-v", "Enables verbose logging.", &verbose_); } int Action(const std::vector<std::string>& args) override; diff --git a/tools/aapt2/format/proto/ProtoSerialize.cpp b/tools/aapt2/format/proto/ProtoSerialize.cpp index aa6547e81624..e4b3fce52166 100644 --- a/tools/aapt2/format/proto/ProtoSerialize.cpp +++ b/tools/aapt2/format/proto/ProtoSerialize.cpp @@ -290,8 +290,10 @@ static void SerializeOverlayableItemToPb(const OverlayableItem& overlayable_item pb::Overlayable* pb_overlayable = pb_table->add_overlayable(); pb_overlayable->set_name(overlayable_item.overlayable->name); pb_overlayable->set_actor(overlayable_item.overlayable->actor); - SerializeSourceToPb(overlayable_item.overlayable->source, source_pool, - pb_overlayable->mutable_source()); + if (source_pool != nullptr) { + SerializeSourceToPb(overlayable_item.overlayable->source, source_pool, + pb_overlayable->mutable_source()); + } } pb::OverlayableItem* pb_overlayable_item = pb_entry->mutable_overlayable_item(); @@ -319,14 +321,17 @@ static void SerializeOverlayableItemToPb(const OverlayableItem& overlayable_item pb_overlayable_item->add_policy(pb::OverlayableItem::OEM); } - SerializeSourceToPb(overlayable_item.source, source_pool, - pb_overlayable_item->mutable_source()); + if (source_pool != nullptr) { + SerializeSourceToPb(overlayable_item.source, source_pool, + pb_overlayable_item->mutable_source()); + } pb_overlayable_item->set_comment(overlayable_item.comment); } void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table, - IDiagnostics* diag) { - StringPool source_pool; + IDiagnostics* diag, SerializeTableOptions options) { + auto source_pool = (options.exclude_sources) ? nullptr : util::make_unique<StringPool>(); + pb::ToolFingerprint* pb_fingerprint = out_table->add_tool_fingerprint(); pb_fingerprint->set_tool(util::GetToolName()); pb_fingerprint->set_version(util::GetToolFingerprint()); @@ -356,32 +361,40 @@ void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table // Write the Visibility struct. pb::Visibility* pb_visibility = pb_entry->mutable_visibility(); pb_visibility->set_level(SerializeVisibilityToPb(entry->visibility.level)); - SerializeSourceToPb(entry->visibility.source, &source_pool, - pb_visibility->mutable_source()); + if (source_pool != nullptr) { + SerializeSourceToPb(entry->visibility.source, source_pool.get(), + pb_visibility->mutable_source()); + } pb_visibility->set_comment(entry->visibility.comment); if (entry->allow_new) { pb::AllowNew* pb_allow_new = pb_entry->mutable_allow_new(); - SerializeSourceToPb(entry->allow_new.value().source, &source_pool, - pb_allow_new->mutable_source()); + if (source_pool != nullptr) { + SerializeSourceToPb(entry->allow_new.value().source, source_pool.get(), + pb_allow_new->mutable_source()); + } pb_allow_new->set_comment(entry->allow_new.value().comment); } if (entry->overlayable_item) { - SerializeOverlayableItemToPb(entry->overlayable_item.value(), overlayables, &source_pool, - pb_entry, out_table); + SerializeOverlayableItemToPb(entry->overlayable_item.value(), overlayables, + source_pool.get(), pb_entry, out_table); } for (const std::unique_ptr<ResourceConfigValue>& config_value : entry->values) { pb::ConfigValue* pb_config_value = pb_entry->add_config_value(); SerializeConfig(config_value->config, pb_config_value->mutable_config()); pb_config_value->mutable_config()->set_product(config_value->product); - SerializeValueToPb(*config_value->value, pb_config_value->mutable_value(), &source_pool); + SerializeValueToPb(*config_value->value, pb_config_value->mutable_value(), + source_pool.get()); } } } } - SerializeStringPoolToPb(source_pool, out_table->mutable_source_pool(), diag); + + if (source_pool != nullptr) { + SerializeStringPoolToPb(*source_pool, out_table->mutable_source_pool(), diag); + } } static pb::Reference_Type SerializeReferenceTypeToPb(Reference::Type type) { diff --git a/tools/aapt2/format/proto/ProtoSerialize.h b/tools/aapt2/format/proto/ProtoSerialize.h index 33ffd182435b..7a3ea9903732 100644 --- a/tools/aapt2/format/proto/ProtoSerialize.h +++ b/tools/aapt2/format/proto/ProtoSerialize.h @@ -35,6 +35,11 @@ struct SerializeXmlOptions { bool remove_empty_text_nodes = false; }; +struct SerializeTableOptions { + /** Prevent serializing the source pool and source protos. */ + bool exclude_sources = false; +}; + // Serializes a Value to its protobuf representation. An optional StringPool will hold the // source path string. void SerializeValueToPb(const Value& value, pb::Value* out_value, StringPool* src_pool = nullptr); @@ -59,7 +64,8 @@ void SerializeStringPoolToPb(const StringPool& pool, pb::StringPool* out_pb_pool void SerializeConfig(const android::ConfigDescription& config, pb::Configuration* out_pb_config); // Serializes a ResourceTable into its protobuf representation. -void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table, IDiagnostics* diag); +void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table, + IDiagnostics* diag, SerializeTableOptions options = {}); // Serializes a ResourceFile into its protobuf representation. void SerializeCompiledFileToPb(const ResourceFile& file, pb::internal::CompiledFile* out_file); diff --git a/tools/processors/staledataclass/Android.bp b/tools/processors/staledataclass/Android.bp index c81d410c5e4b..58a7d346ce1f 100644 --- a/tools/processors/staledataclass/Android.bp +++ b/tools/processors/staledataclass/Android.bp @@ -13,6 +13,8 @@ java_plugin { static_libs: [ "codegen-version-info", ], + // The --add-modules/exports flags below don't work for kotlinc yet, so pin this module to Java language level 8 (see b/139342589): + java_version: "1.8", openjdk9: { javacflags: [ "--add-modules=jdk.compiler", |