summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp805
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/GrantedUriPermissions.java29
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java24
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java3
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobStore.java8
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/DeviceIdleJobsController.java6
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java31
-rw-r--r--cmds/idmap2/Android.bp1
-rw-r--r--cmds/statsd/src/atoms.proto12
-rw-r--r--config/hiddenapi-greylist.txt559
-rw-r--r--core/java/android/app/ActivityThread.java22
-rw-r--r--core/java/android/app/SystemServiceRegistry.java3
-rw-r--r--core/java/android/companion/AssociationRequest.java6
-rw-r--r--core/java/android/compat/IPlatformCompat.aidl (renamed from services/core/java/com/android/server/compat/IPlatformCompat.aidl)8
-rw-r--r--core/java/android/content/Context.java3
-rw-r--r--core/java/android/content/pm/PackageManager.java13
-rw-r--r--core/java/android/content/pm/PackageManagerInternal.java6
-rw-r--r--core/java/android/content/rollback/PackageRollbackInfo.java14
-rw-r--r--core/java/android/hardware/Sensor.java4
-rw-r--r--core/java/android/service/gatekeeper/GateKeeperResponse.java2
-rw-r--r--core/java/android/util/Half.java274
-rw-r--r--core/java/com/android/internal/widget/ResolverDrawerLayout.java70
-rw-r--r--core/jni/android/graphics/ImageDecoder.cpp46
-rw-r--r--core/proto/android/providers/settings.proto4
-rw-r--r--core/proto/android/providers/settings/config.proto55
-rw-r--r--core/res/res/values/config.xml1
-rw-r--r--data/etc/privapp-permissions-platform.xml1
-rw-r--r--graphics/java/android/graphics/ImageDecoder.java80
-rw-r--r--libs/hwui/renderthread/VulkanManager.cpp38
-rw-r--r--location/lib/Android.bp6
-rw-r--r--packages/CarSystemUI/AndroidManifest.xml4
-rw-r--r--packages/CarSystemUI/res/drawable/unlock_dialog_background.xml26
-rw-r--r--packages/CarSystemUI/res/layout/trust_agent_unlock_dialog.xml72
-rw-r--r--packages/CarSystemUI/res/values/colors_car.xml5
-rw-r--r--packages/CarSystemUI/res/values/dimens_car.xml6
-rw-r--r--packages/CarSystemUI/res/values/integers_car.xml2
-rw-r--r--packages/CarSystemUI/res/values/strings_car.xml15
-rw-r--r--packages/CarSystemUI/res/values/styles.xml8
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java7
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarTrustAgentUnlockDialogHelper.java240
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java114
-rw-r--r--packages/SettingsLib/res/values/styles_support_preference.xml2
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java88
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt35
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/classifier/brightline/ZigZagClassifierTest.java4
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerService.java639
-rw-r--r--services/backup/java/com/android/server/backup/Trampoline.java711
-rw-r--r--services/core/Android.bp9
-rw-r--r--services/core/java/com/android/server/AlarmManagerService.java4
-rw-r--r--services/core/java/com/android/server/DeviceIdleController.java19
-rw-r--r--services/core/java/com/android/server/DeviceIdleInternal.java52
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java8
-rw-r--r--services/core/java/com/android/server/appop/HistoricalRegistry.java8
-rw-r--r--services/core/java/com/android/server/compat/PlatformCompat.java1
-rw-r--r--services/core/java/com/android/server/connectivity/Vpn.java6
-rw-r--r--services/core/java/com/android/server/content/SyncManager.java6
-rw-r--r--services/core/java/com/android/server/deviceidle/BluetoothConstraint.java6
-rw-r--r--services/core/java/com/android/server/deviceidle/TvConstraintController.java6
-rw-r--r--services/core/java/com/android/server/display/WifiDisplayController.java22
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsService.java337
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsStorage.java27
-rw-r--r--services/core/java/com/android/server/locksettings/PasswordSlotManager.java4
-rw-r--r--services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java28
-rw-r--r--services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java242
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java4
-rw-r--r--services/core/java/com/android/server/om/OverlayManagerService.java4
-rw-r--r--services/core/java/com/android/server/pm/AppsFilter.java146
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java65
-rw-r--r--services/core/java/com/android/server/pm/StagingManager.java38
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java14
-rw-r--r--services/core/java/com/android/server/pm/permission/TEST_MAPPING5
-rw-r--r--services/core/java/com/android/server/rollback/AppDataRollbackHelper.java87
-rw-r--r--services/core/java/com/android/server/rollback/Rollback.java (renamed from services/core/java/com/android/server/rollback/RollbackData.java)22
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java382
-rw-r--r--services/core/java/com/android/server/rollback/RollbackStore.java80
-rw-r--r--services/core/java/com/android/server/security/KeyChainSystemService.java6
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java12
-rw-r--r--services/java/com/android/server/SystemServer.java34
-rw-r--r--services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java1258
-rw-r--r--services/robotests/backup/src/com/android/server/backup/TrampolineRoboTest.java1280
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java2
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java4
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/deviceidle/BluetoothConstraintTest.java4
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java503
-rw-r--r--services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java99
-rw-r--r--services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java32
-rw-r--r--telephony/java/android/telephony/data/DataServiceCallback.java5
-rw-r--r--telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java9
-rw-r--r--telephony/java/com/android/internal/telephony/DctConstants.java16
-rw-r--r--telephony/java/com/android/internal/telephony/GsmAlphabet.java15
-rw-r--r--telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl1
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl2
-rw-r--r--telephony/java/com/android/internal/telephony/IccCardConstants.java13
-rw-r--r--telephony/java/com/android/internal/telephony/PhoneConstants.java19
-rw-r--r--telephony/java/com/android/internal/telephony/RILConstants.java3
-rw-r--r--telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java17
-rw-r--r--telephony/java/com/android/internal/telephony/SmsApplication.java17
-rw-r--r--telephony/java/com/android/internal/telephony/SmsHeader.java13
-rw-r--r--telephony/java/com/android/internal/telephony/SmsMessageBase.java15
-rw-r--r--telephony/java/com/android/internal/telephony/TelephonyProperties.java3
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/SmsMessage.java29
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/UserData.java13
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/sms/BearerData.java (renamed from telephony/java/com/android/internal/telephony/cdma/BearerData.java)22
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/sms/CdmaSmsAddress.java (renamed from telephony/java/com/android/internal/telephony/cdma/CdmaSmsAddress.java)8
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/sms/CdmaSmsSubaddress.java (renamed from telephony/java/com/android/internal/telephony/cdma/CdmaSmsSubaddress.java)0
-rw-r--r--telephony/java/com/android/internal/telephony/cdma/sms/SmsEnvelope.java (renamed from telephony/java/com/android/internal/telephony/cdma/SmsEnvelope.java)6
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/GsmSmsAddress.java9
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/SmsCbHeader.java9
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/SmsMessage.java55
-rw-r--r--telephony/java/com/android/internal/telephony/uicc/IccUtils.java13
-rw-r--r--tools/aapt2/cmd/Link.cpp3
-rw-r--r--tools/aapt2/cmd/Link.h25
-rw-r--r--tools/aapt2/format/proto/ProtoSerialize.cpp41
-rw-r--r--tools/aapt2/format/proto/ProtoSerialize.h8
-rw-r--r--tools/processors/staledataclass/Android.bp2
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",