diff --git a/apex/jobscheduler/framework/java/com/android/server/DeviceIdleInternal.java b/apex/jobscheduler/framework/java/com/android/server/DeviceIdleInternal.java
index 6475f57..18643ed 100644
--- a/apex/jobscheduler/framework/java/com/android/server/DeviceIdleInternal.java
+++ b/apex/jobscheduler/framework/java/com/android/server/DeviceIdleInternal.java
@@ -37,7 +37,7 @@
             String reason);
 
     // duration in milliseconds
-    long getNotificationWhitelistDuration();
+    long getNotificationAllowlistDuration();
 
     void setJobsActive(boolean active);
 
diff --git a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
index ac58f3d..6791272 100644
--- a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
+++ b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
@@ -891,7 +891,8 @@
                 "mms_temp_app_whitelist_duration";
         private static final String KEY_SMS_TEMP_APP_WHITELIST_DURATION =
                 "sms_temp_app_whitelist_duration";
-        private static final String KEY_NOTIFICATION_WHITELIST_DURATION =
+        // TODO(b/124466289): update value to match the name
+        private static final String KEY_NOTIFICATION_ALLOWLIST_DURATION =
                 "notification_whitelist_duration";
         /**
          * Whether to wait for the user to unlock the device before causing screen-on to
@@ -1125,9 +1126,9 @@
          * Amount of time we would like to whitelist an app that is handling a
          * {@link android.app.PendingIntent} triggered by a {@link android.app.Notification}.
          * @see Settings.Global#DEVICE_IDLE_CONSTANTS
-         * @see #KEY_NOTIFICATION_WHITELIST_DURATION
+         * @see #NOTIFICATION_ALLOWLIST_DURATION
          */
-        public long NOTIFICATION_WHITELIST_DURATION;
+        public long NOTIFICATION_ALLOWLIST_DURATION;
 
         /**
          * Pre idle time factor use to make idle delay longer
@@ -1231,8 +1232,8 @@
                         KEY_MMS_TEMP_APP_WHITELIST_DURATION, 60 * 1000L);
                 SMS_TEMP_APP_WHITELIST_DURATION = mParser.getDurationMillis(
                         KEY_SMS_TEMP_APP_WHITELIST_DURATION, 20 * 1000L);
-                NOTIFICATION_WHITELIST_DURATION = mParser.getDurationMillis(
-                        KEY_NOTIFICATION_WHITELIST_DURATION, 30 * 1000L);
+                NOTIFICATION_ALLOWLIST_DURATION = mParser.getDurationMillis(
+                        KEY_NOTIFICATION_ALLOWLIST_DURATION, 30 * 1000L);
                 WAIT_FOR_UNLOCK = mParser.getBoolean(KEY_WAIT_FOR_UNLOCK, true);
                 PRE_IDLE_FACTOR_LONG = mParser.getFloat(KEY_PRE_IDLE_FACTOR_LONG, 1.67f);
                 PRE_IDLE_FACTOR_SHORT = mParser.getFloat(KEY_PRE_IDLE_FACTOR_SHORT, 0.33f);
@@ -1344,8 +1345,8 @@
             TimeUtils.formatDuration(SMS_TEMP_APP_WHITELIST_DURATION, pw);
             pw.println();
 
-            pw.print("    "); pw.print(KEY_NOTIFICATION_WHITELIST_DURATION); pw.print("=");
-            TimeUtils.formatDuration(NOTIFICATION_WHITELIST_DURATION, pw);
+            pw.print("    "); pw.print(KEY_NOTIFICATION_ALLOWLIST_DURATION); pw.print("=");
+            TimeUtils.formatDuration(NOTIFICATION_ALLOWLIST_DURATION, pw);
             pw.println();
 
             pw.print("    "); pw.print(KEY_WAIT_FOR_UNLOCK); pw.print("=");
@@ -1790,8 +1791,8 @@
 
         // duration in milliseconds
         @Override
-        public long getNotificationWhitelistDuration() {
-            return mConstants.NOTIFICATION_WHITELIST_DURATION;
+        public long getNotificationAllowlistDuration() {
+            return mConstants.NOTIFICATION_ALLOWLIST_DURATION;
         }
 
         @Override
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index ab1d3cb..12ef9ba 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -3863,6 +3863,17 @@
  *      system/core/lmkd/lmkd.c
  */
 message LmkKillOccurred {
+    enum Reason {
+        UNKNOWN = 0;
+        PRESSURE_AFTER_KILL = 1;
+        NOT_RESPONDING = 2;
+        LOW_SWAP_AND_THRASHING = 3;
+        LOW_MEM_AND_SWAP = 4;
+        LOW_MEM_AND_THRASHING = 5;
+        DIRECT_RECL_AND_THRASHING = 6;
+        LOW_MEM_AND_SWAP_UTIL = 7;
+    }
+
     // The uid if available. -1 means not available.
     optional int32 uid = 1 [(is_uid) = true];
 
@@ -3892,6 +3903,15 @@
 
     // Min oom adj score considered by lmkd.
     optional int32 min_oom_score = 10;
+
+    // Free physical memory on device at LMK time.
+    optional int32 free_mem_kb = 11;
+
+    // Free swap on device at LMK time.
+    optional int32 free_swap_kb = 12;
+
+    // What triggered the LMK event.
+    optional Reason reason = 13;
 }
 
 /*
diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
index 57c1083..4b4ef00 100644
--- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java
+++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
@@ -572,7 +572,7 @@
     }
 
     /**
-     * Returns a set of whitelisted accounts given by the intent or null if none specified by the
+     * Returns a set of allowlisted accounts given by the intent or null if none specified by the
      * intent.
      */
     private Set<Account> getAllowableAccountSet(final Intent intent) {
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 63e8638..8ddca15 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -8348,7 +8348,7 @@
      *
      * <p>If {@link DevicePolicyManager#isLockTaskPermitted(String)} returns {@code true}
      * for this component, the current task will be launched directly into LockTask mode. Only apps
-     * whitelisted by {@link DevicePolicyManager#setLockTaskPackages(ComponentName, String[])} can
+     * allowlisted by {@link DevicePolicyManager#setLockTaskPackages(ComponentName, String[])} can
      * be launched while LockTask mode is active. The user will not be able to leave this mode
      * until this activity calls {@link #stopLockTask()}. Calling this method while the device is
      * already in LockTask mode has no effect.
@@ -8380,7 +8380,7 @@
      * <p><strong>Note:</strong> If the device is in LockTask mode that is not initially started
      * by this activity, then calling this method will not terminate the LockTask mode, but only
      * finish its own task. The device will remain in LockTask mode, until the activity which
-     * started the LockTask mode calls this method, or until its whitelist authorization is revoked
+     * started the LockTask mode calls this method, or until its allowlist authorization is revoked
      * by {@link DevicePolicyManager#setLockTaskPackages(ComponentName, String[])}.
      *
      * @see #startLockTask()
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 1059a6f..0e811a4 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -4875,9 +4875,9 @@
     }
 
     /**
-     * Get packages of bugreport-whitelisted apps to handle a bug report.
+     * Get packages of bugreport-allowlisted apps to handle a bug report.
      *
-     * @return packages of bugreport-whitelisted apps to handle a bug report.
+     * @return packages of bugreport-allowlisted apps to handle a bug report.
      * @hide
      */
     public List<String> getBugreportWhitelistedPackages() {
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 812ca4a..7afe8b79 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4053,7 +4053,7 @@
     private void handleCreateBackupAgent(CreateBackupAgentData data) {
         if (DEBUG_BACKUP) Slog.v(TAG, "handleCreateBackupAgent: " + data);
 
-        // Sanity check the requested target package's uid against ours
+        // Validity check the requested target package's uid against ours
         try {
             PackageInfo requestedPackage = getPackageManager().getPackageInfo(
                     data.appInfo.packageName, 0, UserHandle.myUserId());
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
index 98a23f2..92b0da1c 100644
--- a/core/java/android/app/ActivityView.java
+++ b/core/java/android/app/ActivityView.java
@@ -122,7 +122,7 @@
         }
         mSurfaceView = new SurfaceView(context, null, 0, 0, disableSurfaceViewBackgroundLayer);
         // Since ActivityView#getAlpha has been overridden, we should use parent class's alpha
-        // as master to synchronize surface view's alpha value.
+        // as authoritative to synchronize surface view's alpha value.
         mSurfaceView.setAlpha(super.getAlpha());
         mSurfaceView.setUseAlpha();
         mSurfaceCallback = new SurfaceCallback();
diff --git a/core/java/android/app/AppOps.md b/core/java/android/app/AppOps.md
index ad1a301..ac8acbf 100644
--- a/core/java/android/app/AppOps.md
+++ b/core/java/android/app/AppOps.md
@@ -53,7 +53,7 @@
 : Allow the access but only if the app is currently in the [foreground](#foreground)
 
 `MODE_IGNORED`
-: Don't allow the access, i.e. don't perform the requested action or return dummy data
+: Don't allow the access, i.e. don't perform the requested action or return placeholder data
 
 `MODE_ERRORED`
 : Throw a `SecurityException` on access. This can be suppressed by using a `...noThrow` method to
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 0a6827c..2aee696 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -115,8 +115,8 @@
  *     <dt>{@link #MODE_ALLOWED}
  *     <dd>Allow the access
  *     <dt>{@link #MODE_IGNORED}
- *     <dd>Don't allow the access, i.e. don't perform the requested action or return no or dummy
- *     data
+ *     <dd>Don't allow the access, i.e. don't perform the requested action or return no or
+ *     placeholder data
  *     <dt>{@link #MODE_ERRORED}
  *     <dd>Throw a {@link SecurityException} on access. This can be suppressed by using a
  *     {@code ...noThrow} method to check the mode
@@ -135,7 +135,7 @@
  * <p>Each platform defined runtime permission (beside background modifiers) has an associated app
  * op which is used for tracking but also to allow for silent failures. I.e. if the runtime
  * permission is denied the caller gets a {@link SecurityException}, but if the permission is
- * granted and the app-op is {@link #MODE_IGNORED} then the callers gets dummy behavior, e.g.
+ * granted and the app-op is {@link #MODE_IGNORED} then the callers gets placeholder behavior, e.g.
  * location callbacks would not happen.
  *
  * <h3>App-op permissions</h3>
@@ -1887,7 +1887,7 @@
             null, // no permission for writing clipboard
             null, // no permission for taking media buttons
             null, // no permission for taking audio focus
-            null, // no permission for changing master volume
+            null, // no permission for changing global volume
             null, // no permission for changing voice volume
             null, // no permission for changing ring volume
             null, // no permission for changing media volume
@@ -6431,7 +6431,7 @@
      * Retrieve current operation state for all applications.
      *
      * The mode of the ops returned are set for the package but may not reflect their effective
-     * state due to UID policy or because it's controlled by a different master op.
+     * state due to UID policy or because it's controlled by a different global op.
      *
      * Use {@link #unsafeCheckOp(String, int, String)}} or
      * {@link #noteOp(String, int, String, String, String)} if the effective mode is needed.
@@ -6455,7 +6455,7 @@
      * Retrieve current operation state for all applications.
      *
      * The mode of the ops returned are set for the package but may not reflect their effective
-     * state due to UID policy or because it's controlled by a different master op.
+     * state due to UID policy or because it's controlled by a different global op.
      *
      * Use {@link #unsafeCheckOp(String, int, String)}} or
      * {@link #noteOp(String, int, String, String, String)} if the effective mode is needed.
@@ -6477,7 +6477,7 @@
      * Retrieve current operation state for one application.
      *
      * The mode of the ops returned are set for the package but may not reflect their effective
-     * state due to UID policy or because it's controlled by a different master op.
+     * state due to UID policy or because it's controlled by a different global op.
      *
      * Use {@link #unsafeCheckOp(String, int, String)}} or
      * {@link #noteOp(String, int, String, String, String)} if the effective mode is needed.
@@ -6510,7 +6510,7 @@
      * package must match.
      *
      * The mode of the ops returned are set for the package but may not reflect their effective
-     * state due to UID policy or because it's controlled by a different master op.
+     * state due to UID policy or because it's controlled by a different global op.
      *
      * Use {@link #unsafeCheckOp(String, int, String)}} or
      * {@link #noteOp(String, int, String, String, String)} if the effective mode is needed.
diff --git a/core/java/android/app/BroadcastOptions.java b/core/java/android/app/BroadcastOptions.java
index 161e2ad..3789a44 100644
--- a/core/java/android/app/BroadcastOptions.java
+++ b/core/java/android/app/BroadcastOptions.java
@@ -36,7 +36,7 @@
     private boolean mAllowBackgroundActivityStarts;
 
     /**
-     * How long to temporarily put an app on the power whitelist when executing this broadcast
+     * How long to temporarily put an app on the power allowlist when executing this broadcast
      * to it.
      */
     static final String KEY_TEMPORARY_APP_WHITELIST_DURATION
@@ -87,8 +87,8 @@
 
     /**
      * Set a duration for which the system should temporary place an application on the
-     * power whitelist when this broadcast is being delivered to it.
-     * @param duration The duration in milliseconds; 0 means to not place on whitelist.
+     * power allowlist when this broadcast is being delivered to it.
+     * @param duration The duration in milliseconds; 0 means to not place on allowlist.
      */
     @RequiresPermission(android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST)
     public void setTemporaryAppWhitelistDuration(long duration) {
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 79d2a81..93bff3c 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -953,12 +953,12 @@
     public ArraySet<PendingIntent> allPendingIntents;
 
     /**
-     * Token identifying the notification that is applying doze/bgcheck whitelisting to the
+     * Token identifying the notification that is applying doze/bgcheck allowlisting to the
      * pending intents inside of it, so only those will get the behavior.
      *
      * @hide
      */
-    private IBinder mWhitelistToken;
+    private IBinder mAllowlistToken;
 
     /**
      * Must be set by a process to start associating tokens with Notification objects
@@ -966,7 +966,7 @@
      *
      * @hide
      */
-    static public IBinder processWhitelistToken;
+    static public IBinder processAllowlistToken;
 
     /**
      * {@link #extras} key: this is the title of the notification,
@@ -2245,12 +2245,12 @@
     {
         int version = parcel.readInt();
 
-        mWhitelistToken = parcel.readStrongBinder();
-        if (mWhitelistToken == null) {
-            mWhitelistToken = processWhitelistToken;
+        mAllowlistToken = parcel.readStrongBinder();
+        if (mAllowlistToken == null) {
+            mAllowlistToken = processAllowlistToken;
         }
         // Propagate this token to all pending intents that are unmarshalled from the parcel.
-        parcel.setClassCookie(PendingIntent.class, mWhitelistToken);
+        parcel.setClassCookie(PendingIntent.class, mAllowlistToken);
 
         when = parcel.readLong();
         creationTime = parcel.readLong();
@@ -2368,7 +2368,7 @@
      * @hide
      */
     public void cloneInto(Notification that, boolean heavy) {
-        that.mWhitelistToken = this.mWhitelistToken;
+        that.mAllowlistToken = this.mAllowlistToken;
         that.when = this.when;
         that.creationTime = this.creationTime;
         that.mSmallIcon = this.mSmallIcon;
@@ -2678,7 +2678,7 @@
     private void writeToParcelImpl(Parcel parcel, int flags) {
         parcel.writeInt(1);
 
-        parcel.writeStrongBinder(mWhitelistToken);
+        parcel.writeStrongBinder(mAllowlistToken);
         parcel.writeLong(when);
         parcel.writeLong(creationTime);
         if (mSmallIcon == null && icon != 0) {
diff --git a/core/java/android/app/PropertyInvalidatedCache.java b/core/java/android/app/PropertyInvalidatedCache.java
index 5806876..df4e8b8 100644
--- a/core/java/android/app/PropertyInvalidatedCache.java
+++ b/core/java/android/app/PropertyInvalidatedCache.java
@@ -168,8 +168,8 @@
  * this local case, there's no IPC, so use of the cache is (depending on exact
  * circumstance) unnecessary.
  *
- * For security, there is a whitelist of processes that are allowed to invalidate a cache.
- * The whitelist includes normal runtime processes but does not include test processes.
+ * For security, there is a allowlist of processes that are allowed to invalidate a cache.
+ * The allowlist includes normal runtime processes but does not include test processes.
  * Test processes must call {@code PropertyInvalidatedCache.disableForTestMode()} to disable
  * all cache activity in that process.
  *
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 95f55ab..dcb5350 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -521,7 +521,7 @@
 
     /**
      * This means that context is voice, and therefore the SearchDialog should
-     * continue showing the microphone until the user indicates that he/she does
+     * continue showing the microphone until the user indicates that they do
      * not want to re-speak (e.g. by typing).
      *
      * @hide
diff --git a/core/java/android/app/SearchableInfo.java b/core/java/android/app/SearchableInfo.java
index 83eb2ee..5388282 100644
--- a/core/java/android/app/SearchableInfo.java
+++ b/core/java/android/app/SearchableInfo.java
@@ -418,7 +418,7 @@
                     com.android.internal.R.styleable.SearchableActionKey_suggestActionMsgColumn);
             a.recycle();
 
-            // sanity check.
+            // validity check.
             if (mKeyCode == 0) {
                 throw new IllegalArgumentException("No keycode.");
             } else if ((mQueryActionMsg == null) && 
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index e599a5c..e9683a4 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -1123,7 +1123,7 @@
                 // Get the services without throwing as this is an optional feature
                 Context outerContext = ctx.getOuterContext();
                 ContentCaptureOptions options = outerContext.getContentCaptureOptions();
-                // Options is null when the service didn't whitelist the activity or package
+                // Options is null when the service didn't allowlist the activity or package
                 if (options != null && (options.lite || options.isWhitelisted(outerContext))) {
                     IBinder b = ServiceManager
                             .getService(Context.CONTENT_CAPTURE_MANAGER_SERVICE);
@@ -1133,7 +1133,7 @@
                         return new ContentCaptureManager(outerContext, service, options);
                     }
                 }
-                // When feature is disabled or app / package not whitelisted, we return a null
+                // When feature is disabled or app / package not allowlisted, we return a null
                 // manager to apps so the performance impact is practically zero
                 return null;
             }});
diff --git a/core/java/android/app/WallpaperColors.java b/core/java/android/app/WallpaperColors.java
index e4818b2..7624f35 100644
--- a/core/java/android/app/WallpaperColors.java
+++ b/core/java/android/app/WallpaperColors.java
@@ -74,7 +74,7 @@
      */
     public static final int HINT_FROM_BITMAP = 1 << 2;
 
-    // Maximum size that a bitmap can have to keep our calculations sane
+    // Maximum size that a bitmap can have to keep our calculations valid
     private static final int MAX_BITMAP_SIZE = 112;
 
     // Even though we have a maximum size, we'll mainly match bitmap sizes
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 322cac8..1fce990e 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -2051,7 +2051,7 @@
      * Enable the Home button during LockTask mode. Note that if a custom launcher is used, it has
      * to be registered as the default launcher with
      * {@link #addPersistentPreferredActivity(ComponentName, IntentFilter, ComponentName)}, and its
-     * package needs to be whitelisted for LockTask with
+     * package needs to be allowlisted for LockTask with
      * {@link #setLockTaskPackages(ComponentName, String[])}.
      *
      * @see #setLockTaskFeatures(ComponentName, int)
@@ -2092,7 +2092,7 @@
     public static final int LOCK_TASK_FEATURE_KEYGUARD = 1 << 5;
 
     /**
-     * Enable blocking of non-whitelisted activities from being started into a locked task.
+     * Enable blocking of non-allowlisted activities from being started into a locked task.
      *
      * @see #setLockTaskFeatures(ComponentName, int)
      */
@@ -4713,7 +4713,7 @@
     /**
      * Disable trust agents on secure keyguard screens (e.g. PIN/Pattern/Password).
      * By setting this flag alone, all trust agents are disabled. If the admin then wants to
-     * whitelist specific features of some trust agent, {@link #setTrustAgentConfiguration} can be
+     * allowlist specific features of some trust agent, {@link #setTrustAgentConfiguration} can be
      * used in conjuction to set trust-agent-specific configurations.
      */
     public static final int KEYGUARD_DISABLE_TRUST_AGENTS = 1 << 4;
@@ -5694,7 +5694,7 @@
      * The call will fail if called with the package name of an unsupported VPN app.
      * <p> Enabling lockdown via {@code lockdownEnabled} argument carries the risk that any failure
      * of the VPN provider could break networking for all apps. This method clears any lockdown
-     * whitelist set by {@link #setAlwaysOnVpnPackage(ComponentName, String, boolean, Set)}.
+     * allowlist set by {@link #setAlwaysOnVpnPackage(ComponentName, String, boolean, Set)}.
      *
      * @param vpnPackage The package name for an installed VPN app on the device, or {@code null} to
      *        remove an existing always-on VPN configuration.
@@ -5716,13 +5716,13 @@
      * admin to specify a set of apps that should be able to access the network directly when VPN
      * is not connected. When VPN connects these apps switch over to VPN if allowed to use that VPN.
      * System apps can always bypass VPN.
-     * <p> Note that the system doesn't update the whitelist when packages are installed or
+     * <p> Note that the system doesn't update the allowlist when packages are installed or
      * uninstalled, the admin app must call this method to keep the list up to date.
      * <p> When {@code lockdownEnabled} is false {@code lockdownWhitelist} is ignored . When
      * {@code lockdownEnabled} is {@code true} and {@code lockdownWhitelist} is {@code null} or
      * empty, only system apps can bypass VPN.
      * <p> Setting always-on VPN package to {@code null} or using
-     * {@link #setAlwaysOnVpnPackage(ComponentName, String, boolean)} clears lockdown whitelist.
+     * {@link #setAlwaysOnVpnPackage(ComponentName, String, boolean)} clears lockdown allowlist.
      *
      * @param vpnPackage package name for an installed VPN app on the device, or {@code null}
      *         to remove an existing always-on VPN configuration
@@ -7966,7 +7966,7 @@
      * {@link #setApplicationHidden(ComponentName, String, boolean)})
      *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
-     * @param packageList List of package names to whitelist
+     * @param packageList List of package names to allowlist
      * @return true if setting the restriction succeeded. It will fail if called outside a managed
      * profile
      * @throws SecurityException if {@code admin} is not a profile owner.
@@ -9067,7 +9067,7 @@
     }
 
     /**
-     * Called by device owners to set the user's master location setting.
+     * Called by device owners to set the user's global location setting.
      *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with
      * @param locationEnabled whether location should be enabled or disabled
@@ -9166,11 +9166,11 @@
     }
 
     /**
-     * Called by profile or device owners to set the master volume mute on or off.
+     * Called by profile or device owners to set the global volume mute on or off.
      * This has no effect when set on a managed profile.
      *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
-     * @param on {@code true} to mute master volume, {@code false} to turn mute off.
+     * @param on {@code true} to mute global volume, {@code false} to turn mute off.
      * @throws SecurityException if {@code admin} is not a device or profile owner.
      */
     public void setMasterVolumeMuted(@NonNull ComponentName admin, boolean on) {
@@ -9185,10 +9185,10 @@
     }
 
     /**
-     * Called by profile or device owners to check whether the master volume mute is on or off.
+     * Called by profile or device owners to check whether the global volume mute is on or off.
      *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
-     * @return {@code true} if master volume is muted, {@code false} if it's not.
+     * @return {@code true} if global volume is muted, {@code false} if it's not.
      * @throws SecurityException if {@code admin} is not a device or profile owner.
      */
     public boolean isMasterVolumeMuted(@NonNull ComponentName admin) {
@@ -9259,14 +9259,14 @@
     /**
      * Called by the profile owner of a managed profile to enable widget providers from a given
      * package to be available in the parent profile. As a result the user will be able to add
-     * widgets from the white-listed package running under the profile to a widget host which runs
+     * widgets from the allowlisted package running under the profile to a widget host which runs
      * under the parent profile, for example the home screen. Note that a package may have zero or
      * more provider components, where each component provides a different widget type.
      * <p>
-     * <strong>Note:</strong> By default no widget provider package is white-listed.
+     * <strong>Note:</strong> By default no widget provider package is allowlisted.
      *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
-     * @param packageName The package from which widget providers are white-listed.
+     * @param packageName The package from which widget providers are allowlisted.
      * @return Whether the package was added.
      * @throws SecurityException if {@code admin} is not a profile owner.
      * @see #removeCrossProfileWidgetProvider(android.content.ComponentName, String)
@@ -9290,10 +9290,10 @@
      * should have been added via
      * {@link #addCrossProfileWidgetProvider( android.content.ComponentName, String)}.
      * <p>
-     * <strong>Note:</strong> By default no widget provider package is white-listed.
+     * <strong>Note:</strong> By default no widget provider package is allowlisted.
      *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
-     * @param packageName The package from which widget providers are no longer white-listed.
+     * @param packageName The package from which widget providers are no longer allowlisted.
      * @return Whether the package was removed.
      * @throws SecurityException if {@code admin} is not a profile owner.
      * @see #addCrossProfileWidgetProvider(android.content.ComponentName, String)
@@ -9317,7 +9317,7 @@
      * available in the parent profile.
      *
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
-     * @return The white-listed package list.
+     * @return The allowlisted package list.
      * @see #addCrossProfileWidgetProvider(android.content.ComponentName, String)
      * @see #removeCrossProfileWidgetProvider(android.content.ComponentName, String)
      * @throws SecurityException if {@code admin} is not a profile owner.
@@ -11641,7 +11641,7 @@
      * called, no package is allowed to access cross-profile calendar APIs by default.
      *
      * @param admin which {@link DeviceAdminReceiver} this request is associated with
-     * @param packageNames set of packages to be whitelisted
+     * @param packageNames set of packages to be allowlisted
      * @throws SecurityException if {@code admin} is not a profile owner
      *
      * @see #getCrossProfileCalendarPackages(ComponentName)
@@ -11748,7 +11748,7 @@
     }
 
     /**
-     * Sets the set of admin-whitelisted package names that are allowed to request user consent for
+     * Sets the set of admin-allowlisted package names that are allowed to request user consent for
      * cross-profile communication.
      *
      * <p>Assumes that the caller is a profile owner and is the given {@code admin}.
@@ -11756,11 +11756,11 @@
      * <p>Previous calls are overridden by each subsequent call to this method.
      *
      * <p>Note that other apps may be able to request user consent for cross-profile communication
-     * if they have been explicitly whitelisted by the OEM.
+     * if they have been explicitly allowlisted by the OEM.
      *
      * <p>When previously-set cross-profile packages are missing from {@code packageNames}, the
      * app-op for {@code INTERACT_ACROSS_PROFILES} will be reset for those packages. This will not
-     * occur for packages that are whitelisted by the OEM.
+     * occur for packages that are allowlisted by the OEM.
      *
      * @param admin the {@link DeviceAdminReceiver} this request is associated with
      * @param packageNames the new cross-profile package names
@@ -11785,7 +11785,7 @@
      * <p>Assumes that the caller is a profile owner and is the given {@code admin}.
      *
      * <p>Note that other apps not included in the returned set may be able to request user consent
-     * for cross-profile communication if they have been explicitly whitelisted by the OEM.
+     * for cross-profile communication if they have been explicitly allowlisted by the OEM.
      *
      * @param admin the {@link DeviceAdminReceiver} this request is associated with
      * @return the set of package names the admin has previously set as allowed to request user
@@ -11816,7 +11816,7 @@
      * #vendor_cross_profile_apps}.</li>
      * </ul>
      *
-     * @return the combined set of whitelisted package names set via
+     * @return the combined set of allowlisted package names set via
      * {@link #setCrossProfilePackages(ComponentName, Set)}, {@link com.android.internal.R.array
      * #cross_profile_apps}, and {@link com.android.internal.R.array#vendor_cross_profile_apps}.
      *
diff --git a/core/java/android/app/admin/DevicePolicyManagerInternal.java b/core/java/android/app/admin/DevicePolicyManagerInternal.java
index 8f5dbc4..19242ba 100644
--- a/core/java/android/app/admin/DevicePolicyManagerInternal.java
+++ b/core/java/android/app/admin/DevicePolicyManagerInternal.java
@@ -36,36 +36,36 @@
 public abstract class DevicePolicyManagerInternal {
 
     /**
-     * Listener for changes in the white-listed packages to show cross-profile
+     * Listener for changes in the allowlisted packages to show cross-profile
      * widgets.
      */
     public interface OnCrossProfileWidgetProvidersChangeListener {
 
         /**
-         * Called when the white-listed packages to show cross-profile widgets
+         * Called when the allowlisted packages to show cross-profile widgets
          * have changed for a given user.
          *
-         * @param profileId The profile for which the white-listed packages changed.
-         * @param packages The white-listed packages.
+         * @param profileId The profile for which the allowlisted packages changed.
+         * @param packages The allowlisted packages.
          */
         public void onCrossProfileWidgetProvidersChanged(int profileId, List<String> packages);
     }
 
     /**
-     * Gets the packages whose widget providers are white-listed to be
+     * Gets the packages whose widget providers are allowlisted to be
      * available in the parent user.
      *
      * <p>This takes the DPMS lock.  DO NOT call from PM/UM/AM with their lock held.
      *
      * @param profileId The profile id.
      * @return The list of packages if such or empty list if there are
-     *    no white-listed packages or the profile id is not a managed
+     *    no allowlisted packages or the profile id is not a managed
      *    profile.
      */
     public abstract List<String> getCrossProfileWidgetProviders(int profileId);
 
     /**
-     * Adds a listener for changes in the white-listed packages to show
+     * Adds a listener for changes in the allowlisted packages to show
      * cross-profile app widgets.
      *
      * <p>This takes the DPMS lock.  DO NOT call from PM/UM/AM with their lock held.
@@ -181,7 +181,7 @@
      * {@link com.android.internal.R.array#vendor_cross_profile_apps}.</li>
      * </ul>
      *
-     * @return the combined set of whitelisted package names set via
+     * @return the combined set of allowlisted package names set via
      * {@link DevicePolicyManager#setCrossProfilePackages(ComponentName, Set)} and
      * {@link com.android.internal.R.array#cross_profile_apps} and
      * {@link com.android.internal.R.array#vendor_cross_profile_apps}
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index 1345e66..f74d16e 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -1186,13 +1186,13 @@
 
     /**
      * {@hide}
-     * Temporarily whitelist the specified app for a short duration. This is to allow an app
+     * Temporarily allowlist the specified app for a short duration. This is to allow an app
      * receiving a high priority message to be able to access the network and acquire wakelocks
      * even if the device is in power-save mode or the app is currently considered inactive.
-     * @param packageName The package name of the app to whitelist.
-     * @param duration Duration to whitelist the app for, in milliseconds. It is recommended that
+     * @param packageName The package name of the app to allowlist.
+     * @param duration Duration to allowlist the app for, in milliseconds. It is recommended that
      * this be limited to 10s of seconds. Requested duration will be clamped to a few minutes.
-     * @param user The user for whom the package should be whitelisted. Passing in a user that is
+     * @param user The user for whom the package should be allowlisted. Passing in a user that is
      * not the same as the caller's process will require the INTERACT_ACROSS_USERS permission.
      * @see #isAppInactive(String)
      *
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index f062a39..3c7d8fc 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -2470,7 +2470,7 @@
      * {@link #SOCKET_CHANNEL_AUTO_STATIC_NO_SDP} as channel number.
      *
      * @param channel RFCOMM channel to listen on
-     * @param mitm enforce man-in-the-middle protection for authentication.
+     * @param mitm enforce person-in-the-middle protection for authentication.
      * @param min16DigitPin enforce a pin key length og minimum 16 digit for sec mode 2
      * connections.
      * @return a listening RFCOMM BluetoothServerSocket
@@ -2528,7 +2528,7 @@
     /**
      * Create a listening, insecure RFCOMM Bluetooth socket with Service Record.
      * <p>The link key is not required to be authenticated, i.e the communication may be
-     * vulnerable to Man In the Middle attacks. For Bluetooth 2.1 devices,
+     * vulnerable to Person In the Middle attacks. For Bluetooth 2.1 devices,
      * the link will be encrypted, as encryption is mandartory.
      * For legacy devices (pre Bluetooth 2.1 devices) the link will not
      * be encrypted. Use {@link #listenUsingRfcommWithServiceRecord}, if an
@@ -2561,7 +2561,7 @@
      * Create a listening, encrypted,
      * RFCOMM Bluetooth socket with Service Record.
      * <p>The link will be encrypted, but the link key is not required to be authenticated
-     * i.e the communication is vulnerable to Man In the Middle attacks. Use
+     * i.e the communication is vulnerable to Person In the Middle attacks. Use
      * {@link #listenUsingRfcommWithServiceRecord}, to ensure an authenticated link key.
      * <p> Use this socket if authentication of link key is not possible.
      * For example, for Bluetooth 2.1 devices, if any of the devices does not have
@@ -2646,7 +2646,7 @@
      * {@link #SOCKET_CHANNEL_AUTO_STATIC_NO_SDP} as port number.
      *
      * @param port the PSM to listen on
-     * @param mitm enforce man-in-the-middle protection for authentication.
+     * @param mitm enforce person-in-the-middle protection for authentication.
      * @param min16DigitPin enforce a pin key length og minimum 16 digit for sec mode 2
      * connections.
      * @return An L2CAP BluetoothServerSocket
@@ -3347,7 +3347,7 @@
      * assign a dynamic PSM value. This socket can be used to listen for incoming connections. The
      * supported Bluetooth transport is LE only.
      * <p>The link key is not required to be authenticated, i.e the communication may be vulnerable
-     * to man-in-the-middle attacks. Use {@link #listenUsingL2capChannel}, if an encrypted and
+     * to person-in-the-middle attacks. Use {@link #listenUsingL2capChannel}, if an encrypted and
      * authenticated communication channel is desired.
      * <p>Use {@link BluetoothServerSocket#accept} to retrieve incoming connections from a listening
      * {@link BluetoothServerSocket}.
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 5c13c08..cf8cdd4 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -1813,7 +1813,7 @@
      * socket will be encrypted.
      * <p> Use this socket only if an authenticated socket link is possible.
      * Authentication refers to the authentication of the link key to
-     * prevent man-in-the-middle type of attacks.
+     * prevent person-in-the-middle type of attacks.
      * For example, for Bluetooth 2.1 devices, if any of the devices does not
      * have an input and output capability or just has the ability to
      * display a numeric key, a secure socket connection is not possible.
@@ -1848,7 +1848,7 @@
      * socket will be encrypted.
      * <p> Use this socket only if an authenticated socket link is possible.
      * Authentication refers to the authentication of the link key to
-     * prevent man-in-the-middle type of attacks.
+     * prevent person-in-the-middle type of attacks.
      * For example, for Bluetooth 2.1 devices, if any of the devices does not
      * have an input and output capability or just has the ability to
      * display a numeric key, a secure socket connection is not possible.
@@ -1905,7 +1905,7 @@
      * socket will be encrypted.
      * <p> Use this socket only if an authenticated socket link is possible.
      * Authentication refers to the authentication of the link key to
-     * prevent man-in-the-middle type of attacks.
+     * prevent person-in-the-middle type of attacks.
      * For example, for Bluetooth 2.1 devices, if any of the devices does not
      * have an input and output capability or just has the ability to
      * display a numeric key, a secure socket connection is not possible.
@@ -1937,7 +1937,7 @@
      * Create an RFCOMM {@link BluetoothSocket} socket ready to start an insecure
      * outgoing connection to this remote device using SDP lookup of uuid.
      * <p> The communication channel will not have an authenticated link key
-     * i.e it will be subject to man-in-the-middle attacks. For Bluetooth 2.1
+     * i.e it will be subject to person-in-the-middle attacks. For Bluetooth 2.1
      * devices, the link key will be encrypted, as encryption is mandatory.
      * For legacy devices (pre Bluetooth 2.1 devices) the link key will
      * be not be encrypted. Use {@link #createRfcommSocketToServiceRecord} if an
@@ -2193,7 +2193,7 @@
      * <p>The remote device will be authenticated and communication on this socket will be
      * encrypted.
      * <p> Use this socket if an authenticated socket link is possible. Authentication refers
-     * to the authentication of the link key to prevent man-in-the-middle type of attacks.
+     * to the authentication of the link key to prevent person-in-the-middle type of attacks.
      *
      * @param psm dynamic PSM value from remote device
      * @return a CoC #BluetoothSocket ready for an outgoing connection
@@ -2220,7 +2220,7 @@
      * <p>Use {@link BluetoothSocket#connect} to initiate the outgoing connection.
      * <p>Application using this API is responsible for obtaining PSM value from remote device.
      * <p> The communication channel may not have an authenticated link key, i.e. it may be subject
-     * to man-in-the-middle attacks. Use {@link #createL2capChannel(int)} if an encrypted and
+     * to person-in-the-middle attacks. Use {@link #createL2capChannel(int)} if an encrypted and
      * authenticated communication channel is possible.
      *
      * @param psm dynamic PSM value from remote device
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index f877f04..c58b5d2 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -134,14 +134,14 @@
     /*package*/ static final int AUTHENTICATION_NONE = 0;
 
     /**
-     * Authentication requested; no man-in-the-middle protection required.
+     * Authentication requested; no person-in-the-middle protection required.
      *
      * @hide
      */
     /*package*/ static final int AUTHENTICATION_NO_MITM = 1;
 
     /**
-     * Authentication with man-in-the-middle protection requested.
+     * Authentication with person-in-the-middle protection requested.
      *
      * @hide
      */
diff --git a/core/java/android/bluetooth/BluetoothGattCallback.java b/core/java/android/bluetooth/BluetoothGattCallback.java
index cf82a33..f718c0b 100644
--- a/core/java/android/bluetooth/BluetoothGattCallback.java
+++ b/core/java/android/bluetooth/BluetoothGattCallback.java
@@ -183,7 +183,7 @@
      * @param gatt GATT client involved
      * @param interval Connection interval used on this connection, 1.25ms unit. Valid range is from
      * 6 (7.5ms) to 3200 (4000ms).
-     * @param latency Slave latency for the connection in number of connection events. Valid range
+     * @param latency Worker latency for the connection in number of connection events. Valid range
      * is from 0 to 499
      * @param timeout Supervision timeout for this connection, in 10ms unit. Valid range is from 10
      * (0.1s) to 3200 (32s)
diff --git a/core/java/android/bluetooth/BluetoothGattCharacteristic.java b/core/java/android/bluetooth/BluetoothGattCharacteristic.java
index 7066f47..8f1b59c 100644
--- a/core/java/android/bluetooth/BluetoothGattCharacteristic.java
+++ b/core/java/android/bluetooth/BluetoothGattCharacteristic.java
@@ -84,7 +84,7 @@
     public static final int PERMISSION_READ_ENCRYPTED = 0x02;
 
     /**
-     * Characteristic permission: Allow reading with man-in-the-middle protection
+     * Characteristic permission: Allow reading with person-in-the-middle protection
      */
     public static final int PERMISSION_READ_ENCRYPTED_MITM = 0x04;
 
@@ -99,7 +99,7 @@
     public static final int PERMISSION_WRITE_ENCRYPTED = 0x20;
 
     /**
-     * Characteristic permission: Allow encrypted writes with man-in-the-middle
+     * Characteristic permission: Allow encrypted writes with person-in-the-middle
      * protection
      */
     public static final int PERMISSION_WRITE_ENCRYPTED_MITM = 0x40;
@@ -111,7 +111,7 @@
 
     /**
      * Characteristic permission: Allow signed write operations with
-     * man-in-the-middle protection
+     * person-in-the-middle protection
      */
     public static final int PERMISSION_WRITE_SIGNED_MITM = 0x100;
 
diff --git a/core/java/android/bluetooth/BluetoothGattDescriptor.java b/core/java/android/bluetooth/BluetoothGattDescriptor.java
index 7cc2d6b..49ba281 100644
--- a/core/java/android/bluetooth/BluetoothGattDescriptor.java
+++ b/core/java/android/bluetooth/BluetoothGattDescriptor.java
@@ -58,7 +58,7 @@
     public static final int PERMISSION_READ_ENCRYPTED = 0x02;
 
     /**
-     * Descriptor permission: Allow reading with man-in-the-middle protection
+     * Descriptor permission: Allow reading with person-in-the-middle protection
      */
     public static final int PERMISSION_READ_ENCRYPTED_MITM = 0x04;
 
@@ -73,7 +73,7 @@
     public static final int PERMISSION_WRITE_ENCRYPTED = 0x20;
 
     /**
-     * Descriptor permission: Allow encrypted writes with man-in-the-middle
+     * Descriptor permission: Allow encrypted writes with person-in-the-middle
      * protection
      */
     public static final int PERMISSION_WRITE_ENCRYPTED_MITM = 0x40;
@@ -85,7 +85,7 @@
 
     /**
      * Descriptor permission: Allow signed write operations with
-     * man-in-the-middle protection
+     * person-in-the-middle protection
      */
     public static final int PERMISSION_WRITE_SIGNED_MITM = 0x100;
 
diff --git a/core/java/android/bluetooth/BluetoothGattServerCallback.java b/core/java/android/bluetooth/BluetoothGattServerCallback.java
index 2c8114b..0ead5f5 100644
--- a/core/java/android/bluetooth/BluetoothGattServerCallback.java
+++ b/core/java/android/bluetooth/BluetoothGattServerCallback.java
@@ -187,7 +187,7 @@
      * @param device The remote device involved
      * @param interval Connection interval used on this connection, 1.25ms unit. Valid range is from
      * 6 (7.5ms) to 3200 (4000ms).
-     * @param latency Slave latency for the connection in number of connection events. Valid range
+     * @param latency Worker latency for the connection in number of connection events. Valid range
      * is from 0 to 499
      * @param timeout Supervision timeout for this connection, in 10ms unit. Valid range is from 10
      * (0.1s) to 3200 (32s)
diff --git a/core/java/android/bluetooth/BluetoothGattService.java b/core/java/android/bluetooth/BluetoothGattService.java
index 13d6d70..e7809ae 100644
--- a/core/java/android/bluetooth/BluetoothGattService.java
+++ b/core/java/android/bluetooth/BluetoothGattService.java
@@ -44,7 +44,7 @@
 
 
     /**
-     * The remote device his service is associated with.
+     * The remote device this service is associated with.
      * This applies to client applications only.
      *
      * @hide
diff --git a/core/java/android/bluetooth/BluetoothServerSocket.java b/core/java/android/bluetooth/BluetoothServerSocket.java
index 88c186c..5c1bcaf 100644
--- a/core/java/android/bluetooth/BluetoothServerSocket.java
+++ b/core/java/android/bluetooth/BluetoothServerSocket.java
@@ -110,7 +110,7 @@
      * @param auth require the remote device to be authenticated
      * @param encrypt require the connection to be encrypted
      * @param port remote port
-     * @param mitm enforce man-in-the-middle protection for authentication.
+     * @param mitm enforce person-in-the-middle protection for authentication.
      * @param min16DigitPin enforce a minimum length of 16 digits for a sec mode 2 connection
      * @throws IOException On error, for example Bluetooth not available, or insufficient
      * privileges
diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java
index f774369..d41a6d0 100644
--- a/core/java/android/bluetooth/BluetoothSocket.java
+++ b/core/java/android/bluetooth/BluetoothSocket.java
@@ -128,9 +128,12 @@
     private final BluetoothInputStream mInputStream;
     private final BluetoothOutputStream mOutputStream;
     private final ParcelUuid mUuid;
-    private boolean mExcludeSdp = false; /* when true no SPP SDP record will be created */
-    private boolean mAuthMitm = false;   /* when true Man-in-the-middle protection will be enabled*/
-    private boolean mMin16DigitPin = false; /* Minimum 16 digit pin for sec mode 2 connections */
+    /** when true no SPP SDP record will be created */
+    private boolean mExcludeSdp = false;
+    /** when true Person-in-the-middle protection will be enabled */
+    private boolean mAuthMitm = false;
+    /** Minimum 16 digit pin for sec mode 2 connections */
+    private boolean mMin16DigitPin = false;
     @UnsupportedAppUsage(publicAlternatives = "Use {@link BluetoothSocket} public API instead.")
     private ParcelFileDescriptor mPfd;
     @UnsupportedAppUsage
@@ -190,7 +193,7 @@
      * @param device remote device that this socket can connect to
      * @param port remote port
      * @param uuid SDP uuid
-     * @param mitm enforce man-in-the-middle protection.
+     * @param mitm enforce person-in-the-middle protection.
      * @param min16DigitPin enforce a minimum length of 16 digits for a sec mode 2 connection
      * @throws IOException On error, for example Bluetooth not available, or insufficient
      * privileges
diff --git a/core/java/android/content/AutofillOptions.java b/core/java/android/content/AutofillOptions.java
index 97b33b7..80a7b16 100644
--- a/core/java/android/content/AutofillOptions.java
+++ b/core/java/android/content/AutofillOptions.java
@@ -54,12 +54,12 @@
     public final boolean compatModeEnabled;
 
     /**
-     * Whether package is whitelisted for augmented autofill.
+     * Whether package is allowlisted for augmented autofill.
      */
     public boolean augmentedAutofillEnabled;
 
     /**
-     * List of whitelisted activities.
+     * List of allowlisted activities.
      */
     @Nullable
     public ArraySet<ComponentName> whitelistedActivitiesForAugmentedAutofill;
@@ -82,7 +82,7 @@
     }
 
     /**
-     * Returns whether activity is whitelisted for augmented autofill.
+     * Returns whether activity is allowlisted for augmented autofill.
      */
     public boolean isAugmentedAutofillEnabled(@NonNull Context context) {
         if (!augmentedAutofillEnabled) return false;
diff --git a/core/java/android/content/ContentCaptureOptions.java b/core/java/android/content/ContentCaptureOptions.java
index cb2142c..ef49e02 100644
--- a/core/java/android/content/ContentCaptureOptions.java
+++ b/core/java/android/content/ContentCaptureOptions.java
@@ -69,7 +69,7 @@
     public final int logHistorySize;
 
     /**
-     * List of activities explicitly whitelisted for content capture (or {@code null} if whitelisted
+     * List of activities explicitly allowlisted for content capture (or {@code null} if allowlisted
      * for all acitivites in the package).
      */
     @Nullable
@@ -147,7 +147,7 @@
     /** @hide */
     @VisibleForTesting
     public boolean isWhitelisted(@NonNull Context context) {
-        if (whitelistedComponents == null) return true; // whole package is whitelisted
+        if (whitelistedComponents == null) return true; // whole package is allowlisted
         final ContentCaptureClient client = context.getContentCaptureClient();
         if (client == null) {
             // Shouldn't happen, but it doesn't hurt to check...
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 31d07a0..e1e6eaa 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -3384,12 +3384,12 @@
     }
 
     /**
-     * Gets the master auto-sync setting that applies to all the providers and accounts.
+     * Gets the global auto-sync setting that applies to all the providers and accounts.
      * If this is false then the per-provider auto-sync setting is ignored.
      * <p>This method requires the caller to hold the permission
      * {@link android.Manifest.permission#READ_SYNC_SETTINGS}.
      *
-     * @return the master auto-sync setting that applies to all the providers and accounts
+     * @return the global auto-sync setting that applies to all the providers and accounts
      */
     public static boolean getMasterSyncAutomatically() {
         try {
@@ -3412,12 +3412,12 @@
     }
 
     /**
-     * Sets the master auto-sync setting that applies to all the providers and accounts.
+     * Sets the global auto-sync setting that applies to all the providers and accounts.
      * If this is false then the per-provider auto-sync setting is ignored.
      * <p>This method requires the caller to hold the permission
      * {@link android.Manifest.permission#WRITE_SYNC_SETTINGS}.
      *
-     * @param sync the master auto-sync setting that applies to all the providers and accounts
+     * @param sync the global auto-sync setting that applies to all the providers and accounts
      */
     public static void setMasterSyncAutomatically(boolean sync) {
         setMasterSyncAutomaticallyAsUser(sync, UserHandle.myUserId());
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 8472144..153e0a2 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -6080,7 +6080,7 @@
     }
 
     /**
-     * Gets the Content Capture options for this context, or {@code null} if it's not whitelisted.
+     * Gets the Content Capture options for this context, or {@code null} if it's not allowlisted.
      *
      * @hide
      */
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index ededd0d..e5d2986 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2861,7 +2861,7 @@
      * This should <em>only</em> be used to determine when the wallpaper
      * has changed to show the new wallpaper to the user.  You should certainly
      * never, in response to this, change the wallpaper or other attributes of
-     * it such as the suggested size.  That would be crazy, right?  You'd cause
+     * it such as the suggested size.  That would be unexpected, right?  You'd cause
      * all kinds of loops, especially if other apps are doing similar things,
      * right?  Of course.  So please don't do this.
      *
@@ -3975,7 +3975,7 @@
     public static final String ACTION_MASTER_CLEAR = "android.intent.action.MASTER_CLEAR";
 
     /**
-     * Broadcast intent sent by the RecoverySystem to inform listeners that a master clear (wipe)
+     * Broadcast intent sent by the RecoverySystem to inform listeners that a global clear (wipe)
      * is about to be performed.
      * @hide
      */
diff --git a/core/java/android/content/RestrictionEntry.java b/core/java/android/content/RestrictionEntry.java
index 010992c..8f08fde 100644
--- a/core/java/android/content/RestrictionEntry.java
+++ b/core/java/android/content/RestrictionEntry.java
@@ -68,7 +68,7 @@
 
     /**
      * Restriction of type "multi-select". Use this for presenting a multi-select list where more
-     * than one entry can be selected, such as for choosing specific titles to white-list.
+     * than one entry can be selected, such as for choosing specific titles to allowlist.
      * Call {@link #setChoiceEntries(String[])} and
      * {@link #setChoiceValues(String[])} to set the localized list entries to present to the user
      * and the corresponding values, respectively.
diff --git a/core/java/android/content/integrity/AppIntegrityManager.java b/core/java/android/content/integrity/AppIntegrityManager.java
index 2869abb..4db4c73 100644
--- a/core/java/android/content/integrity/AppIntegrityManager.java
+++ b/core/java/android/content/integrity/AppIntegrityManager.java
@@ -31,7 +31,7 @@
  * Class for pushing rules used to check the integrity of app installs.
  *
  * <p>Note: applications using methods of this class must be a system app and have their package
- * name whitelisted as an integrity rule provider. Otherwise a {@link SecurityException} will be
+ * name allowlisted as an integrity rule provider. Otherwise a {@link SecurityException} will be
  * thrown.
  *
  * @hide
@@ -125,7 +125,7 @@
     }
 
     /**
-     * Get the package names of all whitelisted rule providers.
+     * Get the package names of all allowlisted rule providers.
      *
      * <p>Warning: this method is only used for tests.
      *
diff --git a/core/java/android/content/pm/AndroidTestBaseUpdater.java b/core/java/android/content/pm/AndroidTestBaseUpdater.java
index 1cbbdca..b6bee42 100644
--- a/core/java/android/content/pm/AndroidTestBaseUpdater.java
+++ b/core/java/android/content/pm/AndroidTestBaseUpdater.java
@@ -17,7 +17,7 @@
 package android.content.pm;
 
 /**
- * Dummy class to maintain legacy behavior of including a class in core source to toggle
+ * Placeholder class to maintain legacy behavior of including a class in core source to toggle
  * whether or not a shared library is stripped at build time.
  *
  * @hide
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 043953d..2a78eb9 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -2007,7 +2007,7 @@
      * Updates the hidden API enforcement policy for this app from the given values, if appropriate.
      *
      * This will have no effect if this app is not subject to hidden API enforcement, i.e. if it
-     * is on the package whitelist.
+     * is on the package allowlist.
      *
      * @param policy configured policy for this app, or {@link #HIDDEN_API_ENFORCEMENT_DEFAULT}
      *        if nothing configured.
diff --git a/core/java/android/content/pm/CrossProfileApps.java b/core/java/android/content/pm/CrossProfileApps.java
index 3b6740e..8b411d5 100644
--- a/core/java/android/content/pm/CrossProfileApps.java
+++ b/core/java/android/content/pm/CrossProfileApps.java
@@ -285,7 +285,7 @@
      * </ul>
      *
      * <p>Note that in order for the user to be able to grant the consent, the requesting package
-     * must be whitelisted by the admin or the OEM and installed in the other profile. If this is
+     * must be allowlisted by the admin or the OEM and installed in the other profile. If this is
      * not the case the user will be shown a message explaining why they can't grant the consent.
      *
      * <p>Note that user consent could already be granted if given a return value of {@code true}.
@@ -310,8 +310,8 @@
      * <li>{@link #getTargetUserProfiles()} returns a non-empty list for the calling user.</li>
      * <li>The user has previously consented to cross-profile communication for the calling
      * package.</li>
-     * <li>The calling package has either been whitelisted by default by the OEM or has been
-     * explicitly whitelisted by the admin via
+     * <li>The calling package has either been allowlisted by default by the OEM or has been
+     * explicitly allowlisted by the admin via
      * {@link android.app.admin.DevicePolicyManager#setCrossProfilePackages(ComponentName, Set)}.
      * </li>
      * </ul>
@@ -430,10 +430,10 @@
      * other profile in the same profile group.
      *
      * <p>This differs from {@link #canConfigureInteractAcrossProfiles(String)} since it will
-     * not return {@code false} if the app is not whitelisted or not installed in the other profile.
+     * not return {@code false} if the app is not allowlisted or not installed in the other profile.
      *
      * <p>Note that platform-signed apps that are automatically granted the permission and are not
-     * whitelisted by the OEM will not be included in this list.
+     * allowlisted by the OEM will not be included in this list.
      *
      * @hide
      */
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index fc4ccd0..80ba7b1 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -697,7 +697,7 @@
      * installer was created.
      *
      * <p>This will
-     * {@link PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set) whitelist
+     * {@link PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set) allowlist
      * all restricted permissions}.
      *
      * @param packageName The package to install.
@@ -1701,25 +1701,25 @@
         }
 
         /**
-         * Sets which restricted permissions to be whitelisted for the app. Whitelisting
+         * Sets which restricted permissions to be allowlisted for the app. Allowlisting
          * is not granting the permissions, rather it allows the app to hold permissions
-         * which are otherwise restricted. Whitelisting a non restricted permission has
+         * which are otherwise restricted. Allowlisting a non restricted permission has
          * no effect.
          *
          * <p> Permissions can be hard restricted which means that the app cannot hold
          * them or soft restricted where the app can hold the permission but in a weaker
          * form. Whether a permission is {@link PermissionInfo#FLAG_HARD_RESTRICTED hard
          * restricted} or {@link PermissionInfo#FLAG_SOFT_RESTRICTED soft restricted}
-         * depends on the permission declaration. Whitelisting a hard restricted permission
-         * allows the app to hold that permission and whitelisting a soft restricted
+         * depends on the permission declaration. Allowlisting a hard restricted permission
+         * allows the app to hold that permission and allowlisting a soft restricted
          * permission allows the app to hold the permission in its full, unrestricted form.
          *
-         * <p> Permissions can also be immutably restricted which means that the whitelist
+         * <p> Permissions can also be immutably restricted which means that the allowlist
          * state of the permission can be determined only at install time and cannot be
          * changed on updated or at a later point via the package manager APIs.
          *
-         * <p>Initially, all restricted permissions are whitelisted but you can change
-         * which ones are whitelisted by calling this method or the corresponding ones
+         * <p>Initially, all restricted permissions are allowlisted but you can change
+         * which ones are allowlisted by calling this method or the corresponding ones
          * on the {@link PackageManager}. Only soft or hard restricted permissions on the current
          * Android version are supported and any invalid entries will be removed.
          *
@@ -2426,7 +2426,7 @@
 
         /**
          * Get the value set in {@link SessionParams#setWhitelistedRestrictedPermissions(Set)}.
-         * Note that if all permissions are whitelisted this method returns {@link
+         * Note that if all permissions are allowlisted this method returns {@link
          * SessionParams#RESTRICTED_PERMISSIONS_ALL}.
          *
          * @hide
diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java
index 5f6befd..652d241 100644
--- a/core/java/android/content/pm/PermissionInfo.java
+++ b/core/java/android/content/pm/PermissionInfo.java
@@ -371,7 +371,7 @@
      *
      * <p>This permission is restricted immutably which means that its
      * restriction state may be specified only on the first install of
-     * the app and will stay in this initial whitelist state until
+     * the app and will stay in this initial allowlist state until
      * the app is uninstalled.
      */
     public static final int FLAG_IMMUTABLY_RESTRICTED = 1<<4;
diff --git a/core/java/android/content/res/ApkAssets.java b/core/java/android/content/res/ApkAssets.java
index bc41806..0536c2b 100644
--- a/core/java/android/content/res/ApkAssets.java
+++ b/core/java/android/content/res/ApkAssets.java
@@ -368,7 +368,7 @@
             try (XmlBlock block = new XmlBlock(null, nativeXmlPtr)) {
                 XmlResourceParser parser = block.newParser();
                 // If nativeOpenXml doesn't throw, it will always return a valid native pointer,
-                // which makes newParser always return non-null. But let's be paranoid.
+                // which makes newParser always return non-null. But let's be careful.
                 if (parser == null) {
                     throw new AssertionError("block.newParser() returned a null parser");
                 }
diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java
index 15a184f..ca5aa36 100644
--- a/core/java/android/content/res/AssetManager.java
+++ b/core/java/android/content/res/AssetManager.java
@@ -1058,7 +1058,7 @@
             XmlResourceParser parser = block.newParser();
             // If openXmlBlockAsset doesn't throw, it will always return an XmlBlock object with
             // a valid native pointer, which makes newParser always return non-null. But let's
-            // be paranoid.
+            // be careful.
             if (parser == null) {
                 throw new AssertionError("block.newParser() returned a null parser");
             }
diff --git a/core/java/android/hardware/biometrics/BiometricAuthenticator.java b/core/java/android/hardware/biometrics/BiometricAuthenticator.java
index 11cf2d6..b3d74f7 100644
--- a/core/java/android/hardware/biometrics/BiometricAuthenticator.java
+++ b/core/java/android/hardware/biometrics/BiometricAuthenticator.java
@@ -32,7 +32,7 @@
 
     /**
      * No biometric methods or nothing has been enrolled.
-     * Move/expose these in BiometricPrompt if we ever want to allow applications to "blacklist"
+     * Move/expose these in BiometricPrompt if we ever want to allow applications to "denylist"
      * modalities when calling authenticate().
      * @hide
      */
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index c5a11abe..1c5df48 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -452,20 +452,20 @@
     /**
      * An opaque {@link Binder} token of window requesting {@link InputMethodImpl#showSoftInput}
      * The original app window token is passed from client app window.
-     * {@link com.android.server.inputmethod.InputMethodManagerService} creates a unique dummy
-     * token to identify this window.
-     * This dummy token is only valid for a single call to {@link InputMethodImpl#showSoftInput},
-     * after which it is set null until next call.
+     * {@link com.android.server.inputmethod.InputMethodManagerService} creates a unique
+     * placeholder token to identify this window.
+     * This placeholder token is only valid for a single call to
+     * {@link InputMethodImpl#showSoftInput}, after which it is set null until next call.
      */
     private IBinder mCurShowInputToken;
 
     /**
      * An opaque {@link Binder} token of window requesting {@link InputMethodImpl#hideSoftInput}
      * The original app window token is passed from client app window.
-     * {@link com.android.server.inputmethod.InputMethodManagerService} creates a unique dummy
-     * token to identify this window.
-     * This dummy token is only valid for a single call to {@link InputMethodImpl#hideSoftInput},
-     * after which it is set {@code null} until next call.
+     * {@link com.android.server.inputmethod.InputMethodManagerService} creates a unique
+     * placeholder token to identify this window.
+     * This placeholder token is only valid for a single call to
+     * {@link InputMethodImpl#hideSoftInput}, after which it is set {@code null} until next call.
      */
     private IBinder mCurHideInputToken;
 
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index 1922b6d..e9e242e 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -84,7 +84,7 @@
      * The RULE_xxx_ALL rules applies to all networks (metered or non-metered), but on
      * metered networks, the RULE_xxx_METERED rules should be checked first. For example,
      * if the device is on Battery Saver Mode and Data Saver Mode simulatenously, and a uid
-     * is whitelisted for the former but not the latter, its status would be
+     * is allowlisted for the former but not the latter, its status would be
      * RULE_REJECT_METERED | RULE_ALLOW_ALL, meaning it could have access to non-metered
      * networks but not to metered networks.
      *
diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java
index 8b6ac42..e511458 100644
--- a/core/java/android/net/SSLCertificateSocketFactory.java
+++ b/core/java/android/net/SSLCertificateSocketFactory.java
@@ -66,7 +66,7 @@
  * must verify the identity of the server you are connected to.
  *
  * <p class="caution"><b>Most {@link SSLSocketFactory} implementations do not
- * verify the server's identity, allowing man-in-the-middle attacks.</b>
+ * verify the server's identity, allowing person-in-the-middle attacks.</b>
  * This implementation does check the server's certificate hostname, but only
  * for createSocket variants that specify a hostname.  When using methods that
  * use {@link InetAddress} or which return an unconnected socket, you MUST
@@ -176,7 +176,7 @@
      * disabled, using an optional handshake timeout and SSL session cache.
      *
      * <p class="caution"><b>Warning:</b> Sockets created using this factory
-     * are vulnerable to man-in-the-middle attacks!</p>
+     * are vulnerable to person-in-the-middle attacks!</p>
      *
      * @param handshakeTimeoutMillis to use for SSL connection handshake, or 0
      *         for none.  The socket timeout is reset to 0 after the handshake.
@@ -508,7 +508,7 @@
      *
      * <p class="caution"><b>Warning:</b> Hostname verification is not performed
      * with this method.  You MUST verify the server's identity after connecting
-     * the socket to avoid man-in-the-middle attacks.</p>
+     * the socket to avoid person-in-the-middle attacks.</p>
      */
     @Override
     public Socket createSocket() throws IOException {
@@ -527,7 +527,7 @@
      *
      * <p class="caution"><b>Warning:</b> Hostname verification is not performed
      * with this method.  You MUST verify the server's identity after connecting
-     * the socket to avoid man-in-the-middle attacks.</p>
+     * the socket to avoid person-in-the-middle attacks.</p>
      */
     @Override
     public Socket createSocket(InetAddress addr, int port, InetAddress localAddr, int localPort)
@@ -548,7 +548,7 @@
      *
      * <p class="caution"><b>Warning:</b> Hostname verification is not performed
      * with this method.  You MUST verify the server's identity after connecting
-     * the socket to avoid man-in-the-middle attacks.</p>
+     * the socket to avoid person-in-the-middle attacks.</p>
      */
     @Override
     public Socket createSocket(InetAddress addr, int port) throws IOException {
diff --git a/core/java/android/net/apf/ApfCapabilities.java b/core/java/android/net/apf/ApfCapabilities.java
index b1de74e..92c5432 100644
--- a/core/java/android/net/apf/ApfCapabilities.java
+++ b/core/java/android/net/apf/ApfCapabilities.java
@@ -127,7 +127,7 @@
     }
 
     /**
-     * @return An array of blacklisted EtherType, packets with EtherTypes within it will be dropped.
+     * @return An array of denylisted EtherType, packets with EtherTypes within it will be dropped.
      */
     public static @NonNull int[] getApfEtherTypeBlackList() {
         return Resources.getSystem().getIntArray(R.array.config_apfEthTypeBlackList);
diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java
index 7bf82e8..b138a3f 100644
--- a/core/java/android/nfc/cardemulation/CardEmulation.java
+++ b/core/java/android/nfc/cardemulation/CardEmulation.java
@@ -57,7 +57,7 @@
     /**
      * Activity action: ask the user to change the default
      * card emulation service for a certain category. This will
-     * show a dialog that asks the user whether he wants to
+     * show a dialog that asks the user whether they want to
      * replace the current default service with the service
      * identified with the ComponentName specified in
      * {@link #EXTRA_SERVICE_COMPONENT}, for the category
@@ -113,7 +113,7 @@
      *
      * <p>In this mode, when using ISO-DEP card emulation with {@link HostApduService}
      *    or {@link OffHostApduService}, whenever an Application ID (AID) of this category
-     *    is selected, the user is asked which service he wants to use to handle
+     *    is selected, the user is asked which service they want to use to handle
      *    the transaction, even if there is only one matching service.
      */
     public static final int SELECTION_MODE_ALWAYS_ASK = 1;
@@ -286,7 +286,7 @@
      * <p>{@link #SELECTION_MODE_PREFER_DEFAULT} the user has requested a default
      *    service for this category, which will be preferred.
      * <p>{@link #SELECTION_MODE_ALWAYS_ASK} the user has requested to be asked
-     *    every time what service he would like to use in this category.
+     *    every time what service they would like to use in this category.
      * <p>{@link #SELECTION_MODE_ASK_IF_CONFLICT} the user will only be asked
      *    to pick a service if there is a conflict.
      * @param category The category, for example {@link #CATEGORY_PAYMENT}
diff --git a/core/java/android/nfc/cardemulation/HostApduService.java b/core/java/android/nfc/cardemulation/HostApduService.java
index 9208d63..55d0e73 100644
--- a/core/java/android/nfc/cardemulation/HostApduService.java
+++ b/core/java/android/nfc/cardemulation/HostApduService.java
@@ -372,7 +372,7 @@
      * from a remote device. A response APDU can be provided directly
      * by returning a byte-array in this method. Note that in general
      * response APDUs must be sent as quickly as possible, given the fact
-     * that the user is likely holding his device over an NFC reader
+     * that the user is likely holding their device over an NFC reader
      * when this method is called.
      *
      * <p class="note">If there are multiple services that have registered for the same
diff --git a/core/java/android/nfc/cardemulation/HostNfcFService.java b/core/java/android/nfc/cardemulation/HostNfcFService.java
index fd0d8ad..65b5ca7 100644
--- a/core/java/android/nfc/cardemulation/HostNfcFService.java
+++ b/core/java/android/nfc/cardemulation/HostNfcFService.java
@@ -256,7 +256,7 @@
      * from a remote device. A response packet can be provided directly
      * by returning a byte-array in this method. Note that in general
      * response packets must be sent as quickly as possible, given the fact
-     * that the user is likely holding his device over an NFC reader
+     * that the user is likely holding their device over an NFC reader
      * when this method is called.
      *
      * <p class="note">This method is running on the main thread of your application.
diff --git a/core/java/android/os/BaseBundle.java b/core/java/android/os/BaseBundle.java
index 81deba4..1d28489 100644
--- a/core/java/android/os/BaseBundle.java
+++ b/core/java/android/os/BaseBundle.java
@@ -1613,7 +1613,7 @@
             return;
         }
         int lengthPos = parcel.dataPosition();
-        parcel.writeInt(-1); // dummy, will hold length
+        parcel.writeInt(-1); // placeholder, will hold length
         parcel.writeInt(BUNDLE_MAGIC);
 
         int startPos = parcel.dataPosition();
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index fbe6a50..48d3267 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -1776,7 +1776,7 @@
         public static final int EVENT_PACKAGE_INACTIVE = 0x000f;
         // Event for a package becoming active due to an interaction.
         public static final int EVENT_PACKAGE_ACTIVE = 0x0010;
-        // Event for a package being on the temporary whitelist.
+        // Event for a package being on the temporary allowlist.
         public static final int EVENT_TEMP_WHITELIST = 0x0011;
         // Event for the screen waking up.
         public static final int EVENT_SCREEN_WAKE_UP = 0x0012;
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index be2de0e..f3e3ff9 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -1795,8 +1795,8 @@
     }
 
     /**
-     * Return whether the given application package name is on the device's power whitelist.
-     * Apps can be placed on the whitelist through the settings UI invoked by
+     * Return whether the given application package name is on the device's power allowlist.
+     * Apps can be placed on the allowlist through the settings UI invoked by
      * {@link android.provider.Settings#ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS}.
      */
     public boolean isIgnoringBatteryOptimizations(String packageName) {
@@ -2219,7 +2219,7 @@
             = "android.os.action.LIGHT_DEVICE_IDLE_MODE_CHANGED";
 
     /**
-     * @hide Intent that is broadcast when the set of power save whitelist apps has changed.
+     * @hide Intent that is broadcast when the set of power save allowlist apps has changed.
      * This broadcast is only sent to registered receivers.
      */
     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
@@ -2227,7 +2227,7 @@
             = "android.os.action.POWER_SAVE_WHITELIST_CHANGED";
 
     /**
-     * @hide Intent that is broadcast when the set of temporarily whitelisted apps has changed.
+     * @hide Intent that is broadcast when the set of temporarily allowlisted apps has changed.
      * This broadcast is only sent to registered receivers.
      */
     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index a4077fb..52dd865 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -614,7 +614,7 @@
      *                             started.
      * @param pkgDataInfoMap Map from related package names to private data directory
      *                       volume UUID and inode number.
-     * @param whitelistedDataInfoMap Map from whitelisted package names to private data directory
+     * @param whitelistedDataInfoMap Map from allowlisted package names to private data directory
      *                       volume UUID and inode number.
      * @param bindMountAppsData whether zygote needs to mount CE and DE data.
      * @param bindMountAppStorageDirs whether zygote needs to mount Android/obb and Android/data.
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index 257bc5b..6c5b04a6 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -2500,7 +2500,7 @@
      * that happens while this span is active. You must call finish() on the span when done.
      *
      * <p>This will never return null, but on devices without debugging enabled, this may return a
-     * dummy object on which the finish() method is a no-op.
+     * placeholder object on which the finish() method is a no-op.
      *
      * <p>TODO: add CloseGuard to this, verifying callers call finish.
      *
diff --git a/core/java/android/os/UpdateEngine.java b/core/java/android/os/UpdateEngine.java
index e907e22..5a48242 100644
--- a/core/java/android/os/UpdateEngine.java
+++ b/core/java/android/os/UpdateEngine.java
@@ -109,7 +109,7 @@
          * Error code: an update failed to apply due to a mismatch in payload
          * hash.
          *
-         * <p>Update engine does sanity checks for the given payload and its
+         * <p>Update engine does validity checks for the given payload and its
          * metadata.
          */
         public static final int PAYLOAD_HASH_MISMATCH_ERROR = 10;
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 2465b0e..5fd37c8 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -831,7 +831,7 @@
     public static final String DISALLOW_UNMUTE_MICROPHONE = "no_unmute_microphone";
 
     /**
-     * Specifies if a user is disallowed from adjusting the master volume. If set, the master volume
+     * Specifies if a user is disallowed from adjusting the global volume. If set, the global volume
      * will be muted. This can be set by device owners from API 21 and profile owners from API 24.
      * The default value is <code>false</code>.
      *
@@ -1057,7 +1057,7 @@
     public static final String DISALLOW_CAMERA = "no_camera";
 
     /**
-     * Specifies if a user is not allowed to unmute the device's master volume.
+     * Specifies if a user is not allowed to unmute the device's global volume.
      *
      * @see DevicePolicyManager#setMasterVolumeMuted(ComponentName, boolean)
      * @see DevicePolicyManager#clearUserRestriction(ComponentName, String)
diff --git a/core/java/android/os/WorkSource.java b/core/java/android/os/WorkSource.java
index 6adba63..a1b4dc3 100644
--- a/core/java/android/os/WorkSource.java
+++ b/core/java/android/os/WorkSource.java
@@ -1133,7 +1133,7 @@
         ArrayList<WorkChain> newChains = null;
         ArrayList<WorkChain> goneChains = null;
 
-        // TODO(narayan): This is a dumb O(M*N) algorithm that determines what has changed across
+        // TODO(narayan): This is a naive O(M*N) algorithm that determines what has changed across
         // WorkSource objects. We can replace this with something smarter, for e.g by defining
         // a Comparator between WorkChains. It's unclear whether that will be more efficient if
         // the number of chains associated with a WorkSource is expected to be small
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index e39e22e..77e724b 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -333,7 +333,7 @@
      *                             started.
      * @param pkgDataInfoMap Map from related package names to private data directory
      *                       volume UUID and inode number.
-     * @param whitelistedDataInfoMap Map from whitelisted package names to private data directory
+     * @param whitelistedDataInfoMap Map from allowlisted package names to private data directory
      *                       volume UUID and inode number.
      * @param bindMountAppsData whether zygote needs to mount CE and DE data.
      * @param bindMountAppStorageDirs whether zygote needs to mount Android/obb and Android/data.
@@ -615,7 +615,7 @@
      * @param disabledCompatChanges a list of disabled compat changes for the process being started.
      * @param pkgDataInfoMap Map from related package names to private data directory volume UUID
      *                       and inode number.
-     * @param whitelistedDataInfoMap Map from whitelisted package names to private data directory
+     * @param whitelistedDataInfoMap Map from allowlisted package names to private data directory
      *                       volume UUID and inode number.
      * @param bindMountAppsData whether zygote needs to mount CE and DE data.
      * @param bindMountAppStorageDirs whether zygote needs to mount Android/obb and Android/data.
diff --git a/core/java/android/os/incremental/IncrementalFileStorages.java b/core/java/android/os/incremental/IncrementalFileStorages.java
index 31ccf95..dcbbd71 100644
--- a/core/java/android/os/incremental/IncrementalFileStorages.java
+++ b/core/java/android/os/incremental/IncrementalFileStorages.java
@@ -69,7 +69,7 @@
             @Nullable StorageHealthCheckParams healthCheckParams,
             @Nullable IStorageHealthListener healthListener,
             List<InstallationFileParcel> addedFiles) throws IOException {
-        // TODO(b/136132412): sanity check if session should not be incremental
+        // TODO(b/136132412): validity check if session should not be incremental
         IncrementalManager incrementalManager = (IncrementalManager) context.getSystemService(
                 Context.INCREMENTAL_SERVICE);
         if (incrementalManager == null) {
diff --git a/core/java/android/os/incremental/V4Signature.java b/core/java/android/os/incremental/V4Signature.java
index d35ce5b..0702c01 100644
--- a/core/java/android/os/incremental/V4Signature.java
+++ b/core/java/android/os/incremental/V4Signature.java
@@ -31,7 +31,7 @@
 
 /**
  * V4 signature fields.
- * Keep in sync with APKSig master copy.
+ * Keep in sync with APKSig authoritative copy.
  * @hide
  */
 public class V4Signature {
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java
index bf3d46f..b1107a1 100644
--- a/core/java/android/permission/PermissionManager.java
+++ b/core/java/android/permission/PermissionManager.java
@@ -153,7 +153,7 @@
      * Get set of permissions that have been split into more granular or dependent permissions.
      *
      * <p>E.g. before {@link android.os.Build.VERSION_CODES#Q} an app that was granted
-     * {@link Manifest.permission#ACCESS_COARSE_LOCATION} could access he location while it was in
+     * {@link Manifest.permission#ACCESS_COARSE_LOCATION} could access the location while it was in
      * foreground and background. On platforms after {@link android.os.Build.VERSION_CODES#Q}
      * the location permission only grants location access while the app is in foreground. This
      * would break apps that target before {@link android.os.Build.VERSION_CODES#Q}. Hence whenever
diff --git a/core/java/android/print/PrintDocumentInfo.java b/core/java/android/print/PrintDocumentInfo.java
index e10c507..b988461 100644
--- a/core/java/android/print/PrintDocumentInfo.java
+++ b/core/java/android/print/PrintDocumentInfo.java
@@ -32,7 +32,7 @@
  * purposes. This meta-data is used by the platform and print services,
  * components that interact with printers. For example, this class
  * contains the number of pages contained in the document it describes and
- * this number of pages is shown to the user allowing him/her to select
+ * this number of pages is shown to the user allowing them to select
  * the range to print. Also a print service may optimize the printing
  * process based on the content type, such as document or photo.
  * <p>
diff --git a/core/java/android/printservice/recommendation/RecommendationService.java b/core/java/android/printservice/recommendation/RecommendationService.java
index 968a625..c6d4f25 100644
--- a/core/java/android/printservice/recommendation/RecommendationService.java
+++ b/core/java/android/printservice/recommendation/RecommendationService.java
@@ -74,10 +74,10 @@
             @Override
             public void registerCallbacks(IRecommendationServiceCallbacks callbacks) {
                 // The callbacks come in order of the caller on oneway calls. Hence while the caller
-                // cannot know at what time the connection is made, he can know the ordering of
+                // cannot know at what time the connection is made, they can know the ordering of
                 // connection and disconnection.
                 //
-                // Similar he cannot know when the disconnection is processed, hence he has to
+                // Similar they cannot know when the disconnection is processed, hence they have to
                 // handle callbacks after calling disconnect.
                 if (callbacks != null) {
                     mHandler.obtainMessage(MyHandler.MSG_CONNECT, callbacks).sendToTarget();
diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java
index 17fae1c..e1aa21e 100644
--- a/core/java/android/provider/CalendarContract.java
+++ b/core/java/android/provider/CalendarContract.java
@@ -188,7 +188,7 @@
      * notified when there is a change in the managed profile calendar provider.
      *
      * <p>Throw UnsupportedOperationException if another profile doesn't exist or is disabled, or
-     * if the calling package is not whitelisted to access cross-profile calendar, or if the
+     * if the calling package is not allowlisted to access cross-profile calendar, or if the
      * feature has been disabled by the user in Settings.
      *
      * @see Events#ENTERPRISE_CONTENT_URI
diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java
index 327bca2..1a59e8d 100644
--- a/core/java/android/provider/DocumentsProvider.java
+++ b/core/java/android/provider/DocumentsProvider.java
@@ -165,7 +165,7 @@
     public void attachInfo(Context context, ProviderInfo info) {
         registerAuthority(info.authority);
 
-        // Sanity check our setup
+        // Validity check our setup
         if (!info.exported) {
             throw new SecurityException("Provider must be exported");
         }
diff --git a/core/java/android/provider/SearchIndexablesProvider.java b/core/java/android/provider/SearchIndexablesProvider.java
index f4d0cb4..85c0ba1 100644
--- a/core/java/android/provider/SearchIndexablesProvider.java
+++ b/core/java/android/provider/SearchIndexablesProvider.java
@@ -100,7 +100,7 @@
         mMatcher.addURI(mAuthority, SearchIndexablesContract.DYNAMIC_INDEXABLES_RAW_PATH,
                 MATCH_DYNAMIC_RAW_CODE);
 
-        // Sanity check our setup
+        // Validity check our setup
         if (!info.exported) {
             throw new SecurityException("Provider must be exported");
         }
diff --git a/core/java/android/se/omapi/Channel.java b/core/java/android/se/omapi/Channel.java
index 5db3c1a..90ce11a 100644
--- a/core/java/android/se/omapi/Channel.java
+++ b/core/java/android/se/omapi/Channel.java
@@ -234,7 +234,7 @@
      * response of the SELECT command.
 
      * @return <code>true</code> if new Applet was selected on this channel.
-               <code>false</code> he already selected Applet stays selected on this channel.
+               <code>false</code> the already selected Applet stays selected on this channel.
      *
      * @throws IOException if there is a communication problem to the reader or the Secure Element.
      * @throws IllegalStateException if the channel is used after being closed.
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index bc08b84..b1107a8 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -501,7 +501,7 @@
          * Disables autofill for the app or activity.
          *
          * <p>This method is useful to optimize performance in cases where the service knows it
-         * can not autofill an app&mdash;for example, when the service has a list of "blacklisted"
+         * can not autofill an app&mdash;for example, when the service has a list of "denylisted"
          * apps such as office suites.
          *
          * <p>By default, it disables autofill for all activities in the app, unless the response is
diff --git a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java
index 95cc64a..620c457 100644
--- a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java
+++ b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java
@@ -204,7 +204,7 @@
      * <ul>
      *   <li>Service does not recognize what should be autofilled.
      *   <li>Service does not have data to fill the request.
-     *   <li>Service blacklisted that app (or activity) for autofill.
+     *   <li>Service denylisted that app (or activity) for autofill.
      *   <li>App disabled itself for autofill.
      * </ul>
      *
diff --git a/core/java/android/service/contentcapture/ContentCaptureService.java b/core/java/android/service/contentcapture/ContentCaptureService.java
index b1f147b..84f6028 100644
--- a/core/java/android/service/contentcapture/ContentCaptureService.java
+++ b/core/java/android/service/contentcapture/ContentCaptureService.java
@@ -231,7 +231,7 @@
     /**
      * Explicitly limits content capture to the given packages and activities.
      *
-     * <p>To reset the whitelist, call it passing {@code null} to both arguments.
+     * <p>To reset the allowlist, call it passing {@code null} to both arguments.
      *
      * <p>Useful when the service wants to restrict content capture to a category of apps, like
      * chat apps. For example, if the service wants to support view captures on all activities of
@@ -367,7 +367,7 @@
      * Notifies the service of an activity-level event that is not associated with a session.
      *
      * <p>This method can be used to track some high-level events for all activities, even those
-     * that are not whitelisted for Content Capture.
+     * that are not allowlisted for Content Capture.
      *
      * @param event high-level activity event
      */
diff --git a/core/java/android/service/dreams/Sandman.java b/core/java/android/service/dreams/Sandman.java
index f2cedbc..ced2a01 100644
--- a/core/java/android/service/dreams/Sandman.java
+++ b/core/java/android/service/dreams/Sandman.java
@@ -37,7 +37,7 @@
     private static final String TAG = "Sandman";
 
 
-    // The sandman is eternal.  No one instantiates him.
+    // The sandman is eternal.  No one instantiates them.
     private Sandman() {
     }
 
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 408e850..dee9ac4 100644
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -835,7 +835,7 @@
 
         // NOTE: The API currently does not allow the caller to query whether
         // they are actually connected to any engine. This might fail for various
-        // reasons like if the user disables all her TTS engines.
+        // reasons like if the user disables all their TTS engines.
 
         mCurrentEngine = null;
         dispatchOnInit(ERROR);
diff --git a/core/java/android/text/format/Time.java b/core/java/android/text/format/Time.java
index 5b5c854..f19e7d2 100644
--- a/core/java/android/text/format/Time.java
+++ b/core/java/android/text/format/Time.java
@@ -345,9 +345,9 @@
     }
 
     /**
-     * Print the current value given the format string provided. See man
-     * strftime for what means what. The final string must be less than 256
-     * characters.
+     * Print the current value given the format string provided. See
+     * strftime(3) manual page for what means what. The final string must be
+     * less than 256 characters.
      * @param format a string containing the desired format.
      * @return a String containing the current time expressed in the current locale.
      */
diff --git a/core/java/android/util/LongSparseArray.java b/core/java/android/util/LongSparseArray.java
index 55542d8..eefb156 100644
--- a/core/java/android/util/LongSparseArray.java
+++ b/core/java/android/util/LongSparseArray.java
@@ -495,7 +495,7 @@
             array.mKeys = source.createLongArray();
             array.mValues = source.createStringArray();
 
-            // Make sure array is sane
+            // Make sure array is valid
             Preconditions.checkArgument(array.mKeys.length >= size);
             Preconditions.checkArgument(array.mValues.length >= size);
 
diff --git a/core/java/android/util/LongSparseLongArray.java b/core/java/android/util/LongSparseLongArray.java
index c05dd9d..f23ec91 100644
--- a/core/java/android/util/LongSparseLongArray.java
+++ b/core/java/android/util/LongSparseLongArray.java
@@ -316,7 +316,7 @@
             array.mKeys = source.createLongArray();
             array.mValues = source.createLongArray();
 
-            // Make sure array is sane
+            // Make sure array is valid
             Preconditions.checkArgument(array.mKeys.length >= size);
             Preconditions.checkArgument(array.mValues.length >= size);
 
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index f937bc9..795d13f 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -506,7 +506,7 @@
         // It's possible to create a SurfaceView using the default constructor and never
         // attach it to a view hierarchy, this is a common use case when dealing with
         // OpenGL. A developer will probably create a new GLSurfaceView, and let it manage
-        // the lifecycle. Instead of attaching it to a view, he/she can just pass
+        // the lifecycle. Instead of attaching it to a view, they can just pass
         // the SurfaceHolder forward, most live wallpapers do it.
         if (viewRoot != null) {
             viewRoot.removeSurfaceChangedCallback(this);
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 77fedd7..3cdf61c 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -7025,7 +7025,7 @@
         // Parent asked to see how big we want to be
         case MeasureSpec.UNSPECIFIED:
             if (childDimension >= 0) {
-                // Child wants a specific size... let him have it
+                // Child wants a specific size... let them have it
                 resultSize = childDimension;
                 resultMode = MeasureSpec.EXACTLY;
             } else if (childDimension == LayoutParams.MATCH_PARENT) {
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index fbfeda6..10803cd 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -509,7 +509,7 @@
 
     /**
      * Views that were otherwised not important for autofill but triggered a session because the
-     * context is whitelisted for augmented autofill.
+     * context is allowlisted for augmented autofill.
      */
     @GuardedBy("mLock")
     @Nullable private Set<AutofillId> mEnteredForAugmentedAutofillIds;
@@ -2032,7 +2032,7 @@
     /**
      * Explicitly limits augmented autofill to the given packages and activities.
      *
-     * <p>To reset the whitelist, call it passing {@code null} to both arguments.
+     * <p>To reset the allowlist, call it passing {@code null} to both arguments.
      *
      * <p>Useful when the service wants to restrict augmented autofill to a category of apps, like
      * apps that uses addresses. For example, if the service wants to support augmented autofill on
@@ -2079,7 +2079,7 @@
     }
 
     /**
-     * Notifies that a non-autofillable view was entered because the activity is whitelisted for
+     * Notifies that a non-autofillable view was entered because the activity is allowlisted for
      * augmented autofill.
      *
      * <p>This method is necessary to set the right flag on start, so the server-side session
diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java
index 484b1c1..029552d 100644
--- a/core/java/android/view/contentcapture/ContentCaptureManager.java
+++ b/core/java/android/view/contentcapture/ContentCaptureManager.java
@@ -81,7 +81,7 @@
  *   <a href="https://source.android.com/compatibility/cdd">CDD requirements</a>.
  *   <li><b>Performance:</b> content capture is highly optimized to minimize its impact in the app
  *   jankiness and overall device system health. For example, its only enabled on apps (or even
- *   specific activities from an app) that were explicitly whitelisted by the intelligence service,
+ *   specific activities from an app) that were explicitly allowlisted by the intelligence service,
  *   and it buffers the events so they are sent in a batch to the service (see
  *   {@link #isContentCaptureEnabled()} for other cases when its disabled).
  * </ul>
@@ -495,7 +495,7 @@
     /**
      * Gets the (optional) intent used to launch the service-specific settings.
      *
-     * <p>This method is static because it's called by Settings, which might not be whitelisted
+     * <p>This method is static because it's called by Settings, which might not be allowlisted
      * for content capture (in which case the ContentCaptureManager on its context would be null).
      *
      * @hide
@@ -530,8 +530,8 @@
      * <p>There are many reasons it could be disabled, such as:
      * <ul>
      *   <li>App itself disabled content capture through {@link #setContentCaptureEnabled(boolean)}.
-     *   <li>Intelligence service did not whitelist content capture for this activity's package.
-     *   <li>Intelligence service did not whitelist content capture for this specific activity.
+     *   <li>Intelligence service did not allowlist content capture for this activity's package.
+     *   <li>Intelligence service did not allowlist content capture for this specific activity.
      *   <li>Intelligence service disabled content capture globally.
      *   <li>User disabled content capture globally through the Android Settings app.
      *   <li>Device manufacturer (OEM) disabled content capture globally.
@@ -566,7 +566,7 @@
     public Set<ContentCaptureCondition> getContentCaptureConditions() {
         // NOTE: we could cache the conditions on ContentCaptureOptions, but then it would be stick
         // to the lifetime of the app. OTOH, by dynamically calling the server every time, we allow
-        // the service to fine tune how long-lived apps (like browsers) are whitelisted.
+        // the service to fine tune how long-lived apps (like browsers) are allowlisted.
         if (!isContentCaptureEnabled() && !mOptions.lite) return null;
 
         final SyncResultReceiver resultReceiver = syncRun(
diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java
index 3f5ef5a..34068e0 100644
--- a/core/java/android/view/contentcapture/ContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/ContentCaptureSession.java
@@ -127,7 +127,7 @@
     public static final int STATE_INTERNAL_ERROR = 0x100;
 
     /**
-     * Session is disabled because service didn't whitelist package or activity.
+     * Session is disabled because service didn't allowlist package or activity.
      *
      * @hide
      */
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java
index c43beea..0535365 100644
--- a/core/java/android/view/contentcapture/MainContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java
@@ -397,7 +397,7 @@
                         + " after " + numberEvents + " delayed events");
             }
             resetSession(STATE_DISABLED | STATE_NO_RESPONSE);
-            // TODO(b/111276913): blacklist activity / use special flag to indicate that
+            // TODO(b/111276913): denylist activity / use special flag to indicate that
             // when it's launched again
             return;
         }
diff --git a/core/java/android/view/inputmethod/InputMethod.java b/core/java/android/view/inputmethod/InputMethod.java
index 869a929..f44ab3a 100644
--- a/core/java/android/view/inputmethod/InputMethod.java
+++ b/core/java/android/view/inputmethod/InputMethod.java
@@ -382,7 +382,7 @@
 
     /**
      * Update token of the client window requesting {@link #showSoftInput(int, ResultReceiver)}
-     * @param showInputToken dummy app window token for window requesting
+     * @param showInputToken placeholder app window token for window requesting
      *        {@link InputMethodManager#showSoftInput(View, int)}
      * @hide
      */
@@ -390,7 +390,7 @@
 
     /**
      * Update token of the client window requesting {@link #hideSoftInput(int, ResultReceiver)}
-     * @param hideInputToken dummy app window token for window requesting
+     * @param hideInputToken placeholder app window token for window requesting
      *        {@link InputMethodManager#hideSoftInputFromWindow(IBinder, int)}
      * @hide
      */
diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java
index 11a6acf..67ed30f 100644
--- a/core/java/android/widget/AbsSeekBar.java
+++ b/core/java/android/widget/AbsSeekBar.java
@@ -1026,7 +1026,7 @@
     }
 
     /**
-     * This is called when the user either releases his touch or the touch is
+     * This is called when the user either releases their touch or the touch is
      * canceled.
      */
     void onStopTrackingTouch() {
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index c1c1a6e..6aa4e46 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -483,7 +483,7 @@
     /**
      * Returns whether the spinners are shown.
      * <p>
-     * <strong>Note:</strong> his method returns {@code false} when the
+     * <strong>Note:</strong> this method returns {@code false} when the
      * {@link android.R.styleable#DatePicker_datePickerMode} attribute is set
      * to {@code calendar}.
      *
diff --git a/core/java/android/widget/ExpandableListView.java b/core/java/android/widget/ExpandableListView.java
index bdfb550..51869d4 100644
--- a/core/java/android/widget/ExpandableListView.java
+++ b/core/java/android/widget/ExpandableListView.java
@@ -1007,7 +1007,7 @@
 
             flatChildPos = mConnector.getFlattenedPos(elChildPos);
 
-            // Sanity check
+            // Validity check
             if (flatChildPos == null) {
                 throw new IllegalStateException("Could not find child");
             }
diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java
index b33660a..3bb39c1 100644
--- a/core/java/android/widget/HorizontalScrollView.java
+++ b/core/java/android/widget/HorizontalScrollView.java
@@ -123,7 +123,7 @@
     /**
      * True if the user is currently dragging this ScrollView around. This is
      * not the same as 'is being flinged', which can be checked by
-     * mScroller.isFinished() (flinging begins when the user lifts his finger).
+     * mScroller.isFinished() (flinging begins when the user lifts their finger).
      */
     @UnsupportedAppUsage
     private boolean mIsBeingDragged = false;
@@ -560,7 +560,7 @@
 
         /*
         * Shortcut the most recurring case: the user is in the dragging
-        * state and he is moving his finger.  We want to intercept this
+        * state and they are moving their finger.  We want to intercept this
         * motion.
         */
         final int action = ev.getAction();
@@ -576,7 +576,7 @@
             case MotionEvent.ACTION_MOVE: {
                 /*
                  * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check
-                 * whether the user has moved far enough from his original down touch.
+                 * whether the user has moved far enough from their original down touch.
                  */
 
                 /*
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index 3b482a8..8dfb936 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -554,7 +554,7 @@
         public static int SCROLL_STATE_IDLE = 0;
 
         /**
-         * The user is scrolling using touch, and his finger is still on the screen.
+         * The user is scrolling using touch, and their finger is still on the screen.
          */
         public static int SCROLL_STATE_TOUCH_SCROLL = 1;
 
@@ -1675,7 +1675,7 @@
             // Do not draw the middle item if input is visible since the input
             // is shown only if the wheel is static and it covers the middle
             // item. Otherwise, if the user starts editing the text via the
-            // IME he may see a dimmed version of the old value intermixed
+            // IME they may see a dimmed version of the old value intermixed
             // with the new one.
             if ((showSelectorWheel && i != SELECTOR_MIDDLE_ITEM_INDEX) ||
                 (i == SELECTOR_MIDDLE_ITEM_INDEX && mInputText.getVisibility() != VISIBLE)) {
diff --git a/core/java/android/widget/RadioGroup.java b/core/java/android/widget/RadioGroup.java
index 849488d..4722fdc 100644
--- a/core/java/android/widget/RadioGroup.java
+++ b/core/java/android/widget/RadioGroup.java
@@ -389,7 +389,7 @@
     /**
      * <p>A pass-through listener acts upon the events and dispatches them
      * to another listener. This allows the table layout to set its own internal
-     * hierarchy change listener without preventing the user to setup his.</p>
+     * hierarchy change listener without preventing the user to setup this.</p>
      */
     private class PassThroughHierarchyChangeListener implements
             ViewGroup.OnHierarchyChangeListener {
@@ -529,4 +529,4 @@
     private boolean isVisibleWithText(RadioButton button) {
         return button.getVisibility() == VISIBLE && !TextUtils.isEmpty(button.getText());
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index 3847d6b..b44b8c2 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -133,7 +133,7 @@
     /**
      * True if the user is currently dragging this ScrollView around. This is
      * not the same as 'is being flinged', which can be checked by
-     * mScroller.isFinished() (flinging begins when the user lifts his finger).
+     * mScroller.isFinished() (flinging begins when the user lifts their finger).
      */
     @UnsupportedAppUsage
     private boolean mIsBeingDragged = false;
@@ -593,7 +593,7 @@
 
         /*
         * Shortcut the most recurring case: the user is in the dragging
-        * state and he is moving his finger.  We want to intercept this
+        * state and they is moving their finger.  We want to intercept this
         * motion.
         */
         final int action = ev.getAction();
@@ -616,7 +616,7 @@
             case MotionEvent.ACTION_MOVE: {
                 /*
                  * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check
-                 * whether the user has moved far enough from his original down touch.
+                 * whether the user has moved far enough from their original down touch.
                  */
 
                 /*
diff --git a/core/java/android/widget/TableLayout.java b/core/java/android/widget/TableLayout.java
index 8bb4d16..8e635f4 100644
--- a/core/java/android/widget/TableLayout.java
+++ b/core/java/android/widget/TableLayout.java
@@ -751,7 +751,7 @@
     /**
      * <p>A pass-through listener acts upon the events and dispatches them
      * to another listener. This allows the table layout to set its own internal
-     * hierarchy change listener without preventing the user to setup his.</p>
+     * hierarchy change listener without preventing the user to setup this.</p>
      */
     private class PassThroughHierarchyChangeListener implements
             OnHierarchyChangeListener {
diff --git a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
index a3c29a8..491ddba 100644
--- a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
+++ b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
@@ -70,7 +70,7 @@
 public class AccessibilityShortcutController {
     private static final String TAG = "AccessibilityShortcutController";
 
-    // Dummy component names for framework features
+    // Placeholder component names for framework features
     public static final ComponentName COLOR_INVERSION_COMPONENT_NAME =
             new ComponentName("com.android.server.accessibility", "ColorInversion");
     public static final ComponentName DALTONIZER_COMPONENT_NAME =
@@ -109,8 +109,8 @@
     public FrameworkObjectProvider mFrameworkObjectProvider = new FrameworkObjectProvider();
 
     /**
-     * @return An immutable map from dummy component names to feature info for toggling a framework
-     *         feature
+     * @return An immutable map from placeholder component names to feature
+     *         info for toggling a framework feature
      */
     public static Map<ComponentName, ToggleableFrameworkFeatureInfo>
         getFrameworkShortcutFeaturesMap() {
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java
index 508deac..0b92b93 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java
@@ -42,7 +42,7 @@
 
 /**
  * Activity used to display various targets related to accessibility service, accessibility
- * activity or white listing feature for volume key shortcut.
+ * activity or allowlisting feature for volume key shortcut.
  */
 public class AccessibilityShortcutChooserActivity extends Activity {
     @ShortcutType
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
index d756593..d84175e 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
@@ -36,7 +36,7 @@
 
 /**
  * Abstract base class for creating various target related to accessibility service,
- * accessibility activity, and white listing feature.
+ * accessibility activity, and allowlisting feature.
  */
 public abstract class AccessibilityTarget implements TargetOperations, OnTargetSelectedListener,
         OnTargetCheckedChangeListener {
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
index 60a102a..a7c5f6d 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
@@ -101,7 +101,7 @@
 
     /**
      * Returns list of {@link AccessibilityTarget} of the installed accessibility service,
-     * accessibility activity, and white listing feature including accessibility feature's package
+     * accessibility activity, and allowlisting feature including accessibility feature's package
      * name, component id, etc.
      *
      * @param context The context of the application.
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 14cf258..4b661ca 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -3084,7 +3084,7 @@
                     final TargetInfo ti = mChooserMultiProfilePagerAdapter.getActiveListAdapter()
                             .targetInfoForPosition(mListPosition, /* filtered */ true);
 
-                    // This should always be the case for ItemViewHolder, check for sanity
+                    // This should always be the case for ItemViewHolder, check for validity
                     if (ti instanceof DisplayResolveInfo) {
                         showTargetDetails((DisplayResolveInfo) ti);
                     }
@@ -3458,7 +3458,7 @@
                     v.setOnLongClickListener(v1 -> {
                         final TargetInfo ti = mChooserListAdapter.targetInfoForPosition(
                                 holder.getItemIndex(column), true);
-                        // This should always be the case for non-DS targets, check for sanity
+                        // This should always be the case for non-DS targets, check for validity
                         if (ti instanceof DisplayResolveInfo) {
                             showTargetDetails((DisplayResolveInfo) ti);
                         }
diff --git a/core/java/com/android/internal/app/NetInitiatedActivity.java b/core/java/com/android/internal/app/NetInitiatedActivity.java
index 92e9fe4..56ec87c 100644
--- a/core/java/com/android/internal/app/NetInitiatedActivity.java
+++ b/core/java/com/android/internal/app/NetInitiatedActivity.java
@@ -35,7 +35,7 @@
 import com.android.server.LocalServices;
 
 /**
- * This activity is shown to the user for him/her to accept or deny network-initiated
+ * This activity is shown to the user for them to accept or deny network-initiated
  * requests. It uses the alert dialog style. It will be launched from a notification.
  */
 public class NetInitiatedActivity extends AlertActivity implements DialogInterface.OnClickListener {
diff --git a/core/java/com/android/internal/app/ToolbarActionBar.java b/core/java/com/android/internal/app/ToolbarActionBar.java
index b3904f4..e2342bb 100644
--- a/core/java/com/android/internal/app/ToolbarActionBar.java
+++ b/core/java/com/android/internal/app/ToolbarActionBar.java
@@ -527,7 +527,7 @@
         public View onCreatePanelView(int featureId) {
             if (featureId == Window.FEATURE_OPTIONS_PANEL) {
                 // This gets called by PhoneWindow.preparePanel. Since this already manages
-                // its own panel, we return a dummy view here to prevent PhoneWindow from
+                // its own panel, we return a placeholder view here to prevent PhoneWindow from
                 // preparing a default one.
                 return new View(mDecorToolbar.getContext());
             }
diff --git a/core/java/com/android/internal/colorextraction/types/Tonal.java b/core/java/com/android/internal/colorextraction/types/Tonal.java
index d2e71c8..88bdb66 100644
--- a/core/java/com/android/internal/colorextraction/types/Tonal.java
+++ b/core/java/com/android/internal/colorextraction/types/Tonal.java
@@ -478,7 +478,7 @@
         public ConfigParser(Context context) {
             mTonalPalettes = new ArrayList<>();
 
-            // Load all palettes and the blacklist from an XML.
+            // Load all palettes and the denylist from an XML.
             try {
                 XmlPullParser parser = context.getResources().getXml(R.xml.color_extraction);
                 int eventType = parser.getEventType();
diff --git a/core/java/com/android/internal/infra/GlobalWhitelistState.java b/core/java/com/android/internal/infra/GlobalWhitelistState.java
index a0b2f94..3c081e2 100644
--- a/core/java/com/android/internal/infra/GlobalWhitelistState.java
+++ b/core/java/com/android/internal/infra/GlobalWhitelistState.java
@@ -31,7 +31,7 @@
 /**
  * Helper class used to manage a {@link WhitelistHelper} per user instance when the main service
  * cannot hold a lock when external entities (typically {@code ActivityManagerService}) needs to
- * get whitelist info.
+ * get allowlist info.
  *
  * <p>This class is thread safe.
  */
@@ -47,7 +47,7 @@
     protected SparseArray<WhitelistHelper> mWhitelisterHelpers;
 
     /**
-     * Sets the whitelist for the given user.
+     * Sets the allowlist for the given user.
      */
     public void setWhitelist(@UserIdInt int userId, @Nullable List<String> packageNames,
             @Nullable List<ComponentName> components) {
@@ -65,7 +65,7 @@
     }
 
     /**
-     * Checks if the given package is whitelisted for the given user.
+     * Checks if the given package is allowlisted for the given user.
      */
     public boolean isWhitelisted(@UserIdInt int userId, @NonNull String packageName) {
         synchronized (mGlobalWhitelistStateLock) {
@@ -76,7 +76,7 @@
     }
 
     /**
-     * Checks if the given component is whitelisted for the given user.
+     * Checks if the given component is allowlisted for the given user.
      */
     public boolean isWhitelisted(@UserIdInt int userId, @NonNull ComponentName componentName) {
         synchronized (mGlobalWhitelistStateLock) {
@@ -87,7 +87,7 @@
     }
 
     /**
-     * Gets the whitelisted components for the given package and user.
+     * Gets the allowlisted components for the given package and user.
      */
     public ArraySet<ComponentName> getWhitelistedComponents(@UserIdInt int userId,
             @NonNull String packageName) {
@@ -99,7 +99,7 @@
     }
 
     /**
-     * Resets the whitelist for the given user.
+     * Resets the allowlist for the given user.
      */
     public void resetWhitelist(@NonNull int userId) {
         synchronized (mGlobalWhitelistStateLock) {
diff --git a/core/java/com/android/internal/infra/WhitelistHelper.java b/core/java/com/android/internal/infra/WhitelistHelper.java
index b1d85f7..1d76090 100644
--- a/core/java/com/android/internal/infra/WhitelistHelper.java
+++ b/core/java/com/android/internal/infra/WhitelistHelper.java
@@ -28,7 +28,7 @@
 import java.util.Objects;
 
 /**
- * Helper class for keeping track of whitelisted packages/activities.
+ * Helper class for keeping track of allowlisted packages/activities.
  *
  * <p><b>NOTE: </b>this class is not thread safe.
  * @hide
@@ -38,18 +38,18 @@
     private static final String TAG = "WhitelistHelper";
 
     /**
-     * Map of whitelisted packages/activities. The whole package is whitelisted if its
+     * Map of allowlisted packages/activities. The whole package is allowlisted if its
      * corresponding value is {@code null}.
      */
     @Nullable
     private ArrayMap<String, ArraySet<ComponentName>> mWhitelistedPackages;
 
     /**
-     * Sets the whitelist with the given packages and activities. The list is cleared if both
+     * Sets the allowlist with the given packages and activities. The list is cleared if both
      * packageNames and components are {@code null}.
      *
-     * @param packageNames packages to be whitelisted.
-     * @param components activities to be whitelisted.
+     * @param packageNames packages to be allowlisted.
+     * @param components activities to be allowlisted.
      *
      * @throws IllegalArgumentException if packages or components are empty.
      */
@@ -103,7 +103,7 @@
     }
 
     /**
-     * Returns {@code true} if the entire package is whitelisted.
+     * Returns {@code true} if the entire package is allowlisted.
      */
     public boolean isWhitelisted(@NonNull String packageName) {
         Objects.requireNonNull(packageName);
@@ -115,7 +115,7 @@
     }
 
     /**
-     * Returns {@code true} if the specified activity is whitelisted.
+     * Returns {@code true} if the specified activity is allowlisted.
      */
     public boolean isWhitelisted(@NonNull ComponentName componentName) {
         Objects.requireNonNull(componentName);
@@ -130,8 +130,8 @@
     }
 
     /**
-     * Returns a set of whitelisted components with the given package, or null if nothing is
-     * whitelisted.
+     * Returns a set of allowlisted components with the given package, or null if nothing is
+     * allowlisted.
      */
     @Nullable
     public ArraySet<ComponentName> getWhitelistedComponents(@NonNull String packageName) {
diff --git a/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java b/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java
index e5475f8..9b1299e 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodPrivilegedOperations.java
@@ -371,7 +371,7 @@
     /**
      * Calls {@link IInputMethodPrivilegedOperations#applyImeVisibility(IBinder, boolean)}.
      *
-     * @param showOrHideInputToken dummy token that maps to window requesting
+     * @param showOrHideInputToken placeholder token that maps to window requesting
      *        {@link android.view.inputmethod.InputMethodManager#showSoftInput(View, int)} or
      *        {@link android.view.inputmethod.InputMethodManager#hideSoftInputFromWindow
      *        (IBinder, int)}
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index dd1e4f4..095882e 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -305,7 +305,7 @@
 
     /**
      * Returns an HTTP user agent of the form
-     * "Dalvik/1.1.0 (Linux; U; Android Eclair Build/MASTER)".
+     * "Dalvik/1.1.0 (Linux; U; Android Eclair Build/MAIN)".
      */
     private static String getDefaultUserAgent() {
         StringBuilder result = new StringBuilder(64);
@@ -324,7 +324,7 @@
                 result.append(model);
             }
         }
-        String id = Build.ID; // "MASTER" or "M4-rc20"
+        String id = Build.ID; // "MAIN" or "M4-rc20"
         if (id.length() > 0) {
             result.append(" Build/");
             result.append(id);
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index 069d19f..15d4525 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -206,7 +206,7 @@
     /** List of packages with the same uid, and its app data info: volume uuid and inode. */
     public static final String PKG_DATA_INFO_MAP = "--pkg-data-info-map";
 
-    /** List of whitelisted packages and its app data info: volume uuid and inode. */
+    /** List of allowlisted packages and its app data info: volume uuid and inode. */
     public static final String WHITELISTED_DATA_INFO_MAP = "--whitelisted-data-info-map";
 
     /** Bind mount app storage dirs to lower fs not via fuse */
@@ -327,7 +327,7 @@
      * @param isTopApp true if the process is for top (high priority) application.
      * @param pkgDataInfoList A list that stores related packages and its app data
      * info: volume uuid and inode.
-     * @param whitelistedDataInfoList Like pkgDataInfoList, but it's for whitelisted apps.
+     * @param whitelistedDataInfoList Like pkgDataInfoList, but it's for allowlisted apps.
      * @param bindMountAppDataDirs  True if the zygote needs to mount data dirs.
      * @param bindMountAppStorageDirs  True if the zygote needs to mount storage dirs.
      *
@@ -395,7 +395,7 @@
      * volume uuid and CE dir inode. For example, pkgDataInfoList = [app_a_pkg_name,
      * app_a_data_volume_uuid, app_a_ce_inode, app_b_pkg_name, app_b_data_volume_uuid,
      * app_b_ce_inode, ...];
-     * @param whitelistedDataInfoList Like pkgDataInfoList, but it's for whitelisted apps.
+     * @param whitelistedDataInfoList Like pkgDataInfoList, but it's for allowlisted apps.
      * @param bindMountAppDataDirs  True if the zygote needs to mount data dirs.
      * @param bindMountAppStorageDirs  True if the zygote needs to mount storage dirs.
      */
diff --git a/core/java/com/android/internal/os/ZygoteArguments.java b/core/java/com/android/internal/os/ZygoteArguments.java
index 22082d0..ed07432 100644
--- a/core/java/com/android/internal/os/ZygoteArguments.java
+++ b/core/java/com/android/internal/os/ZygoteArguments.java
@@ -227,7 +227,7 @@
     String[] mPkgDataInfoList;
 
     /**
-     * A list that stores all whitelisted app data info: volume uuid and inode.
+     * A list that stores all allowlisted app data info: volume uuid and inode.
      * Null if it does need to do app data isolation.
      */
     String[] mWhitelistedDataInfoList;
diff --git a/core/java/com/android/internal/os/ZygoteServer.java b/core/java/com/android/internal/os/ZygoteServer.java
index 8c81984..0dd8b59 100644
--- a/core/java/com/android/internal/os/ZygoteServer.java
+++ b/core/java/com/android/internal/os/ZygoteServer.java
@@ -297,7 +297,7 @@
                 mUsapPoolRefillDelayMs = Integer.parseInt(usapPoolRefillDelayMsPropString);
             }
 
-            // Sanity check
+            // Validity check
             if (mUsapPoolSizeMin >= mUsapPoolSizeMax) {
                 Log.w(TAG, "The max size of the USAP pool must be greater than the minimum size."
                         + "  Restoring default values.");
diff --git a/core/java/com/android/internal/view/menu/MenuPopup.java b/core/java/com/android/internal/view/menu/MenuPopup.java
index 10bd66f..fb871a4 100644
--- a/core/java/com/android/internal/view/menu/MenuPopup.java
+++ b/core/java/com/android/internal/view/menu/MenuPopup.java
@@ -136,7 +136,7 @@
      */
     protected static int measureIndividualMenuWidth(ListAdapter adapter, ViewGroup parent,
             Context context, int maxAllowedWidth) {
-        // Menus don't tend to be long, so this is more sane than it looks.
+        // Menus don't tend to be long, so this is more valid than it looks.
         int maxWidth = 0;
         View itemView = null;
         int itemType = 0;
diff --git a/core/java/com/android/internal/widget/ActionBarContainer.java b/core/java/com/android/internal/widget/ActionBarContainer.java
index baf3188..eef3368 100644
--- a/core/java/com/android/internal/widget/ActionBarContainer.java
+++ b/core/java/com/android/internal/widget/ActionBarContainer.java
@@ -361,7 +361,7 @@
     }
 
     /**
-     * Dummy drawable so that we don't break background display lists and
+     * Placeholder drawable so that we don't break background display lists and
      * projection surfaces.
      */
     private class ActionBarBackgroundDrawable extends Drawable {
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 93690cd..73318bf 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -1176,7 +1176,7 @@
     }
 
     /**
-     * Set and store the lockout deadline, meaning the user can't attempt his/her unlock
+     * Set and store the lockout deadline, meaning the user can't attempt their unlock
      * pattern until the deadline has passed.
      * @return the chosen deadline.
      */
@@ -1194,7 +1194,7 @@
 
     /**
      * @return The elapsed time in millis in the future when the user is allowed to
-     *   attempt to enter his/her lock pattern, or 0 if the user is welcome to
+     *   attempt to enter their lock pattern, or 0 if the user is welcome to
      *   enter a pattern.
      */
     public long getLockoutAttemptDeadline(int userId) {
@@ -1480,7 +1480,7 @@
      * Create an escrow token for the current user, which can later be used to unlock FBE
      * or change user password.
      *
-     * After adding, if the user currently has lockscreen password, he will need to perform a
+     * After adding, if the user currently has lockscreen password, they will need to perform a
      * confirm credential operation in order to activate the token for future use. If the user
      * has no secure lockscreen, then the token is activated immediately.
      *
@@ -1557,7 +1557,7 @@
 
     /**
      * Unlock the specified user by an pre-activated escrow token. This should have the same effect
-     * on device encryption as the user entering his lockscreen credentials for the first time after
+     * on device encryption as the user entering their lockscreen credentials for the first time after
      * boot, this includes unlocking the user's credential-encrypted storage as well as the keystore
      *
      * <p>This method is only available to code running in the system server process itself.
diff --git a/core/java/com/android/internal/widget/LockSettingsInternal.java b/core/java/com/android/internal/widget/LockSettingsInternal.java
index 38588ea..f5df3ab 100644
--- a/core/java/com/android/internal/widget/LockSettingsInternal.java
+++ b/core/java/com/android/internal/widget/LockSettingsInternal.java
@@ -30,7 +30,7 @@
      * Create an escrow token for the current user, which can later be used to unlock FBE
      * or change user password.
      *
-     * After adding, if the user currently has lockscreen password, he will need to perform a
+     * After adding, if the user currently has lockscreen password, they will need to perform a
      * confirm credential operation in order to activate the token for future use.
      * Once the token is activated, the callback that is passed here is called.   If the user
      * has no secure lockscreen, then the token is activated immediately.
diff --git a/core/java/com/android/internal/widget/ViewPager.java b/core/java/com/android/internal/widget/ViewPager.java
index c8a86d1..6f377b9 100644
--- a/core/java/com/android/internal/widget/ViewPager.java
+++ b/core/java/com/android/internal/widget/ViewPager.java
@@ -1843,7 +1843,7 @@
             case MotionEvent.ACTION_MOVE: {
                 /*
                  * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check
-                 * whether the user has moved far enough from his original down touch.
+                 * whether the user has moved far enough from their original down touch.
                  */
 
                 /*
diff --git a/core/java/com/android/server/backup/AccountSyncSettingsBackupHelper.java b/core/java/com/android/server/backup/AccountSyncSettingsBackupHelper.java
index b4610bd..ce9ab82 100644
--- a/core/java/com/android/server/backup/AccountSyncSettingsBackupHelper.java
+++ b/core/java/com/android/server/backup/AccountSyncSettingsBackupHelper.java
@@ -262,14 +262,14 @@
             boolean currentMasterSyncEnabled = ContentResolver.getMasterSyncAutomaticallyAsUser(
                     mUserId);
             if (currentMasterSyncEnabled) {
-                // Disable master sync to prevent any syncs from running.
+                // Disable global sync to prevent any syncs from running.
                 ContentResolver.setMasterSyncAutomaticallyAsUser(false, mUserId);
             }
 
             try {
                 restoreFromJsonArray(accountJSONArray, mUserId);
             } finally {
-                // Set the master sync preference to the value from the backup set.
+                // Set the global sync preference to the value from the backup set.
                 ContentResolver.setMasterSyncAutomaticallyAsUser(masterSyncEnabled, mUserId);
             }
             Log.i(TAG, "Restore successful.");
diff --git a/core/java/org/apache/http/conn/ssl/SSLSocketFactory.java b/core/java/org/apache/http/conn/ssl/SSLSocketFactory.java
index ffae757..e1fe1bd 100644
--- a/core/java/org/apache/http/conn/ssl/SSLSocketFactory.java
+++ b/core/java/org/apache/http/conn/ssl/SSLSocketFactory.java
@@ -113,7 +113,7 @@
  *     <li>
  *      <p>
  *      Send the certificate request to the trusted Certificate Authority for signature. 
- *      One may choose to act as her own CA and sign the certificate request using a PKI 
+ *      One may choose to act as their own CA and sign the certificate request using a PKI
  *      tool, such as OpenSSL.
  *      </p>
  *     </li>
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index d4a1712..dadf08f 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -827,7 +827,7 @@
   }
 
   if (mount_mode == MOUNT_EXTERNAL_NONE && !force_mount_namespace) {
-    // Sane default of no storage visible
+    // Valid default of no storage visible
     return;
   }
 
@@ -1118,7 +1118,7 @@
 
   // Temporarily block SIGCHLD during forks. The SIGCHLD handler might
   // log, which would result in the logging FDs we close being reopened.
-  // This would cause failures because the FDs are not whitelisted.
+  // This would cause failures because the FDs are not allowlisted.
   //
   // Note that the zygote process is single threaded at this point.
   BlockSignal(SIGCHLD, fail_fn);
@@ -1324,7 +1324,7 @@
  * in data directories.
  *
  * Steps:
- * 1). Collect a list of all related apps (apps with same uid and whitelisted apps) data info
+ * 1). Collect a list of all related apps (apps with same uid and allowlisted apps) data info
  * (package name, data stored volume uuid, and inode number of its CE data directory)
  * 2). Mount tmpfs on /data/data, /data/user(_de) and /mnt/expand, so apps no longer
  * able to access apps data directly.
@@ -2058,7 +2058,7 @@
     return;
   }
 
-  // Mark rootfs as being a slave so that changes from default
+  // Mark rootfs as being MS_SLAVE so that changes from default
   // namespace only flow into our children.
   if (mount("rootfs", "/", nullptr, (MS_SLAVE | MS_REC), nullptr) == -1) {
     RuntimeAbort(env, __LINE__, "Failed to mount() rootfs as MS_SLAVE");
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index f1e1868..84e56b7 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -890,11 +890,11 @@
 
       <p> This is a soft restricted permission which cannot be held by an app it its
       full form until the installer on record whitelists the permission.
-      Specifically, if the permission is whitelisted the holder app can access
+      Specifically, if the permission is allowlisted the holder app can access
       external storage and the visual and aural media collections while if the
-      permission is not whitelisted the holder app can only access to the visual
+      permission is not allowlisted the holder app can only access to the visual
       and aural medial collections. Also the permission is immutably restricted
-      meaning that the whitelist state can be specified only at install time and
+      meaning that the allowlist state can be specified only at install time and
       cannot change until the app is installed. For more details see
       {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
      <p>Protection level: dangerous -->
@@ -918,7 +918,7 @@
          read/write files in your application-specific directories returned by
          {@link android.content.Context#getExternalFilesDir} and
          {@link android.content.Context#getExternalCacheDir}.
-         <p>If this permission is not whitelisted for an app that targets an API level before
+         <p>If this permission is not allowlisted for an app that targets an API level before
          {@link android.os.Build.VERSION_CODES#Q} this permission cannot be granted to apps.</p>
          <p>Protection level: dangerous</p>
     -->
@@ -3778,7 +3778,7 @@
     <permission android:name="android.permission.UPGRADE_RUNTIME_PERMISSIONS"
                 android:protectionLevel="signature" />
 
-    <!-- @SystemApi Allows an application to whitelist restricted permissions
+    <!-- @SystemApi Allows an application to allowlist restricted permissions
          on any of the whitelists.
     @hide -->
     <permission android:name="android.permission.WHITELIST_RESTRICTED_PERMISSIONS"
@@ -4152,7 +4152,7 @@
     <permission android:name="android.permission.CHANGE_APP_IDLE_STATE"
         android:protectionLevel="signature|privileged" />
 
-    <!-- @hide @SystemApi Allows an application to temporarily whitelist an inactive app to
+    <!-- @hide @SystemApi Allows an application to temporarily allowlist an inactive app to
          access the network and acquire wakelocks.
          <p>Not for use by third-party applications. -->
     <permission android:name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST"
@@ -4774,7 +4774,7 @@
     <permission android:name="android.permission.ACCESS_VR_STATE"
         android:protectionLevel="signature|preinstalled" />
 
-    <!-- Allows an application to whitelist tasks during lock task mode
+    <!-- Allows an application to allowlist tasks during lock task mode
          @hide <p>Not for use by third-party applications.</p> -->
     <permission android:name="android.permission.UPDATE_LOCK_TASK_PACKAGES"
         android:protectionLevel="signature|setup" />
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index f42b248..0c63c10 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -271,7 +271,7 @@
         <flag name="runtime" value="0x2000" />
         <!-- Additional flag from base permission type: this permission can be granted only
              if its protection level is signature, the requesting app resides on the OEM partition,
-             and the OEM has white-listed the app to receive this permission by the OEM.
+             and the OEM has allowlisted the app to receive this permission by the OEM.
          -->
         <flag name="oem" value="0x4000" />
         <!-- Additional flag from base permission type: this permission can be granted to
@@ -338,7 +338,7 @@
         <flag name="softRestricted" value="0x8" />
         <!-- This permission is restricted immutably which means that its
              restriction state may be specified only on the first install of
-             the app and will stay in this initial whitelist state until
+             the app and will stay in this initial allowlist state until
              the app is uninstalled.
         -->
         <flag name="immutablyRestricted" value="0x10" />
@@ -1407,13 +1407,13 @@
     <attr name="lockTaskMode">
         <!-- This is the default value. Tasks will not launch into lockTask mode but can be
              placed there by calling {@link android.app.Activity#startLockTask}. If a task with
-             this mode has been whitelisted using {@link
+             this mode has been allowlisted using {@link
              android.app.admin.DevicePolicyManager#setLockTaskPackages} then calling
              {@link android.app.Activity#startLockTask} will enter lockTask mode immediately,
              otherwise the user will be presented with a dialog to approve entering pinned mode.
              <p>If the system is already in lockTask mode when a new task rooted at this activity
              is launched that task will or will not start depending on whether the package of this
-             activity has been whitelisted.
+             activity has been allowlisted.
              <p>Tasks rooted at this activity can only exit lockTask mode using
              {@link android.app.Activity#stopLockTask}. -->
         <enum name="normal" value="0"/>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 17b1561..cba68d6 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -364,7 +364,7 @@
          less than 0x600 -->
     <bool translatable="false" name="config_apfDrop802_3Frames">true</bool>
 
-    <!-- An array of Black listed EtherType, packets with EtherTypes within this array
+    <!-- An array of Denylisted EtherType, packets with EtherTypes within this array
          will be dropped
          TODO: need to put proper values, these are for testing purposes only -->
     <integer-array translatable="false" name="config_apfEthTypeBlackList">
@@ -1532,7 +1532,7 @@
     <!-- Class name of WallpaperManagerService. -->
     <string name="config_wallpaperManagerServiceName" translatable="false">com.android.server.wallpaper.WallpaperManagerService</string>
 
-    <!-- Enables the TimeZoneRuleManager service. This is the master switch for the updateable time
+    <!-- Enables the TimeZoneRuleManager service. This is the global switch for the updateable time
          zone update mechanism. -->
     <bool name="config_enableUpdateableTimeZoneRules">false</bool>
 
@@ -2300,18 +2300,18 @@
          will be locked. -->
     <bool name="config_multiuserDelayUserDataLocking">false</bool>
 
-    <!-- Whether to only install system packages on a user if they're whitelisted for that user
+    <!-- Whether to only install system packages on a user if they're allowlisted for that user
          type. These are flags and can be freely combined.
-         0  - disable whitelist (install all system packages; no logging)
-         1  - enforce (only install system packages if they are whitelisted)
-         2  - log (log non-whitelisted packages)
-         4  - any package not mentioned in the whitelist file is implicitly whitelisted on all users
+         0  - disable allowlist (install all system packages; no logging)
+         1  - enforce (only install system packages if they are allowlisted)
+         2  - log (log non-allowlisted packages)
+         4  - any package not mentioned in the allowlist file is implicitly allowlisted on all users
          8  - same as 4, but just for the SYSTEM user
          16 - ignore OTAs (don't install system packages during OTAs)
          Common scenarios:
-          - to enable feature (fully enforced) for a complete whitelist: 1
-          - to enable feature for an incomplete whitelist (so use implicit whitelist mode): 5
-          - to enable feature but implicitly whitelist for SYSTEM user to ease local development: 9
+          - to enable feature (fully enforced) for a complete allowlist: 1
+          - to enable feature for an incomplete allowlist (so use implicit allowlist mode): 5
+          - to enable feature but implicitly allowlist for SYSTEM user to ease local development: 9
           - to disable feature completely if it had never been enabled: 16
           - to henceforth disable feature and try to undo its previous effects: 0
         Note: This list must be kept current with PACKAGE_WHITELIST_MODE_PROP in
@@ -2489,25 +2489,25 @@
          Example: com.google.android.myapp/.resolver.MyResolverActivity  -->
     <string name="config_customResolverActivity" translatable="false"></string>
 
-    <!-- Name of the activity or service that prompts the user to reject, accept, or whitelist
+    <!-- Name of the activity or service that prompts the user to reject, accept, or allowlist
          an adb host's public key, when an unwhitelisted host connects to the local adbd.
          Can be customized for other product types -->
     <string name="config_customAdbPublicKeyConfirmationComponent"
             >com.android.systemui/com.android.systemui.usb.UsbDebuggingActivity</string>
 
-    <!-- Name of the activity that prompts the secondary user to acknowledge she/he needs to
+    <!-- Name of the activity that prompts the secondary user to acknowledge they need to
          switch to the primary user to enable USB debugging.
          Can be customized for other product types -->
     <string name="config_customAdbPublicKeyConfirmationSecondaryUserComponent"
             >com.android.systemui/com.android.systemui.usb.UsbDebuggingSecondaryUserActivity</string>
 
-    <!-- Name of the activity or service that prompts the user to reject, accept, or whitelist
+    <!-- Name of the activity or service that prompts the user to reject, accept, or allowlist
          a wireless network for wireless debugging.
          Can be customized for other product types -->
     <string name="config_customAdbWifiNetworkConfirmationComponent"
             >com.android.systemui/com.android.systemui.wifi.WifiDebuggingActivity</string>
 
-    <!-- Name of the activity that prompts the secondary user to acknowledge she/he needs to
+    <!-- Name of the activity that prompts the secondary user to acknowledge they need to
          switch to the primary user to enable wireless debugging.
          Can be customized for other product types -->
     <string name="config_customAdbWifiNetworkConfirmationSecondaryUserComponent"
@@ -2555,7 +2555,7 @@
     <string name="config_appsAuthorizedForSharedAccounts" translatable="false">;com.android.settings;</string>
 
     <!-- Flag indicating that the media framework should not allow changes or mute on any
-         stream or master volumes. -->
+         stream or global volumes. -->
     <bool name="config_useFixedVolume">false</bool>
 
     <!-- The list of IMEs which should be disabled until used.
@@ -4261,10 +4261,10 @@
          we only enabled it while the device has ability of mixed color spaces composition -->
     <bool name="config_enableWcgMode">false</bool>
 
-    <!-- When true, enables the whitelisted app to handle bug reports from power menu short press. -->
+    <!-- When true, enables the allowlisted app to handle bug reports from power menu short press. -->
     <bool name="config_bugReportHandlerEnabled">false</bool>
 
-    <!-- The package name for the default bug report handler app from power menu short press. This app must be whitelisted. -->
+    <!-- The package name for the default bug report handler app from power menu short press. This app must be allowlisted. -->
     <string name="config_defaultBugReportHandlerApp" translatable="false"></string>
 
     <!-- The default value used for RawContacts.ACCOUNT_NAME when contacts are inserted without this
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 0c87453..51faf20 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -354,11 +354,11 @@
     <!-- A notification is shown when the AccountManager is unable to
     supply an auth token without prompting the user to re-enter the
     password.  This is the text that will scroll through the
-    notification bar (will be seen by the user as he uses another application). -->
+    notification bar (will be seen by the user as they use another application). -->
     <string name="notification_title">Signin error for <xliff:g id="account" example="foo@gmail.com">%1$s</xliff:g></string>
 
     <!-- Sync notifications --> <skip />
-    <!-- A notification is shown when there is a sync error.  This is the text that will scroll through the notification bar (will be seen by the user as he uses another application). -->
+    <!-- A notification is shown when there is a sync error.  This is the text that will scroll through the notification bar (will be seen by the user as they use another application). -->
     <string name="contentServiceSync">Sync</string>
     <!-- A notification is shown when there is a sync error.  This is the title of the notification.  It will be seen in the pull-down notification tray. [CHAR LIMIT=NOTIF_TITLE] -->
     <string name="contentServiceSyncNotificationTitle">Can\'t sync</string>
@@ -3120,7 +3120,7 @@
     <string name="use_a_different_app">Use a different app</string>
     <!-- Text displayed when the user selects the check box for setting default application.  See the "Use by default for this action" check box. -->
     <string name="clearDefaultHintMsg">Clear default in System settings &gt; Apps &gt; Downloaded.</string>
-    <!-- Default title for the activity chooser, when one is not given. Android allows multiple activities to perform an action.  for example, there may be many ringtone pickers installed.  A dialog is shown to the user allowing him to pick which activity should be used.  This is the title. -->
+    <!-- Default title for the activity chooser, when one is not given. Android allows multiple activities to perform an action.  for example, there may be many ringtone pickers installed.  A dialog is shown to the user allowing them to pick which activity should be used.  This is the title. -->
     <string name="chooseActivity">Choose an action</string>
     <!-- title for the USB activity chooser. -->
     <string name="chooseUsbActivity">Choose an app for the USB device</string>
@@ -3340,7 +3340,7 @@
     <string name="ringtone_picker_title_alarm">Alarm sounds</string>
     <!-- The title of the notification sound picker dialog [CHAR LIMIT=100] -->
     <string name="ringtone_picker_title_notification">Notification sounds</string>
-    <!-- If there is ever a ringtone set for some setting, but that ringtone can no longer be resolved, t his is shown instead.  For example, if the ringtone was on a SD card and it had been removed, this woudl be shown for ringtones on that SD card. -->
+    <!-- If there is ever a ringtone set for some setting, but that ringtone can no longer be resolved, this is shown instead.  For example, if the ringtone was on a SD card and it had been removed, this would be shown for ringtones on that SD card. -->
     <string name="ringtone_unknown">Unknown</string>
 
     <!-- A notification is shown when a wifi captive portal network is detected.  This is the notification's title. -->
@@ -3899,7 +3899,7 @@
     <string name="gpsNotifTitle">Location request</string>
     <!-- Network positioning notification message. The name of the user (e.g. John Doe) and
          service (SUPL-service) who sent the request is shown as dynamic strings.
-         Translation should not be longer than master text. -->
+         Translation should not be longer than example text. -->
     <string name="gpsNotifMessage">Requested by <xliff:g id="name">%1$s</xliff:g> (<xliff:g id="service" example="SUPL-service">%2$s</xliff:g>)</string>
     <!-- Network positioning verification Yes. Button to push to share location information. -->
     <string name="gpsVerifYes">Yes</string>
diff --git a/core/tests/coretests/src/android/app/activity/ActivityManagerTest.java b/core/tests/coretests/src/android/app/activity/ActivityManagerTest.java
index 6328101..0c351d1 100644
--- a/core/tests/coretests/src/android/app/activity/ActivityManagerTest.java
+++ b/core/tests/coretests/src/android/app/activity/ActivityManagerTest.java
@@ -269,7 +269,7 @@
         return unmarshalled;
     }
 
-    // If any entries in appear in the list, sanity check them against all running applications
+    // If any entries in appear in the list, validity check them against all running applications
     private void checkErrorListSanity(List<ActivityManager.ProcessErrorStateInfo> errList) {
         if (errList == null) return;
         
@@ -277,7 +277,7 @@
         while (iter.hasNext()) {
             ActivityManager.ProcessErrorStateInfo info = iter.next();
             assertNotNull(info);
-            // sanity checks
+            // validity checks
             assertTrue((info.condition == ActivityManager.ProcessErrorStateInfo.CRASHED) ||
                        (info.condition == ActivityManager.ProcessErrorStateInfo.NOT_RESPONDING));
             // TODO look at each of these and consider a stronger test
diff --git a/core/tests/coretests/src/android/app/assist/AssistStructureTest.java b/core/tests/coretests/src/android/app/assist/AssistStructureTest.java
index 1f4e5df..da386a6 100644
--- a/core/tests/coretests/src/android/app/assist/AssistStructureTest.java
+++ b/core/tests/coretests/src/android/app/assist/AssistStructureTest.java
@@ -277,7 +277,7 @@
 
         try {
             // Write to parcel
-            parcel.setDataPosition(0); // Sanity / paranoid check
+            parcel.setDataPosition(0); // Validity Check
             structure.writeToParcel(parcel, NO_FLAGS);
 
             // Read from parcel
diff --git a/core/tests/coretests/src/android/content/FakeProviderLocal.java b/core/tests/coretests/src/android/content/FakeProviderLocal.java
index a8c2f40..29f054b 100644
--- a/core/tests/coretests/src/android/content/FakeProviderLocal.java
+++ b/core/tests/coretests/src/android/content/FakeProviderLocal.java
@@ -20,7 +20,7 @@
 import android.net.Uri;
 
 /**
- * A dummy content provider for tests.  This provider runs in the same process as the test.
+ * A placeholder content provider for tests.  This provider runs in the same process as the test.
  */
 public class FakeProviderLocal extends ContentProvider {
 
diff --git a/core/tests/coretests/src/android/content/FakeProviderRemote.java b/core/tests/coretests/src/android/content/FakeProviderRemote.java
index 8bc5660..2c92da3 100644
--- a/core/tests/coretests/src/android/content/FakeProviderRemote.java
+++ b/core/tests/coretests/src/android/content/FakeProviderRemote.java
@@ -20,7 +20,7 @@
 import android.net.Uri;
 
 /**
- * A dummy content provider for tests.  This provider runs in a different process from the test.
+ * A placeholder content provider for tests.  This provider runs in a different process from the test.
  */
 public class FakeProviderRemote extends ContentProvider {
 
diff --git a/core/tests/coretests/src/android/content/SlowProvider.java b/core/tests/coretests/src/android/content/SlowProvider.java
index aba32e8..2ba0eff 100644
--- a/core/tests/coretests/src/android/content/SlowProvider.java
+++ b/core/tests/coretests/src/android/content/SlowProvider.java
@@ -20,8 +20,8 @@
 import android.net.Uri;
 
 /**
- * A dummy content provider for tests.  This provider runs in a different process from the test and
- * is intentionally slow.
+ * A placeholder content provider for tests.  This provider runs in a
+ * different process from the test and is intentionally slow.
  */
 public class SlowProvider extends ContentProvider {
 
diff --git a/core/tests/coretests/src/android/content/integrity/AtomicFormulaTest.java b/core/tests/coretests/src/android/content/integrity/AtomicFormulaTest.java
index ea69176..7af96c3 100644
--- a/core/tests/coretests/src/android/content/integrity/AtomicFormulaTest.java
+++ b/core/tests/coretests/src/android/content/integrity/AtomicFormulaTest.java
@@ -486,7 +486,7 @@
         assertThat(boolFormula.isInstallerFormula()).isFalse();
     }
 
-    /** Returns a builder with all fields filled with some dummy data. */
+    /** Returns a builder with all fields filled with some placeholder data. */
     private AppInstallMetadata.Builder getAppInstallMetadataBuilder() {
         return new AppInstallMetadata.Builder()
                 .setPackageName("abc")
diff --git a/core/tests/coretests/src/android/content/integrity/CompoundFormulaTest.java b/core/tests/coretests/src/android/content/integrity/CompoundFormulaTest.java
index abc5fed..ba060fa 100644
--- a/core/tests/coretests/src/android/content/integrity/CompoundFormulaTest.java
+++ b/core/tests/coretests/src/android/content/integrity/CompoundFormulaTest.java
@@ -282,7 +282,7 @@
         assertThat(compoundFormula.isInstallerFormula()).isTrue();
     }
 
-    /** Returns a builder with all fields filled with some dummy data. */
+    /** Returns a builder with all fields filled with some placeholder data. */
     private AppInstallMetadata.Builder getAppInstallMetadataBuilder() {
         return new AppInstallMetadata.Builder()
                 .setPackageName("abc")
diff --git a/core/tests/coretests/src/android/content/integrity/InstallerAllowedByManifestFormulaTest.java b/core/tests/coretests/src/android/content/integrity/InstallerAllowedByManifestFormulaTest.java
index 693d4ca..70712e4 100644
--- a/core/tests/coretests/src/android/content/integrity/InstallerAllowedByManifestFormulaTest.java
+++ b/core/tests/coretests/src/android/content/integrity/InstallerAllowedByManifestFormulaTest.java
@@ -110,7 +110,7 @@
         assertThat(FORMULA.matches(appInstallMetadata)).isTrue();
     }
 
-    /** Returns a builder with all fields filled with some dummy data. */
+    /** Returns a builder with all fields filled with some placeholder data. */
     private AppInstallMetadata.Builder getAppInstallMetadataBuilder() {
         return new AppInstallMetadata.Builder()
                 .setPackageName("abc")
diff --git a/core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java b/core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java
index f84355f..ced1f4d 100644
--- a/core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java
+++ b/core/tests/coretests/src/android/provider/SearchRecentSuggestionsProviderTest.java
@@ -316,7 +316,7 @@
     private void checkResultCounts(String queryString, int minRows, int maxRows,
             String matchDisplay1, String matchDisplay2) {
 
-        // get the cursor and apply sanity checks to result
+        // get the cursor and apply validity checks to result
         Cursor c = getQueryCursor(queryString);
         assertNotNull(c);
         assertTrue("Insufficient rows in filtered cursor", c.getCount() >= minRows);
diff --git a/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java b/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java
index b329e55..88f2313 100644
--- a/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java
+++ b/core/tests/coretests/src/android/view/autofill/AutofillIdTest.java
@@ -318,7 +318,7 @@
 
         try {
             // Write to parcel
-            parcel.setDataPosition(0); // Sanity / paranoid check
+            parcel.setDataPosition(0); // Validity Check
             id.writeToParcel(parcel, 0);
 
             // Read from parcel
diff --git a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureEventTest.java b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureEventTest.java
index 2008537..67614bb 100644
--- a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureEventTest.java
+++ b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureEventTest.java
@@ -317,7 +317,7 @@
 
         try {
             // Write to parcel
-            parcel.setDataPosition(0); // Sanity / paranoid check
+            parcel.setDataPosition(0); // Validity Check
             event.writeToParcel(parcel, 0);
 
             // Read from parcel
diff --git a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
index 5ea0718..eb58c63 100644
--- a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
+++ b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java
@@ -66,7 +66,7 @@
 
     @Test
     public void testNewAutofillId_differentSessions() {
-        assertThat(mSession1.getId()).isNotEqualTo(mSession2.getId()); //sanity check
+        assertThat(mSession1.getId()).isNotEqualTo(mSession2.getId()); //validity check
         final AutofillId parentId = new AutofillId(42);
         final AutofillId childId1 = mSession1.newAutofillId(parentId, 108L);
         final AutofillId childId2 = mSession2.newAutofillId(parentId, 108L);
@@ -84,7 +84,7 @@
 
     @Test
     public void testNewViewStructure() {
-        assertThat(mMockView.getAutofillId()).isNotNull(); // sanity check
+        assertThat(mMockView.getAutofillId()).isNotNull(); // validity check
         final ViewStructure structure = mSession1.newViewStructure(mMockView);
         assertThat(structure).isNotNull();
         assertThat(structure.getAutofillId()).isEqualTo(mMockView.getAutofillId());
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
index d15c60b..fa29ce8 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
@@ -1338,7 +1338,7 @@
             mTouchInteractionInProgress = false;
             // We want to set the active window to be current immediately
             // after the user has stopped touching the screen since if the
-            // user types with the IME he should get a feedback for the
+            // user types with the IME they should get a feedback for the
             // letter typed in the text view which is in the input focused
             // window. Note that we always deliver hover accessibility events
             // (they are a result of user touching the screen) so change of
diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java b/services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java
index e9c70c6..5c15214 100644
--- a/services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java
+++ b/services/accessibility/java/com/android/server/accessibility/gestures/GestureManifold.java
@@ -201,7 +201,7 @@
     boolean onMotionEvent(MotionEvent event, MotionEvent rawEvent, int policyFlags) {
         if (mState.isClear()) {
             if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
-                // Sanity safeguard: if touch state is clear, then matchers should always be clear
+                // Validity safeguard: if touch state is clear, then matchers should always be clear
                 // before processing the next down event.
                 clear();
             } else {
diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java
index fbc986b..6074ac9 100644
--- a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java
+++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java
@@ -637,7 +637,7 @@
                 }
                 // If the user is touch exploring the second pointer may be
                 // performing a double tap to activate an item without need
-                // for the user to lift his exploring finger.
+                // for the user to lift their exploring finger.
                 // It is *important* to use the distance traveled by the pointers
                 // on the screen which may or may not be magnified.
                 final float deltaX =
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index d7a3a32..060d097 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -1001,7 +1001,7 @@
             Slog.i(TAG, "hasBindAppWidgetPermission() " + UserHandle.getCallingUserId());
         }
 
-        // A special permission is required for managing white listing.
+        // A special permission is required for managing allowlisting.
         mSecurityPolicy.enforceModifyAppWidgetBindPermissions(packageName);
 
         synchronized (mLock) {
@@ -1025,7 +1025,7 @@
             Slog.i(TAG, "setBindAppWidgetPermission() " + UserHandle.getCallingUserId());
         }
 
-        // A special permission is required for managing white listing.
+        // A special permission is required for managing allowlisting.
         mSecurityPolicy.enforceModifyAppWidgetBindPermissions(packageName);
 
         synchronized (mLock) {
@@ -1117,7 +1117,7 @@
         }
 
         // If the provider is not under the calling user, make sure this
-        // provider is white listed for access from the parent.
+        // provider is allowlisted for access from the parent.
         if (!mSecurityPolicy.isProviderInCallerOrInProfileAndWhitelListed(
                 providerComponent.getPackageName(), providerProfileId)) {
             return false;
@@ -1126,7 +1126,7 @@
         synchronized (mLock) {
             ensureGroupStateLoadedLocked(userId);
 
-            // A special permission or white listing is required to bind widgets.
+            // A special permission or allowlisting is required to bind widgets.
             if (!mSecurityPolicy.hasCallerBindPermissionOrBindWhiteListedLocked(
                     callingPackage)) {
                 return false;
@@ -1741,7 +1741,7 @@
                     continue;
                 }
 
-                // Add providers only for the requested profile that are white-listed.
+                // Add providers only for the requested profile that are allowlisted.
                 final int providerProfileId = info.getProfile().getIdentifier();
                 if (providerProfileId == profileId
                         && mSecurityPolicy.isProviderInCallerOrInProfileAndWhitelListed(
@@ -3576,7 +3576,7 @@
     @Override
     public void onCrossProfileWidgetProvidersChanged(int userId, List<String> packages) {
         final int parentId = mSecurityPolicy.getProfileParent(userId);
-        // We care only if the white-listed package is in a profile of
+        // We care only if the allowlisted package is in a profile of
         // the group parent as only the parent can add widgets from the
         // profile and not the other way around.
         if (parentId != userId) {
@@ -3600,7 +3600,7 @@
                             userId, null);
                 }
 
-                // Remove widgets from hosts in parent user for packages not in the whitelist
+                // Remove widgets from hosts in parent user for packages not in the allowlist
                 final int removedCount = previousPackages.size();
                 for (int i = 0; i < removedCount; ++i) {
                     removeWidgetsForPackageLocked(previousPackages.valueAt(i),
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 57ffe04..d59c955 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -313,7 +313,7 @@
             @NonNull ComponentName componentName, boolean compatMode,
             boolean bindInstantServiceAllowed, int flags) {
         // FLAG_AUGMENTED_AUTOFILL_REQUEST is set in the flags when standard autofill is disabled
-        // but the package is whitelisted for augmented autofill
+        // but the package is allowlisted for augmented autofill
         boolean forAugmentedAutofillOnly = (flags
                 & FLAG_ADD_CLIENT_ENABLED_FOR_AUGMENTED_AUTOFILL_ONLY) != 0;
         if (!isEnabledLocked() && !forAugmentedAutofillOnly) {
@@ -322,7 +322,7 @@
 
         if (!forAugmentedAutofillOnly && isAutofillDisabledLocked(componentName)) {
             // Standard autofill is enabled, but service disabled autofill for this activity; that
-            // means no session, unless the activity is whitelisted for augmented autofill
+            // means no session, unless the activity is allowlisted for augmented autofill
             if (isWhitelistedForAugmentedAutofillLocked(componentName)) {
                 if (sDebug) {
                     Slog.d(TAG, "startSession(" + componentName + "): disabled by service but "
@@ -1379,7 +1379,7 @@
     }
 
     /**
-     * Resets the augmented autofill whitelist.
+     * Resets the augmented autofill allowlist.
      */
     @GuardedBy("mLock")
     void resetAugmentedAutofillWhitelistLocked() {
diff --git a/services/backup/backuplib/java/com/android/server/backup/TransportManager.java b/services/backup/backuplib/java/com/android/server/backup/TransportManager.java
index 30ce4cf..9cf7b42 100644
--- a/services/backup/backuplib/java/com/android/server/backup/TransportManager.java
+++ b/services/backup/backuplib/java/com/android/server/backup/TransportManager.java
@@ -173,7 +173,7 @@
         }
     }
 
-    /** Returns a set with the whitelisted transports. */
+    /** Returns a set with the allowlisted transports. */
     Set<ComponentName> getTransportWhitelist() {
         return mTransportWhitelist;
     }
@@ -590,7 +590,7 @@
         }
     }
 
-    /** Transport has to be whitelisted and privileged. */
+    /** Transport has to be allowlisted and privileged. */
     private boolean isTransportTrusted(ComponentName transport) {
         if (!mTransportWhitelist.contains(transport)) {
             Slog.w(
diff --git a/services/backup/backuplib/java/com/android/server/backup/transport/TransportClient.java b/services/backup/backuplib/java/com/android/server/backup/transport/TransportClient.java
index ca89f7f..0eb3ea3 100644
--- a/services/backup/backuplib/java/com/android/server/backup/transport/TransportClient.java
+++ b/services/backup/backuplib/java/com/android/server/backup/transport/TransportClient.java
@@ -664,7 +664,7 @@
                 return;
             }
             // TODO (b/147705255): Remove when binder calls to IBackupTransport are not blocking
-            // In short-term, blocking calls are OK as the transports come from the whitelist at
+            // In short-term, blocking calls are OK as the transports come from the allowlist at
             // {@link SystemConfig#getBackupTransportWhitelist()}
             Binder.allowBlocking(binder);
             transportClient.onServiceConnected(binder);
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
index ea94ad0..a153265 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
@@ -885,11 +885,11 @@
             synchronized (mGlobalWhitelistStateLock) {
                 packageWhitelisted = isWhitelisted(userId, packageName);
                 if (!packageWhitelisted) {
-                    // Full package is not whitelisted: check individual components first
+                    // Full package is not allowlisted: check individual components first
                     whitelistedComponents = getWhitelistedComponents(userId, packageName);
                     if (whitelistedComponents == null
                             && packageName.equals(mServicePackages.get(userId))) {
-                        // No components whitelisted either, but let it go because it's the
+                        // No components allowlisted either, but let it go because it's the
                         // service's own package
                         if (verbose) Slog.v(TAG, "getOptionsForPackage() lite for " + packageName);
                         return new ContentCaptureOptions(mDevCfgLoggingLevel);
@@ -897,7 +897,7 @@
                 }
             } // synchronized
 
-            // Restrict what temporary services can whitelist
+            // Restrict what temporary services can allowlist
             if (Build.IS_USER && mServiceNameResolver.isTemporary(userId)) {
                 if (!packageName.equals(mServicePackages.get(userId))) {
                     Slog.w(TAG, "Ignoring package " + packageName + " while using temporary "
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
index 9486b0d..ea68e19 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
@@ -93,7 +93,7 @@
      * Reference to the remote service.
      *
      * <p>It's set in the constructor, but it's also updated when the service's updated in the
-     * master's cache (for example, because a temporary service was set).
+     * main service's cache (for example, because a temporary service was set).
      */
     @GuardedBy("mLock")
     @Nullable
@@ -198,7 +198,7 @@
     void onConnected() {
         synchronized (mLock) {
             if (mZombie) {
-                // Sanity check - shouldn't happen
+                // Validity check - shouldn't happen
                 if (mRemoteService == null) {
                     Slog.w(TAG, "Cannot ressurect sessions because remote service is null");
                     return;
@@ -571,7 +571,7 @@
     }
 
     /**
-     * Resets the content capture whitelist.
+     * Resets the content capture allowlist.
      */
     @GuardedBy("mLock")
     private void resetContentCaptureWhitelistLocked() {
@@ -598,7 +598,7 @@
             mMaster.mGlobalContentCaptureOptions.setWhitelist(mUserId, packages, activities);
             writeSetWhitelistEvent(getServiceComponentName(), packages, activities);
 
-            // Must disable session that are not the whitelist anymore...
+            // Must disable session that are not the allowlist anymore...
             final int numSessions = mSessions.size();
             if (numSessions <= 0) return;
 
diff --git a/services/core/java/com/android/server/CertBlacklister.java b/services/core/java/com/android/server/CertBlacklister.java
index 8b167d7..c16378b 100644
--- a/services/core/java/com/android/server/CertBlacklister.java
+++ b/services/core/java/com/android/server/CertBlacklister.java
@@ -125,14 +125,14 @@
     }
 
     private void registerObservers(ContentResolver cr) {
-        // set up the public key blacklist observer
+        // set up the public key denylist observer
         cr.registerContentObserver(
             Settings.Secure.getUriFor(PUBKEY_BLACKLIST_KEY),
             true,
             buildPubkeyObserver(cr)
         );
 
-        // set up the serial number blacklist observer
+        // set up the serial number denylist observer
         cr.registerContentObserver(
             Settings.Secure.getUriFor(SERIAL_BLACKLIST_KEY),
             true,
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index bc79a6a..aeb8fbb 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -6240,7 +6240,7 @@
         final int vpnAppUid = nai.networkCapabilities.getOwnerUid();
         // TODO: this create a window of opportunity for apps to receive traffic between the time
         // when the old rules are removed and the time when new rules are added. To fix this,
-        // make eBPF support two whitelisted interfaces so here new rules can be added before the
+        // make eBPF support two allowlisted interfaces so here new rules can be added before the
         // old rules are being removed.
         if (wasFiltering) {
             mPermissionMonitor.onVpnUidRangesRemoved(oldIface, ranges, vpnAppUid);
diff --git a/services/core/java/com/android/server/EntropyMixer.java b/services/core/java/com/android/server/EntropyMixer.java
index 5e6e9d34..c56cef2 100644
--- a/services/core/java/com/android/server/EntropyMixer.java
+++ b/services/core/java/com/android/server/EntropyMixer.java
@@ -52,9 +52,9 @@
  * entropy estimate is not increased. This is to avoid having to trust/verify
  * the quality and authenticity of the &quot;randomness&quot; of the HW RNG.
  *
- * <p>This class was modeled after the script in
- * <a href="http://www.kernel.org/doc/man-pages/online/pages/man4/random.4.html">man
- * 4 random</a>.
+ * <p>This class was modeled after the script in the
+ * <a href="http://www.kernel.org/doc/man-pages/online/pages/man4/random.4.html">
+ * random(4) manual page</a>.
  */
 public class EntropyMixer extends Binder {
     private static final String TAG = "EntropyMixer";
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index ee794ba..ea14fad 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -373,7 +373,7 @@
      */
     private void notifyInterfaceRemoved(String iface) {
         // netd already clears out quota and alerts for removed ifaces; update
-        // our sanity-checking state.
+        // our validity-checking state.
         mActiveAlerts.remove(iface);
         mActiveQuotas.remove(iface);
         invokeForAllObservers(o -> o.interfaceRemoved(iface));
@@ -1256,7 +1256,7 @@
     public void setInterfaceAlert(String iface, long alertBytes) {
         NetworkStack.checkNetworkStackPermission(mContext);
 
-        // quick sanity check
+        // quick validity check
         if (!mActiveQuotas.containsKey(iface)) {
             throw new IllegalStateException("setting alert requires existing quota on iface");
         }
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 678387c..1147db5 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -1112,7 +1112,7 @@
             }
 
             try {
-                // TODO(b/135341433): Remove paranoid logging when FUSE is stable
+                // TODO(b/135341433): Remove cautious logging when FUSE is stable
                 Slog.i(TAG, "Resetting vold...");
                 mVold.reset();
                 Slog.i(TAG, "Reset vold");
@@ -2238,7 +2238,7 @@
 
     private void mount(VolumeInfo vol) {
         try {
-            // TODO(b/135341433): Remove paranoid logging when FUSE is stable
+            // TODO(b/135341433): Remove cautious logging when FUSE is stable
             Slog.i(TAG, "Mounting volume " + vol);
             mVold.mount(vol.id, vol.mountFlags, vol.mountUserId, new IVoldMountCallback.Stub() {
                 @Override
@@ -2969,7 +2969,7 @@
         return 0;
     }
 
-    /** Set the password for encrypting the master key.
+    /** Set the password for encrypting the main key.
      *  @param type One of the CRYPTO_TYPE_XXX consts defined in StorageManager.
      *  @param password The password to set.
      */
@@ -3033,7 +3033,7 @@
     }
 
     /**
-     * Get the type of encryption used to encrypt the master key.
+     * Get the type of encryption used to encrypt the main key.
      * @return The type, one of the CRYPT_TYPE_XXX consts from StorageManager.
      */
     @Override
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 995de04..208c943 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -103,6 +103,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
+import java.util.Objects;
 
 /**
  * Since phone process can be restarted, this class provides a centralized place
@@ -1828,30 +1829,26 @@
     }
 
     @Override
-    public void notifyCellLocationForSubscriber(int subId, CellIdentity cellLocation) {
+    public void notifyCellLocationForSubscriber(int subId, CellIdentity cellIdentity) {
         log("notifyCellLocationForSubscriber: subId=" + subId
-                + " cellLocation=" + cellLocation);
+                + " cellIdentity=" + cellIdentity);
         if (!checkNotifyPermission("notifyCellLocation()")) {
             return;
         }
-        if (VDBG) {
-            log("notifyCellLocationForSubscriber: subId=" + subId
-                + " cellLocation=" + cellLocation);
-        }
         int phoneId = getPhoneIdFromSubId(subId);
         synchronized (mRecords) {
-            if (validatePhoneId(phoneId)) {
-                mCellIdentity[phoneId] = cellLocation;
+            if (validatePhoneId(phoneId) && !Objects.equals(cellIdentity, mCellIdentity[phoneId])) {
+                mCellIdentity[phoneId] = cellIdentity;
                 for (Record r : mRecords) {
                     if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION) &&
                             idMatch(r.subId, subId, phoneId) &&
                             checkFineLocationAccess(r, Build.VERSION_CODES.Q)) {
                         try {
                             if (DBG_LOC) {
-                                log("notifyCellLocation: cellLocation=" + cellLocation
+                                log("notifyCellLocation: cellIdentity=" + cellIdentity
                                         + " r=" + r);
                             }
-                            r.callback.onCellLocationChanged(cellLocation);
+                            r.callback.onCellLocationChanged(cellIdentity);
                         } catch (RemoteException ex) {
                             mRemoveList.add(r.binder);
                         }
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 27c3ff1..609416d 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -2314,7 +2314,7 @@
                 List<String> accountRemovedReceivers =
                     getAccountRemovedReceivers(account, accounts);
                 accounts.accountsDb.beginTransaction();
-                // Set to a dummy value, this will only be used if the database
+                // Set to a placeholder value, this will only be used if the database
                 // transaction succeeds.
                 long accountId = -1;
                 try {
@@ -6266,7 +6266,7 @@
                     PRE_N_DATABASE_NAME);
             if (userId == 0) {
                 // Migrate old file, if it exists, to the new location.
-                // Make sure the new file doesn't already exist. A dummy file could have been
+                // Make sure the new file doesn't already exist. A placeholder file could have been
                 // accidentally created in the old location,
                 // causing the new one to become corrupted as well.
                 File oldFile = new File(systemDir, PRE_N_DATABASE_NAME);
diff --git a/services/core/java/com/android/server/am/BugReportHandlerUtil.java b/services/core/java/com/android/server/am/BugReportHandlerUtil.java
index 0a0d8d8..2142ebc 100644
--- a/services/core/java/com/android/server/am/BugReportHandlerUtil.java
+++ b/services/core/java/com/android/server/am/BugReportHandlerUtil.java
@@ -63,7 +63,7 @@
     }
 
     /**
-     * Launches a bugreport-whitelisted app to handle a bugreport.
+     * Launches a bugreport-allowlisted app to handle a bugreport.
      *
      * <p>Allows a bug report handler app to take bugreports on the user's behalf. The handler can
      * be predefined in the config, meant to be launched with the primary user. The user can
@@ -71,7 +71,7 @@
      * useful for capturing bug reports from work profile, for instance.
      *
      * @param context Context
-     * @return true if there is a bugreport-whitelisted app to handle a bugreport, or false
+     * @return true if there is a bugreport-allowlisted app to handle a bugreport, or false
      * otherwise
      */
     static boolean launchBugReportHandlerApp(Context context) {
@@ -92,7 +92,7 @@
             // It looks like the settings are outdated, reset outdated settings.
             //
             // i.e.
-            // If user chooses which profile and which bugreport-whitelisted app in that
+            // If user chooses which profile and which bugreport-allowlisted app in that
             // profile to handle a bugreport, then user remove the profile.
             // === RESULT ===
             // The chosen bugreport handler app is outdated because the profile is removed,
@@ -184,7 +184,7 @@
     }
 
     private static boolean isBugreportWhitelistedApp(String app) {
-        // Verify the app is bugreport-whitelisted
+        // Verify the app is bugreport-allowlisted
         final ArraySet<String> whitelistedApps = SystemConfig.getInstance()
                 .getBugreportWhitelistedPackages();
         return whitelistedApps.contains(app);
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index da5f489..14ba4af 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -906,8 +906,8 @@
                         + " to " + uidRec.curWhitelist);
                 if (ActivityManager.isProcStateBackground(uidRec.getCurProcState())
                         && !uidRec.curWhitelist) {
-                    // UID is now in the background (and not on the temp whitelist).  Was it
-                    // previously in the foreground (or on the temp whitelist)?
+                    // UID is now in the background (and not on the temp allowlist).  Was it
+                    // previously in the foreground (or on the temp allowlist)?
                     if (!ActivityManager.isProcStateBackground(uidRec.setProcState)
                             || uidRec.setWhitelist) {
                         uidRec.lastBackgroundTime = nowElapsed;
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index bac7565..60e59e3 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -237,7 +237,7 @@
             SystemProperties.set(key, value);
         } catch (Exception e) {
             // Failure to set a property can be caused by SELinux denial. This usually indicates
-            // that the property wasn't whitelisted in sepolicy.
+            // that the property wasn't allowlisted in sepolicy.
             // No need to report it on all user devices, only on debug builds.
             log("Unable to set property " + key + " value '" + value + "'", e);
         }
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index 2d8d2c3..623b433 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -422,7 +422,7 @@
         for (Integer userId : mUserLru) {
             UserState uss = mStartedUsers.get(userId);
             if (uss == null) {
-                // Shouldn't happen, but be sane if it does.
+                // Shouldn't happen, but recover if it does.
                 continue;
             }
             if (uss.state == UserState.STATE_STOPPING
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 7e4038e9..2991339 100755
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -1654,7 +1654,7 @@
                 Settings.Global.getInt(
                         cr, Settings.Global.MODE_RINGER, AudioManager.RINGER_MODE_NORMAL);
         int ringerMode = ringerModeFromSettings;
-        // sanity check in case the settings are restored from a device with incompatible
+        // validity check in case the settings are restored from a device with incompatible
         // ringer modes
         if (!isValidRingerMode(ringerMode)) {
             ringerMode = AudioManager.RINGER_MODE_NORMAL;
@@ -3169,7 +3169,7 @@
         // For automotive,
         // - the car service is always running as system user
         // - foreground users are non-system users
-        // Car service is in charge of dispatching the key event include master mute to Android.
+        // Car service is in charge of dispatching the key event include global mute to Android.
         // Therefore, the getCurrentUser() is always different to the foreground user.
         if ((isPlatformAutomotive() && userId == UserHandle.USER_SYSTEM)
                 || (getCurrentUserId() == userId)) {
@@ -3181,7 +3181,7 @@
         }
     }
 
-    /** get master mute state. */
+    /** get global mute state. */
     public boolean isMasterMute() {
         return AudioSystem.getMasterMute();
     }
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/Convert.java b/services/core/java/com/android/server/broadcastradio/hal2/Convert.java
index cbfa87f..726cdc3 100644
--- a/services/core/java/com/android/server/broadcastradio/hal2/Convert.java
+++ b/services/core/java/com/android/server/broadcastradio/hal2/Convert.java
@@ -170,7 +170,7 @@
         int len = config.ranges.size();
         List<RadioManager.BandDescriptor> bands = new ArrayList<>(len);
 
-        // Just a dummy value.
+        // Just a placeholder value.
         int region = RadioManager.REGION_ITU_1;
 
         for (AmFmBandRange range : config.ranges) {
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 041bedc..6735da8 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -728,7 +728,7 @@
         // Sync adapters were able to access the synced account without the accounts
         // permission which circumvents our permission model. Therefore, we require
         // sync adapters that don't have access to the account to get user consent.
-        // This can be noisy, therefore we will white-list sync adapters installed
+        // This can be noisy, therefore we will allowlist sync adapters installed
         // before we started checking for account access because they already know
         // the account (they run before) which is the genie is out of the bottle.
         whiteListExistingSyncAdaptersIfNeeded();
diff --git a/services/core/java/com/android/server/content/SyncOperation.java b/services/core/java/com/android/server/content/SyncOperation.java
index 09b7828..4787635 100644
--- a/services/core/java/com/android/server/content/SyncOperation.java
+++ b/services/core/java/com/android/server/content/SyncOperation.java
@@ -50,7 +50,7 @@
     public static final int REASON_IS_SYNCABLE = -5;
     /** Sync started because it has just been set to sync automatically. */
     public static final int REASON_SYNC_AUTO = -6;
-    /** Sync started because master sync automatically has been set to true. */
+    /** Sync started because global sync automatically has been set to true. */
     public static final int REASON_MASTER_SYNC_AUTO = -7;
     public static final int REASON_USER_START = -8;
 
diff --git a/services/core/java/com/android/server/contentcapture/ContentCaptureManagerInternal.java b/services/core/java/com/android/server/contentcapture/ContentCaptureManagerInternal.java
index ad04b7d..c33b5f1 100644
--- a/services/core/java/com/android/server/contentcapture/ContentCaptureManagerInternal.java
+++ b/services/core/java/com/android/server/contentcapture/ContentCaptureManagerInternal.java
@@ -48,7 +48,7 @@
 
     /**
      * Gets the content capture options for the given user and package, or {@code null} if the
-     * package is not whitelisted by the service.
+     * package is not allowlisted by the service.
      *
      * <p><b>NOTE: </b>this method is called by the {@code ActivityManager} service and hence cannot
      * hold the main service lock.
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index 36d69c9..34db014 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -190,7 +190,7 @@
 
     // When the short term model is invalidated, we don't necessarily reset it (i.e. clear the
     // user's adjustment) immediately, but wait for a drastic enough change in the ambient light.
-    // The anchor determines what were the light levels when the user has set her preference, and
+    // The anchor determines what were the light levels when the user has set their preference, and
     // we use a relative threshold to determine when to revert to the OEM curve.
     private boolean mShortTermModelValid;
     private float mShortTermModelAnchor;
diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java
index 3c05080..144c27d 100644
--- a/services/core/java/com/android/server/display/DisplayModeDirector.java
+++ b/services/core/java/com/android/server/display/DisplayModeDirector.java
@@ -700,7 +700,7 @@
         // Application can specify preferred refresh rate with below attrs.
         // @see android.view.WindowManager.LayoutParams#preferredRefreshRate
         // @see android.view.WindowManager.LayoutParams#preferredDisplayModeId
-        // System also forces some apps like blacklisted app to run at a lower refresh rate.
+        // System also forces some apps like denylisted app to run at a lower refresh rate.
         // @see android.R.array#config_highRefreshRateBlacklist
         public static final int PRIORITY_APP_REQUEST_REFRESH_RATE = 3;
         public static final int PRIORITY_APP_REQUEST_SIZE = 4;
diff --git a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java
index 2672f84..6763585 100644
--- a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java
+++ b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java
@@ -70,7 +70,7 @@
  * <p>See {@code com.android.server.autofill.AutofillManagerService} for a concrete
  * (no pun intended) example of how to use it.
  *
- * @param <M> "master" service class.
+ * @param <M> "main" service class.
  * @param <S> "real" service class.
  *
  * @hide
diff --git a/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java b/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java
index 16cf7ee..757a5cc 100644
--- a/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java
+++ b/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java
@@ -41,7 +41,7 @@
  * Companion for {@link AbstractMasterSystemService}, it's the base class for the "real" service
  * implementation.
  *
- * @param <M> "master" service class.
+ * @param <M> "main" service class.
  * @param <S> "real" service class.
  *
  * @hide
@@ -208,7 +208,7 @@
     }
 
     /**
-     * Gets the master service.
+     * Gets the main service.
      */
     public final M getMaster() {
         return mMaster;
@@ -301,7 +301,7 @@
     }
 
     /**
-     * Removes the service from the master's cache.
+     * Removes the service from the main service's cache.
      */
     protected final void removeSelfFromCacheLocked() {
         mMaster.removeCachedServiceLocked(mUserId);
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index c9c8698..2127c72 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -3199,7 +3199,7 @@
         boolean res = false;
         if (mCurMethod != null) {
             if (DEBUG) Slog.d(TAG, "showCurrentInputLocked: mCurToken=" + mCurToken);
-            // create a dummy token for IMS so that IMS cannot inject windows into client app.
+            // create a placeholder token for IMS so that IMS cannot inject windows into client app.
             Binder showInputToken = new Binder();
             mShowRequestWindowMap.put(showInputToken, windowToken);
             executeOrSendMessage(mCurMethod, mCaller.obtainMessageIIOOO(
diff --git a/services/core/java/com/android/server/location/gnss/GnssConfiguration.java b/services/core/java/com/android/server/location/gnss/GnssConfiguration.java
index 14ab79e..890f51b 100644
--- a/services/core/java/com/android/server/location/gnss/GnssConfiguration.java
+++ b/services/core/java/com/android/server/location/gnss/GnssConfiguration.java
@@ -200,7 +200,7 @@
     }
 
     /**
-     * Updates the GNSS HAL satellite blacklist.
+     * Updates the GNSS HAL satellite denylist.
      */
     void setSatelliteBlacklist(int[] constellations, int[] svids) {
         native_set_satellite_blacklist(constellations, svids);
diff --git a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java
index a6a607e..5bd3c57 100644
--- a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java
@@ -297,7 +297,7 @@
 
     // if the fix interval is below this we leave GPS on,
     // if above then we cycle the GPS driver.
-    // Typical hot TTTF is ~5 seconds, so 10 seconds seems sane.
+    // Typical hot TTTF is ~5 seconds, so 10 seconds seems valid.
     private static final int GPS_POLLING_THRESHOLD_INTERVAL = 10 * 1000;
 
     // how long to wait if we have a network error in NTP or PSDS downloading
diff --git a/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java b/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java
index 3fb713b..531aef6 100644
--- a/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java
+++ b/services/core/java/com/android/server/location/gnss/GnssNetworkConnectivityHandler.java
@@ -516,7 +516,7 @@
 
         if (mAGpsDataConnectionState == AGPS_DATA_CONNECTION_OPENING) {
             if (apn == null) {
-                // assign a dummy value in the case of C2K as otherwise we will have a runtime
+                // assign a placeholder value in the case of C2K as otherwise we will have a runtime
                 // exception in the following call to native_agps_data_conn_open
                 apn = "dummy-apn";
             }
diff --git a/services/core/java/com/android/server/location/gnss/GnssSatelliteBlacklistHelper.java b/services/core/java/com/android/server/location/gnss/GnssSatelliteBlacklistHelper.java
index dccef9b..426ce8c 100644
--- a/services/core/java/com/android/server/location/gnss/GnssSatelliteBlacklistHelper.java
+++ b/services/core/java/com/android/server/location/gnss/GnssSatelliteBlacklistHelper.java
@@ -31,7 +31,7 @@
 import java.util.List;
 
 /**
- * Detects blacklist change and updates the blacklist.
+ * Detects denylist change and updates the denylist.
  */
 class GnssSatelliteBlacklistHelper {
 
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 90370dd..cef5cb6 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -2590,11 +2590,11 @@
      *     make it consistent with current behaviour. It also allows ActivityManager to call
      *     unlockUser() with empty secret.
      * 3. Once a user is migrated to have synthetic password, its value will never change, no matter
-     *     whether the user changes his lockscreen PIN or clear/reset it. When the user clears its
+     *     whether the user changes their lockscreen PIN or clear/reset it. When the user clears its
      *     lockscreen PIN, we still maintain the existing synthetic password in a password blob
      *     protected by a default PIN.
      * 4. The user SID is linked with synthetic password, but its cleared/re-created when the user
-     *     clears/re-creates his lockscreen PIN.
+     *     clears/re-creates their lockscreen PIN.
      *
      *
      * Different cases of calling this method:
diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
index d644b1d..6b5295f 100644
--- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
+++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
@@ -149,15 +149,15 @@
     }
 
     /**
-     * This class represents the master cryptographic secret for a given user (a.k.a synthietic
+     * This class represents the main cryptographic secret for a given user (a.k.a synthietic
      * password). This secret is derived from the user's lockscreen credential or password escrow
      * token. All other cryptograhic keys related to the user, including disk encryption key,
      * keystore encryption key, gatekeeper auth key, vendor auth secret and others are directly
      * derived from this token.
      * <p>
-     * The master secret associated with an authentication token is retrievable from
+     * The main secret associated with an authentication token is retrievable from
      * {@link AuthenticationToken#getSyntheticPassword()} and the authentication token can be
-     * reconsturcted from the master secret later with
+     * reconsturcted from the main secret later with
      * {@link AuthenticationToken#recreateDirectly(byte[])}. The first time an authentication token
      * is needed, it should be created with {@link AuthenticationToken#create()} so that the
      * necessary escrow data ({@link #mEncryptedEscrowSplit0} and {@link #mEscrowSplit1}) is
@@ -166,7 +166,7 @@
      * needs to securely store the secret returned from
      * {@link AuthenticationToken#getEscrowSecret()}, and at the time of use, load the escrow data
      * back with {@link AuthenticationToken#setEscrowData(byte[], byte[])} and then re-create the
-     * master secret from the escrow secret via
+     * main secret from the escrow secret via
      * {@link AuthenticationToken#recreateFromEscrow(byte[])}.
      */
     static class AuthenticationToken {
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 9e91a9f..b02b900 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -816,7 +816,7 @@
      * Information about a full user and its corresponding managed profiles.
      *
      * <p>Since the full user runs together with its managed profiles, a user wouldn't differentiate
-     * them when he/she presses a media/volume button. So keeping media sessions for them in one
+     * them when they press a media/volume button. So keeping media sessions for them in one
      * place makes more sense and increases the readability.</p>
      * <p>The contents of this object is guarded by {@link #mLock}.
      */
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java b/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java
index 48f1ddb..407cedf 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java
@@ -72,11 +72,11 @@
     }
 
     /**
-     * Informs that an appId has been added or removed from the temp-powersave-whitelist so that
+     * Informs that an appId has been added or removed from the temp-powersave-allowlist so that
      * that network rules for that appId can be updated.
      *
-     * @param appId The appId which has been updated in the whitelist.
-     * @param added Denotes whether the {@param appId} has been added or removed from the whitelist.
+     * @param appId The appId which has been updated in the allowlist.
+     * @param added Denotes whether the {@param appId} has been added or removed from the allowlist.
      */
     public abstract void onTempPowerSaveWhitelistChange(int appId, boolean added);
 
@@ -107,7 +107,7 @@
     public abstract void onAdminDataAvailable();
 
     /**
-     * Control if a UID should be whitelisted even if it's in app idle mode. Other restrictions may
+     * Control if a UID should be allowlisted even if it's in app idle mode. Other restrictions may
      * still be in effect.
      */
     public abstract void setAppIdleWhitelist(int uid, boolean shouldWhitelist);
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 29ee8eb..2d7e79a 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -478,7 +478,7 @@
     // and "battery saver" are not equivalent.
 
     /**
-     * UIDs that have been white-listed to always be able to have network access
+     * UIDs that have been allowlisted to always be able to have network access
      * in power save mode, except device idle (doze) still applies.
      * TODO: An int array might be sufficient
      */
@@ -486,7 +486,7 @@
     private final SparseBooleanArray mPowerSaveWhitelistExceptIdleAppIds = new SparseBooleanArray();
 
     /**
-     * UIDs that have been white-listed to always be able to have network access
+     * UIDs that have been allowlisted to always be able to have network access
      * in power save mode.
      * TODO: An int array might be sufficient
      */
@@ -497,21 +497,21 @@
     private final SparseBooleanArray mPowerSaveTempWhitelistAppIds = new SparseBooleanArray();
 
     /**
-     * UIDs that have been white-listed temporarily to be able to have network access despite being
+     * UIDs that have been allowlisted temporarily to be able to have network access despite being
      * idle. Other power saving restrictions still apply.
      */
     @GuardedBy("mUidRulesFirstLock")
     private final SparseBooleanArray mAppIdleTempWhitelistAppIds = new SparseBooleanArray();
 
     /**
-     * UIDs that have been initially white-listed by system to avoid restricted background.
+     * UIDs that have been initially allowlisted by system to avoid restricted background.
      */
     @GuardedBy("mUidRulesFirstLock")
     private final SparseBooleanArray mDefaultRestrictBackgroundAllowlistUids =
             new SparseBooleanArray();
 
     /**
-     * UIDs that have been initially white-listed by system to avoid restricted background,
+     * UIDs that have been initially allowlisted by system to avoid restricted background,
      * but later revoked by user.
      */
     @GuardedBy("mUidRulesFirstLock")
@@ -819,7 +819,7 @@
                 // ignored; both services live in system_server
             }
 
-            // listen for changes to power save whitelist
+            // listen for changes to power save allowlist
             final IntentFilter whitelistFilter = new IntentFilter(
                     PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED);
             mContext.registerReceiver(mPowerSaveWhitelistReceiver, whitelistFilter, null, mHandler);
@@ -3775,7 +3775,7 @@
     }
 
     // NOTE: since both fw_dozable and fw_powersave uses the same map
-    // (mPowerSaveTempWhitelistAppIds) for whitelisting, we can reuse their logic in this method.
+    // (mPowerSaveTempWhitelistAppIds) for allowlisting, we can reuse their logic in this method.
     @GuardedBy("mUidRulesFirstLock")
     private void updateRulesForWhitelistedPowerSaveUL(boolean enabled, int chain,
             SparseIntArray rules) {
@@ -3817,12 +3817,12 @@
     }
 
     /**
-     * Returns whether a uid is whitelisted from power saving restrictions (eg: Battery Saver, Doze
+     * Returns whether a uid is allowlisted from power saving restrictions (eg: Battery Saver, Doze
      * mode, and app idle).
      *
      * @param deviceIdleMode if true then we don't consider
      *        {@link #mPowerSaveWhitelistExceptIdleAppIds} for checking if the {@param uid} is
-     *        whitelisted.
+     *        allowlisted.
      */
     @GuardedBy("mUidRulesFirstLock")
     private boolean isWhitelistedFromPowerSaveUL(int uid, boolean deviceIdleMode) {
@@ -3836,7 +3836,7 @@
     }
 
     // NOTE: since both fw_dozable and fw_powersave uses the same map
-    // (mPowerSaveTempWhitelistAppIds) for whitelisting, we can reuse their logic in this method.
+    // (mPowerSaveTempWhitelistAppIds) for allowlisting, we can reuse their logic in this method.
     @GuardedBy("mUidRulesFirstLock")
     private void updateRulesForWhitelistedPowerSaveUL(int uid, boolean enabled, int chain) {
         if (enabled) {
@@ -4095,7 +4095,7 @@
     }
 
     /**
-     * Set whether or not an app should be whitelisted for network access while in app idle. Other
+     * Set whether or not an app should be allowlisted for network access while in app idle. Other
      * power saving restrictions may still apply.
      */
     @VisibleForTesting
@@ -4124,7 +4124,7 @@
         }
     }
 
-    /** Return the list of UIDs currently in the app idle whitelist. */
+    /** Return the list of UIDs currently in the app idle allowlist. */
     @VisibleForTesting
     int[] getAppIdleWhitelist() {
         mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG);
@@ -4144,7 +4144,7 @@
     boolean isUidIdle(int uid) {
         synchronized (mUidRulesFirstLock) {
             if (mAppIdleTempWhitelistAppIds.get(uid)) {
-                // UID is temporarily whitelisted.
+                // UID is temporarily allowlisted.
                 return false;
             }
         }
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index d4a5788..179118c 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -510,7 +510,7 @@
 
     private static final int MY_UID = Process.myUid();
     private static final int MY_PID = Process.myPid();
-    private static final IBinder WHITELIST_TOKEN = new Binder();
+    private static final IBinder ALLOWLIST_TOKEN = new Binder();
     protected RankingHandler mRankingHandler;
     private long mLastOverRateLogTime;
     private float mMaxPackageEnqueueRate = DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE;
@@ -1706,7 +1706,7 @@
         super(context);
         mNotificationRecordLogger = notificationRecordLogger;
         mNotificationInstanceIdSequence = notificationInstanceIdSequence;
-        Notification.processWhitelistToken = WHITELIST_TOKEN;
+        Notification.processAllowlistToken = ALLOWLIST_TOKEN;
     }
 
     // TODO - replace these methods with new fields in the VisibleForTesting constructor
@@ -5762,21 +5762,21 @@
             mShortcutHelper.cacheShortcut(info, user);
         }
 
-        // Whitelist pending intents.
+        // temporarily allow apps to perform extra work when their pending intents are launched
         if (notification.allPendingIntents != null) {
             final int intentCount = notification.allPendingIntents.size();
             if (intentCount > 0) {
                 final ActivityManagerInternal am = LocalServices
                         .getService(ActivityManagerInternal.class);
                 final long duration = LocalServices.getService(
-                        DeviceIdleInternal.class).getNotificationWhitelistDuration();
+                        DeviceIdleInternal.class).getNotificationAllowlistDuration();
                 for (int i = 0; i < intentCount; i++) {
                     PendingIntent pendingIntent = notification.allPendingIntents.valueAt(i);
                     if (pendingIntent != null) {
                         am.setPendingIntentWhitelistDuration(pendingIntent.getTarget(),
-                                WHITELIST_TOKEN, duration);
+                                ALLOWLIST_TOKEN, duration);
                         am.setPendingIntentAllowBgActivityStarts(pendingIntent.getTarget(),
-                                WHITELIST_TOKEN, (FLAG_ACTIVITY_SENDER | FLAG_BROADCAST_SENDER
+                                ALLOWLIST_TOKEN, (FLAG_ACTIVITY_SENDER | FLAG_BROADCAST_SENDER
                                         | FLAG_SERVICE_SENDER));
                     }
                 }
@@ -7629,7 +7629,7 @@
                     // make sure deleteIntent cannot be used to start activities from background
                     LocalServices.getService(ActivityManagerInternal.class)
                             .clearPendingIntentAllowBgActivityStarts(deleteIntent.getTarget(),
-                            WHITELIST_TOKEN);
+                            ALLOWLIST_TOKEN);
                     deleteIntent.send();
                 } catch (PendingIntent.CanceledException ex) {
                     // do nothing - there's no relevant way to recover, and
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index 5415967..0dfa081 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -461,7 +461,7 @@
     }
 
     private int reconcileSecondaryDexFiles(DexManager dm) {
-        // TODO(calin): should we blacklist packages for which we fail to reconcile?
+        // TODO(calin): should we denylist packages for which we fail to reconcile?
         for (String p : dm.getAllPackagesWithSecondaryDexFiles()) {
             if (mAbortIdleOptimization.get()) {
                 return OPTIMIZE_ABORT_BY_JOB_SCHEDULER;
diff --git a/services/core/java/com/android/server/pm/DynamicCodeLoggingService.java b/services/core/java/com/android/server/pm/DynamicCodeLoggingService.java
index 784f701..da65fe2 100644
--- a/services/core/java/com/android/server/pm/DynamicCodeLoggingService.java
+++ b/services/core/java/com/android/server/pm/DynamicCodeLoggingService.java
@@ -204,7 +204,7 @@
             //
             // A typical message might look like this:
             // type=1400 audit(0.0:521): avc: granted { execute } for comm="executable"
-            //  path="/data/data/com.dummy.app/executable" dev="sda13" ino=1655302
+            //  path="/data/data/com.placeholder.app/executable" dev="sda13" ino=1655302
             //  scontext=u:r:untrusted_app_27:s0:c66,c257,c512,c768
             //  tcontext=u:object_r:app_data_file:s0:c66,c257,c512,c768 tclass=file
             //
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index 0d8ba3e..7960735 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -193,7 +193,7 @@
         String[] classLoaderContexts = DexoptUtils.getClassLoaderContexts(
                 pkg, sharedLibraries, pathsWithCode);
 
-        // Sanity check that we do not call dexopt with inconsistent data.
+        // Validity check that we do not call dexopt with inconsistent data.
         if (paths.size() != classLoaderContexts.length) {
             String[] splitCodePaths = pkg.getSplitCodePaths();
             throw new IllegalStateException("Inconsistent information "
@@ -676,7 +676,7 @@
         int profileFlag = isProfileGuidedFilter ? DEXOPT_PROFILE_GUIDED : 0;
         // Some apps are executed with restrictions on hidden API usage. If this app is one
         // of them, pass a flag to dexopt to enable the same restrictions during compilation.
-        // TODO we should pass the actual flag value to dexopt, rather than assuming blacklist
+        // TODO we should pass the actual flag value to dexopt, rather than assuming denylist
         // TODO(b/135203078): This flag is no longer set as part of AndroidPackage
         //  and may not be preserved
         int hiddenApiFlag = hiddenApiEnforcementPolicy == HIDDEN_API_ENFORCEMENT_DISABLED
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f6a7ceb..81748b2 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2106,7 +2106,7 @@
                 res.removedInfo.sendPackageRemovedBroadcasts(killApp);
             }
 
-            // Whitelist any restricted permissions first as some may be runtime
+            // Allowlist any restricted permissions first as some may be runtime
             // that the installer requested to be granted at install time.
             if (whitelistedRestrictedPermissions != null
                     && !whitelistedRestrictedPermissions.isEmpty()) {
@@ -3506,7 +3506,7 @@
                 ver.fingerprint = Build.FINGERPRINT;
             }
 
-            // Grandfather existing (installed before Q) non-system apps to hide
+            // Legacy existing (installed before Q) non-system apps to hide
             // their icons in launcher.
             if (!mOnlyCore && mIsPreQUpgrade) {
                 Slog.i(TAG, "Whitelisting all existing apps to hide their icons");
@@ -7369,7 +7369,7 @@
                 Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
             } else {
                 // we have an instant application locally, but, we can't admit that since
-                // callers shouldn't be able to determine prior browsing. create a dummy
+                // callers shouldn't be able to determine prior browsing. create a placeholder
                 // auxiliary response so the downstream code behaves as if there's an
                 // instant application available externally. when it comes time to start
                 // the instant application, we'll do the right thing.
@@ -10947,7 +10947,7 @@
             if (sharedUserSetting != null && sharedUserSetting.isPrivileged()) {
                 // Exempt SharedUsers signed with the platform key.
                 // TODO(b/72378145) Fix this exemption. Force signature apps
-                // to whitelist their privileged permissions just like other
+                // to allowlist their privileged permissions just like other
                 // priv-apps.
                 synchronized (mLock) {
                     PackageSetting platformPkgSetting = mSettings.mPackages.get("android");
@@ -16276,7 +16276,7 @@
 
     /**
      * A container of all data needed to commit a package to in-memory data structures and to disk.
-     * TODO: move most of the data contained her into a PackageSetting for commit.
+     * TODO: move most of the data contained here into a PackageSetting for commit.
      */
     private static class ReconciledPackage {
         public final ReconcileRequest request;
@@ -17046,7 +17046,7 @@
 
             // Notify BackgroundDexOptService that the package has been changed.
             // If this is an update of a package which used to fail to compile,
-            // BackgroundDexOptService will remove it from its blacklist.
+            // BackgroundDexOptService will remove it from its denylist.
             // TODO: Layering violation
             BackgroundDexOptService.notifyPackageChanged(packageName);
 
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index c1115e3..09682c6 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -2744,7 +2744,7 @@
         final InstallParams params = new InstallParams();
 
         params.sessionParams = sessionParams;
-        // Whitelist all permissions by default
+        // Allowlist all permissions by default
         sessionParams.installFlags |= PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS;
 
         String opt;
diff --git a/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java b/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java
index d4a02a9..eae89f0 100644
--- a/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java
+++ b/services/core/java/com/android/server/pm/ShortcutRequestPinProcessor.java
@@ -497,7 +497,7 @@
                     Slog.d(TAG, "Temporarily adding " + shortcutId + " as dynamic");
                 }
                 // Add as a dynamic shortcut.  In order for a shortcut to be dynamic, it must
-                // have a target activity, so we set a dummy here.  It's later removed
+                // have a target activity, so we set a placeholder here.  It's later removed
                 // in deleteDynamicWithId().
                 if (original.getActivity() == null) {
                     original.setActivity(mService.getDummyMainActivity(appPackageName));
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 0c42ff6..ef48a51 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -3963,7 +3963,7 @@
     }
 
     /**
-     * Create a dummy "main activity" component name which is used to create a dynamic shortcut
+     * Create a placeholder "main activity" component name which is used to create a dynamic shortcut
      * with no main activity temporarily.
      */
     @NonNull
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index 5b1c0fd..e2bd1f1 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -1388,7 +1388,7 @@
         }
 
         /**
-         * A dummy state for starting the pre reboot verification.
+         * A placeholder state for starting the pre reboot verification.
          *
          * See {@link PreRebootVerificationHandler} to see all nodes of pre reboot verification
          */
diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
index 14d043c..cf4b456 100644
--- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
+++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
@@ -734,7 +734,7 @@
             case android.provider.Settings.Secure.ALWAYS_ON_VPN_APP:
             case android.provider.Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN:
             case android.provider.Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN_WHITELIST:
-                // Whitelist system uid (ConnectivityService) and root uid to change always-on vpn
+                // Allowlist system uid (ConnectivityService) and root uid to change always-on vpn
                 final int appId = UserHandle.getAppId(callingUid);
                 if (appId == Process.SYSTEM_UID || appId == Process.ROOT_UID) {
                     return false;
diff --git a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
index 492b84a..55f52a4 100644
--- a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
+++ b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java
@@ -49,41 +49,41 @@
 /**
  * Responsible for un/installing system packages based on user type.
  *
- * <p>Uses the SystemConfig's install-in-user-type whitelist;
+ * <p>Uses the SystemConfig's install-in-user-type allowlist;
  * see {@link SystemConfig#getAndClearPackageToUserTypeWhitelist} and
  * {@link SystemConfig#getAndClearPackageToUserTypeBlacklist}.
  *
  * <p>If {@link #isEnforceMode()} is false, then all system packages are always installed for all
  * users. The following applies when it is true.
  *
- * <p>Any package can be in one of three states in the {@code SystemConfig} whitelist
+ * <p>Any package can be in one of three states in the {@code SystemConfig} allowlist
  * <ol>
- *     <li>Explicitly blacklisted for a particular user type</li>
- *     <li>Explicitly whitelisted for a particular user type</li>
- *     <li>Not mentioned at all, for any user type (neither whitelisted nor blacklisted)</li>
+ *     <li>Explicitly denylisted for a particular user type</li>
+ *     <li>Explicitly allowlisted for a particular user type</li>
+ *     <li>Not mentioned at all, for any user type (neither allowlisted nor denylisted)</li>
  * </ol>
  *
- * <p>Blacklisting always takes precedence - if a package is blacklisted for a particular user,
- * it won't be installed on that type of user (even if it is also whitelisted for that user).
- * Next comes whitelisting - if it is whitelisted for a particular user, it will be installed on
- * that type of user (as long as it isn't blacklisted).
- * Finally, if the package is not mentioned at all (i.e. neither whitelisted nor blacklisted for
+ * <p>Denylisting always takes precedence - if a package is denylisted for a particular user,
+ * it won't be installed on that type of user (even if it is also allowlisted for that user).
+ * Next comes allowlisting - if it is allowlisted for a particular user, it will be installed on
+ * that type of user (as long as it isn't denylisted).
+ * Finally, if the package is not mentioned at all (i.e. neither allowlisted nor denylisted for
  * any user types) in the SystemConfig 'install-in-user-type' lists
  * then:
  * <ul>
- *     <li>If {@link #isImplicitWhitelistMode()}, the package is implicitly treated as whitelisted
+ *     <li>If {@link #isImplicitWhitelistMode()}, the package is implicitly treated as allowlisted
  *          for <b>all</b> users</li>
  *     <li>Otherwise, if {@link #isImplicitWhitelistSystemMode()}, the package is implicitly treated
- *          as whitelisted for the <b>{@link UserHandle#USER_SYSTEM}</b> user (not other users),
+ *          as allowlisted for the <b>{@link UserHandle#USER_SYSTEM}</b> user (not other users),
  *          which is useful for local development purposes</li>
- *     <li>Otherwise, the package is implicitly treated as blacklisted for all users</li>
+ *     <li>Otherwise, the package is implicitly treated as denylisted for all users</li>
  * </ul>
  *
  * <p>Packages are only installed/uninstalled by this mechanism when a new user is created or during
  * an update. In the case of updates:<ul>
- *     <li>new packages are (un)installed per the whitelist/blacklist</li>
- *     <li>pre-existing installed blacklisted packages are never uninstalled</li>
- *     <li>pre-existing not-installed whitelisted packages are only installed if the reason why they
+ *     <li>new packages are (un)installed per the allowlist/denylist</li>
+ *     <li>pre-existing installed denylisted packages are never uninstalled</li>
+ *     <li>pre-existing not-installed allowlisted packages are only installed if the reason why they
  *     had been previously uninstalled was due to UserSystemPackageInstaller</li>
  * </ul>
  *
@@ -99,14 +99,14 @@
     private static final boolean DEBUG = false;
 
     /**
-     * System Property whether to only install system packages on a user if they're whitelisted for
+     * System Property whether to only install system packages on a user if they're allowlisted for
      * that user type. These are flags and can be freely combined.
      * <ul>
-     * <li> 0  - disable whitelist (install all system packages; no logging)</li>
-     * <li> 1  - enforce (only install system packages if they are whitelisted)</li>
-     * <li> 2  - log (log non-whitelisted packages)</li>
-     * <li> 4  - for all users: implicitly whitelist any package not mentioned in the whitelist</li>
-     * <li> 8  - for SYSTEM: implicitly whitelist any package not mentioned in the whitelist</li>
+     * <li> 0  - disable allowlist (install all system packages; no logging)</li>
+     * <li> 1  - enforce (only install system packages if they are allowlisted)</li>
+     * <li> 2  - log (log non-allowlisted packages)</li>
+     * <li> 4  - for all users: implicitly allowlist any package not mentioned in the allowlist</li>
+     * <li> 8  - for SYSTEM: implicitly allowlist any package not mentioned in the allowlist</li>
      * <li> 16 - ignore OTAs (don't install system packages during OTAs)</li>
      * <li>-1  - use device default (as defined in res/res/values/config.xml)</li>
      * </ul>
@@ -147,7 +147,7 @@
      * then mWhitelistedPackagesForUserTypes.get("pkg1") will be a Long whose
      * bit in position 3 will equal 1.
      * <p>
-     * Packages that are whitelisted, but then blacklisted so that they aren't to be installed on
+     * Packages that are allowlisted, but then denylisted so that they aren't to be installed on
      * any user, are purposefully still present in this list.
      */
     private final ArrayMap<String, Long> mWhitelistedPackagesForUserTypes;
@@ -187,10 +187,10 @@
 
     /**
      * During OTAs and first boot, install/uninstall all system packages for all users based on the
-     * user's user type and the SystemConfig whitelist.
+     * user's user type and the SystemConfig allowlist.
      * We do NOT uninstall packages during an OTA though.
      *
-     * This is responsible for enforcing the whitelist for pre-existing users (i.e. USER_SYSTEM);
+     * This is responsible for enforcing the allowlist for pre-existing users (i.e. USER_SYSTEM);
      * enforcement for new users is done when they are created in UserManagerService.createUser().
      *
      * @param preExistingPackages list of packages on the device prior to the upgrade. Cannot be
@@ -268,7 +268,7 @@
     }
 
     /**
-     * Checks whether the system packages and the mWhitelistedPackagesForUserTypes whitelist are
+     * Checks whether the system packages and the mWhitelistedPackagesForUserTypes allowlist are
      * in 1-to-1 correspondence.
      */
     private void checkWhitelistedSystemPackages(@PackageWhitelistMode int mode) {
@@ -277,7 +277,7 @@
         }
         Slog.v(TAG,  "Checking that all system packages are whitelisted.");
 
-        // Check whether all whitelisted packages are indeed on the system.
+        // Check whether all allowlisted packages are indeed on the system.
         final List<String> warnings = getPackagesWhitelistWarnings();
         final int numberWarnings = warnings.size();
         if (numberWarnings == 0) {
@@ -291,7 +291,7 @@
             }
         }
 
-        // Check whether all system packages are indeed whitelisted.
+        // Check whether all system packages are indeed allowlisted.
         if (isImplicitWhitelistMode(mode) && !isLogMode(mode)) {
             return;
         }
@@ -319,7 +319,7 @@
     }
 
     /**
-     * Gets packages that are listed in the whitelist XML but are not present on the system image.
+     * Gets packages that are listed in the allowlist XML but are not present on the system image.
      */
     @NonNull
     private List<String> getPackagesWhitelistWarnings() {
@@ -327,7 +327,7 @@
         final List<String> warnings = new ArrayList<>();
         final PackageManagerInternal pmInt = LocalServices.getService(PackageManagerInternal.class);
 
-        // Check whether all whitelisted packages are indeed on the system.
+        // Check whether all allowlisted packages are indeed on the system.
         final String notPresentFmt = "%s is whitelisted but not present.";
         final String notSystemFmt = "%s is whitelisted and present but not a system package.";
         final String overlayPackageFmt = "%s is whitelisted but it's auto-generated RRO package.";
@@ -345,7 +345,7 @@
     }
 
     /**
-     * Gets packages that are not listed in the whitelist XMLs when they should be.
+     * Gets packages that are not listed in the allowlist XMLs when they should be.
      */
     @NonNull
     private List<String> getPackagesWhitelistErrors(@PackageWhitelistMode int mode) {
@@ -357,7 +357,7 @@
         final Set<String> allWhitelistedPackages = getWhitelistedSystemPackages();
         final PackageManagerInternal pmInt = LocalServices.getService(PackageManagerInternal.class);
 
-        // Check whether all system packages are indeed whitelisted.
+        // Check whether all system packages are indeed allowlisted.
         final String logMessageFmt = "System package %s is not whitelisted using "
                 + "'install-in-user-type' in SystemConfig for any user types!";
         pmInt.forEachPackage(pkg -> {
@@ -372,7 +372,7 @@
         return errors;
     }
 
-    /** Whether to only install system packages in new users for which they are whitelisted. */
+    /** Whether to only install system packages in new users for which they are allowlisted. */
     boolean isEnforceMode() {
         return isEnforceMode(getWhitelistMode());
     }
@@ -383,7 +383,7 @@
      * If in this mode, old system packages will not be installed on pre-existing users during OTAs.
      * Any system packages that had not been installed at the time of the user's creation,
      * due to {@link UserSystemPackageInstaller}'s previous actions, will therefore continue to
-     * remain uninstalled, even if the whitelist (or enforcement mode) now declares that they should
+     * remain uninstalled, even if the allowlist (or enforcement mode) now declares that they should
      * be.
      */
     boolean isIgnoreOtaMode() {
@@ -391,23 +391,23 @@
     }
 
     /**
-     * Whether to log a warning concerning potential problems with the user-type package whitelist.
+     * Whether to log a warning concerning potential problems with the user-type package allowlist.
      */
     boolean isLogMode() {
         return isLogMode(getWhitelistMode());
     }
 
     /**
-     * Whether to treat all packages that are not mentioned at all in the whitelist to be implicitly
-     * whitelisted for all users.
+     * Whether to treat all packages that are not mentioned at all in the allowlist to be implicitly
+     * allowlisted for all users.
      */
     boolean isImplicitWhitelistMode() {
         return isImplicitWhitelistMode(getWhitelistMode());
     }
 
     /**
-     * Whether to treat all packages that are not mentioned at all in the whitelist to be implicitly
-     * whitelisted for the SYSTEM user.
+     * Whether to treat all packages that are not mentioned at all in the allowlist to be implicitly
+     * allowlisted for the SYSTEM user.
      */
     boolean isImplicitWhitelistSystemMode() {
         return isImplicitWhitelistSystemMode(getWhitelistMode());
@@ -494,7 +494,7 @@
 
     /**
      * Gets the system package names that should be installed on users of the given user type, as
-     * determined by SystemConfig, the whitelist mode, and the apps actually on the device.
+     * determined by SystemConfig, the allowlist mode, and the apps actually on the device.
      * Names are the {@link PackageParser.Package#packageName}, not necessarily the manifest names.
      *
      * Returns null if all system packages should be installed (due to enforce-mode being off).
@@ -516,7 +516,7 @@
             }
             if (shouldInstallPackage(pkg, mWhitelistedPackagesForUserTypes,
                     whitelistedPackages, implicitlyWhitelist)) {
-                // Although the whitelist uses manifest names, this function returns packageNames.
+                // Although the allowlist uses manifest names, this function returns packageNames.
                 installPackages.add(pkg.getPackageName());
             }
         });
@@ -525,7 +525,7 @@
 
     /**
      * Returns whether the given system package should be installed on the given user, based on the
-     * the given whitelist of system packages.
+     * the given allowlist of system packages.
      *
      * @param sysPkg the system package. Must be a system package; no verification for this is done.
      * @param userTypeWhitelist map of package manifest names to user types on which they should be
@@ -535,7 +535,7 @@
      *                      <b>particular</b> user. This must be consistent with userTypeWhitelist,
      *                      but is passed in separately to avoid repeatedly calculating it from
      *                      userTypeWhitelist.
-     * @param implicitlyWhitelist whether non-mentioned packages are implicitly whitelisted.
+     * @param implicitlyWhitelist whether non-mentioned packages are implicitly allowlisted.
      */
     @VisibleForTesting
     static boolean shouldInstallPackage(AndroidPackage sysPkg,
@@ -558,7 +558,7 @@
     }
 
     /**
-     * Gets the package manifest names that are whitelisted for users of the given user type,
+     * Gets the package manifest names that are allowlisted for users of the given user type,
      * as determined by SystemConfig.
      */
     @VisibleForTesting
@@ -577,9 +577,9 @@
 
     /**
      * Set of package manifest names that are included anywhere in the package-to-user-type
-     * whitelist, as determined by SystemConfig.
+     * allowlist, as determined by SystemConfig.
      *
-     * Packages that are whitelisted, but then blacklisted so that they aren't to be installed on
+     * Packages that are allowlisted, but then denylisted so that they aren't to be installed on
      * any user, are still present in this list, since that is a valid scenario (e.g. if an OEM
      * completely blacklists an AOSP app).
      */
@@ -597,9 +597,9 @@
      * To enforce this:
      * <ul>
      *  <li>Illegal user types are ignored.</li>
-     *  <li>Packages that never whitelisted at all (even if they are explicitly blacklisted) are
+     *  <li>Packages that never allowlisted at all (even if they are explicitly denylisted) are
      *          ignored.</li>
-     *  <li>Packages that are blacklisted whenever they are whitelisted will be stored with the
+     *  <li>Packages that are denylisted whenever they are allowlisted will be stored with the
      *          value 0 (since this is a valid scenario, e.g. if an OEM completely blacklists an
      *          AOSP app).</li>
      * </ul>
@@ -615,7 +615,7 @@
                 sysConfig.getAndClearPackageToUserTypeWhitelist();
         // result maps packageName -> userTypes on which the package should be installed.
         final ArrayMap<String, Long> result = new ArrayMap<>(whitelist.size() + 1);
-        // First, do the whitelisted user types.
+        // First, do the allowlisted user types.
         for (int i = 0; i < whitelist.size(); i++) {
             final String pkgName = whitelist.keyAt(i).intern();
             final long typesBitSet = getTypesBitSet(whitelist.valueAt(i), baseTypeBitSets);
@@ -623,7 +623,7 @@
                 result.put(pkgName, typesBitSet);
             }
         }
-        // Then, un-whitelist any blacklisted user types.
+        // Then, un-allowlist any denylisted user types.
         final ArrayMap<String, Set<String>> blacklist =
                 sysConfig.getAndClearPackageToUserTypeBlacklist();
         for (int i = 0; i < blacklist.size(); i++) {
@@ -633,7 +633,7 @@
             if (typesBitSet != null) {
                 result.put(pkgName, typesBitSet & ~nonTypesBitSet);
             } else if (nonTypesBitSet != 0) {
-                // Package was never whitelisted but is validly blacklisted.
+                // Package was never allowlisted but is validly denylisted.
                 result.put(pkgName, 0L);
             }
         }
diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
index 8000c63..a7f30fd 100644
--- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java
+++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
@@ -185,7 +185,7 @@
             return;
         }
 
-        // Sanity checks on the arguments.
+        // Validity checks on the arguments.
         Objects.requireNonNull(callback);
 
         boolean bootImageProfile = profileType == ArtManager.PROFILE_BOOT_IMAGE;
diff --git a/services/core/java/com/android/server/pm/dex/DexoptUtils.java b/services/core/java/com/android/server/pm/dex/DexoptUtils.java
index 6807388..94238cc 100644
--- a/services/core/java/com/android/server/pm/dex/DexoptUtils.java
+++ b/services/core/java/com/android/server/pm/dex/DexoptUtils.java
@@ -85,7 +85,7 @@
 
         // The application has splits. Compute their class loader contexts.
 
-        // First, cache the relative paths of the splits and do some sanity checks
+        // First, cache the relative paths of the splits and do some validity checks
         String[] splitRelativeCodePaths = getSplitRelativeCodePaths(pkg);
 
         // The splits have an implicit dependency on the base apk.
@@ -407,7 +407,7 @@
         for (int i = 0; i < splitRelativeCodePaths.length; i++) {
             File pathFile = new File(splitCodePaths[i]);
             splitRelativeCodePaths[i] = pathFile.getName();
-            // Sanity check that the base paths of the splits are all the same.
+            // Validity check that the base paths of the splits are all the same.
             String basePath = pathFile.getParent();
             if (!basePath.equals(baseCodePath)) {
                 Slog.wtf(TAG, "Split paths have different base paths: " + basePath + " and " +
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index cd53fb9..8548546 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -1267,10 +1267,10 @@
                         continue;
                     }
 
-                    // Preserve whitelisting flags.
+                    // Preserve allowlisting flags.
                     newFlags |= (flags & PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT);
 
-                    // If we are whitelisting the permission, update the exempt flag before grant.
+                    // If we are allowlisting the permission, update the exempt flag before grant.
                     if (whitelistRestrictedPermissions && pm.isPermissionRestricted(permission)) {
                         pm.updatePermissionFlags(permission, pkg,
                                 PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT,
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java
index 2e83b23..37f4059 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java
@@ -187,7 +187,7 @@
             @NonNull AndroidPackage pkg, @NonNull int[] userIds,
             @NonNull List<String> permissions, int callingUid,
             @PackageManager.PermissionWhitelistFlags int whitelistFlags);
-    /** Sets the whitelisted, restricted permissions for the given package. */
+    /** Sets the allowlisted, restricted permissions for the given package. */
     public abstract void setWhitelistedRestrictedPermissions(
             @NonNull String packageName, @NonNull List<String> permissions,
             @PackageManager.PermissionWhitelistFlags int flags, int userId);
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 764ac96..691ae23 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -3497,7 +3497,7 @@
                 }
                 if (mDeviceIdleMode) {
                     // If we are in idle mode, we will also ignore all partial wake locks that are
-                    // for application uids that are not whitelisted.
+                    // for application uids that are not allowlisted.
                     final UidState state = wakeLock.mUidState;
                     if (Arrays.binarySearch(mDeviceIdleWhitelist, appid) < 0 &&
                             Arrays.binarySearch(mDeviceIdleTempWhitelist, appid) < 0 &&
diff --git a/services/core/java/com/android/server/power/WirelessChargerDetector.java b/services/core/java/com/android/server/power/WirelessChargerDetector.java
index 0d910e4..f4a014a 100644
--- a/services/core/java/com/android/server/power/WirelessChargerDetector.java
+++ b/services/core/java/com/android/server/power/WirelessChargerDetector.java
@@ -92,7 +92,7 @@
     // cosine of the maximum angle variance that we tolerate while at rest.
     private static final double MOVEMENT_ANGLE_COS_THRESHOLD = Math.cos(5 * Math.PI / 180);
 
-    // Sanity thresholds for the gravity vector.
+    // Validity thresholds for the gravity vector.
     private static final double MIN_GRAVITY = SensorManager.GRAVITY_EARTH - 1.0f;
     private static final double MAX_GRAVITY = SensorManager.GRAVITY_EARTH + 1.0f;
 
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index f075790..ca382c4 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -1032,7 +1032,7 @@
      */
     @AnyThread
     private boolean isRollbackWhitelisted(String packageName) {
-        // TODO: Remove #isModule when the white list is ready.
+        // TODO: Remove #isModule when the allowlist is ready.
         return SystemConfig.getInstance().getRollbackWhitelistedPackages().contains(packageName)
                 || isModule(packageName);
     }
diff --git a/services/core/java/com/android/server/search/Searchables.java b/services/core/java/com/android/server/search/Searchables.java
index 8af76a1..09a1e72 100644
--- a/services/core/java/com/android/server/search/Searchables.java
+++ b/services/core/java/com/android/server/search/Searchables.java
@@ -417,7 +417,7 @@
 
         if (activities != null && !activities.isEmpty()) {
             ActivityInfo ai = activities.get(0).activityInfo;
-            // TODO: do some sanity checks here?
+            // TODO: do some validity checks here?
             return new ComponentName(ai.packageName, ai.name);
         }
         Log.w(LOG_TAG, "No web search activity found");
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index 8979d8c..aecf1f2 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -2344,7 +2344,7 @@
             JSONArray app_sizes = json.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY);
             JSONArray app_data_sizes = json.getJSONArray(DiskStatsFileLogger.APP_DATA_KEY);
             JSONArray app_cache_sizes = json.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY);
-            // Sanity check: Ensure all 4 lists have the same length.
+            // Validity check: Ensure all 4 lists have the same length.
             int length = pkg_names.length();
             if (app_sizes.length() != length || app_data_sizes.length() != length
                     || app_cache_sizes.length() != length) {
diff --git a/services/core/java/com/android/server/textservices/TextServicesManagerInternal.java b/services/core/java/com/android/server/textservices/TextServicesManagerInternal.java
index 56bcdd9..e02cef1 100644
--- a/services/core/java/com/android/server/textservices/TextServicesManagerInternal.java
+++ b/services/core/java/com/android/server/textservices/TextServicesManagerInternal.java
@@ -52,7 +52,7 @@
             };
 
     /**
-     * @return Global instance if exists.  Otherwise, a dummy no-op instance.
+     * @return Global instance if exists.  Otherwise, a placeholder no-op instance.
      */
     @NonNull
     public static TextServicesManagerInternal get() {
diff --git a/services/core/java/com/android/server/tv/TvRemoteProviderWatcher.java b/services/core/java/com/android/server/tv/TvRemoteProviderWatcher.java
index 6e180bc..68c8eaa 100644
--- a/services/core/java/com/android/server/tv/TvRemoteProviderWatcher.java
+++ b/services/core/java/com/android/server/tv/TvRemoteProviderWatcher.java
@@ -173,7 +173,7 @@
             return false;
         }
 
-        // Check if package name is white-listed here.
+        // Check if package name is allowlisted here.
         if (!mUnbundledServicePackages.contains(serviceInfo.packageName)) {
             Slog.w(TAG, "Ignoring atv remote provider service because the package has not "
                     + "been set and/or whitelisted: "
diff --git a/services/core/java/com/android/server/tv/TvRemoteService.java b/services/core/java/com/android/server/tv/TvRemoteService.java
index 5894645..c71cdef62 100644
--- a/services/core/java/com/android/server/tv/TvRemoteService.java
+++ b/services/core/java/com/android/server/tv/TvRemoteService.java
@@ -24,10 +24,10 @@
 
 /**
  * TvRemoteService represents a system service that allows a connected
- * remote control (emote) service to inject white-listed input events
+ * remote control (emote) service to inject allowlisted input events
  * and call other specified methods for functioning as an emote service.
  * <p/>
- * This service is intended for use only by white-listed packages.
+ * This service is intended for use only by allowlisted packages.
  */
 public class TvRemoteService extends SystemService implements Watchdog.Monitor {
     private static final String TAG = "TvRemoteService";
diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerService.java b/services/core/java/com/android/server/uri/UriGrantsManagerService.java
index f14c3a5..7ea8544 100644
--- a/services/core/java/com/android/server/uri/UriGrantsManagerService.java
+++ b/services/core/java/com/android/server/uri/UriGrantsManagerService.java
@@ -685,7 +685,7 @@
                         final int modeFlags = readIntAttribute(in, ATTR_MODE_FLAGS);
                         final long createdTime = readLongAttribute(in, ATTR_CREATED_TIME, now);
 
-                        // Sanity check that provider still belongs to source package
+                        // Validity check that provider still belongs to source package
                         // Both direct boot aware and unaware packages are fine as we
                         // will do filtering at query time to avoid multiple parsing.
                         final ProviderInfo pi = getProviderInfo(uri.getAuthority(), sourceUserId,
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 8a81c8ee..3a30f98 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -2038,7 +2038,7 @@
                 }
                 WallpaperData wd = mWallpaperMap.get(user.id);
                 if (wd == null) {
-                    // User hasn't started yet, so load her settings to peek at the wallpaper
+                    // User hasn't started yet, so load their settings to peek at the wallpaper
                     loadSettingsLocked(user.id, false);
                     wd = mWallpaperMap.get(user.id);
                 }
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 06c0c46..dfca5a9 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -3889,7 +3889,7 @@
         mWmService.mWindowPlacerLocked.performSurfacePlacement();
     }
 
-    // TODO: Super crazy long method that should be broken down...
+    // TODO: Super unexpected long method that should be broken down...
     void applySurfaceChangesTransaction() {
         final WindowSurfacePlacer surfacePlacer = mWmService.mWindowPlacerLocked;
 
diff --git a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java
index d9cf637..aac6b25 100644
--- a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java
+++ b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java
@@ -32,7 +32,7 @@
 import java.io.PrintWriter;
 
 /**
- * A Blacklist for packages that should force the display out of high refresh rate.
+ * A Denylist for packages that should force the display out of high refresh rate.
  */
 class HighRefreshRateBlacklist {
 
@@ -72,7 +72,7 @@
                 }
             } else {
                 // If there's no config, or the config has been deleted, fallback to the device's
-                // default blacklist
+                // default denylist
                 for (String pkg : mDefaultBlacklist) {
                     mBlacklistedPackages.add(pkg);
                 }
diff --git a/services/core/java/com/android/server/wm/RefreshRatePolicy.java b/services/core/java/com/android/server/wm/RefreshRatePolicy.java
index 2cb7d5a..072116f 100644
--- a/services/core/java/com/android/server/wm/RefreshRatePolicy.java
+++ b/services/core/java/com/android/server/wm/RefreshRatePolicy.java
@@ -107,7 +107,7 @@
             return mLowRefreshRateId;
         }
 
-        // If app is blacklisted using higher refresh rate, return default (lower) refresh rate
+        // If app is denylisted using higher refresh rate, return default (lower) refresh rate
         if (mHighRefreshRateBlacklist.isBlacklisted(packageName)) {
             return mLowRefreshRateId;
         }
diff --git a/services/core/java/com/android/server/wm/TaskPersister.java b/services/core/java/com/android/server/wm/TaskPersister.java
index 20af250..a3dc290 100644
--- a/services/core/java/com/android/server/wm/TaskPersister.java
+++ b/services/core/java/com/android/server/wm/TaskPersister.java
@@ -197,7 +197,7 @@
                     mPersisterQueue.addItem(new TaskWriteQueueItem(task, mService), flush);
                 }
             } else {
-                // Dummy. Ensures removeObsoleteFiles is called when LazyTaskThreadWriter is
+                // Placeholder. Ensures removeObsoleteFiles is called when LazyTaskThreadWriter is
                 // notified.
                 mPersisterQueue.addItem(PersisterQueue.EMPTY_ITEM, flush);
             }
diff --git a/services/core/jni/com_android_server_security_VerityUtils.cpp b/services/core/jni/com_android_server_security_VerityUtils.cpp
index 0277f16..48964ae8 100644
--- a/services/core/jni/com_android_server_security_VerityUtils.cpp
+++ b/services/core/jni/com_android_server_security_VerityUtils.cpp
@@ -76,7 +76,7 @@
         return -errno;
     }
 
-    // Sanity check.
+    // Validity check.
     if ((out.stx_attributes_mask & STATX_ATTR_VERITY) == 0) {
         ALOGE("Unexpected, STATX_ATTR_VERITY not supported by kernel");
         return -ENOSYS;
diff --git a/services/people/java/com/android/server/people/data/AbstractProtoDiskReadWriter.java b/services/people/java/com/android/server/people/data/AbstractProtoDiskReadWriter.java
index 7672cd0..c03a5a7 100644
--- a/services/people/java/com/android/server/people/data/AbstractProtoDiskReadWriter.java
+++ b/services/people/java/com/android/server/people/data/AbstractProtoDiskReadWriter.java
@@ -129,7 +129,7 @@
         if (files == null || files.length == 0) {
             return null;
         } else if (files.length > 1) {
-            // This can't possibly happen, but sanity check.
+            // This can't possibly happen, but validity check.
             Slog.w(TAG, "Found multiple files with the same name: " + Arrays.toString(files));
         }
         return parseFile(files[0]);
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
index e724e60..7f86faa 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
@@ -364,7 +364,7 @@
                 .setAppIdleWhitelist(eq(UID_BLUE), anyBoolean());
         assertTrue(controller.isStandbyExceptionRequestedLocked(UID_RED));
         assertFalse(controller.isStandbyExceptionRequestedLocked(UID_BLUE));
-        // Whitelisting doesn't need to be requested again.
+        // Allowlisting doesn't need to be requested again.
         controller.requestStandbyExceptionLocked(red);
         inOrder.verify(mNetPolicyManagerInternal, never())
                 .setAppIdleWhitelist(eq(UID_RED), anyBoolean());
@@ -434,7 +434,7 @@
                 .setAppIdleWhitelist(eq(UID_BLUE), anyBoolean());
         assertTrue(controller.isStandbyExceptionRequestedLocked(UID_RED));
         assertFalse(controller.isStandbyExceptionRequestedLocked(UID_BLUE));
-        // Whitelisting doesn't need to be requested again.
+        // Allowlisting doesn't need to be requested again.
         controller.evaluateStateLocked(red);
         inOrder.verify(mNetPolicyManagerInternal, never())
                 .setAppIdleWhitelist(eq(UID_RED), anyBoolean());
@@ -473,7 +473,7 @@
         assertFalse(controller.isStandbyExceptionRequestedLocked(UID_RED));
         assertFalse(controller.isStandbyExceptionRequestedLocked(UID_BLUE));
 
-        // Test that a currently whitelisted uid is now removed.
+        // Test that a currently allowlisted uid is now removed.
         controller.requestStandbyExceptionLocked(blue);
         inOrder.verify(mNetPolicyManagerInternal, times(1))
                 .setAppIdleWhitelist(eq(UID_BLUE), eq(true));
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
index d8874e4..1cf133a 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
@@ -302,7 +302,7 @@
         // Make sure tests aren't passing just because the default bucket is likely ACTIVE.
         js.setStandbyBucket(FREQUENT_INDEX);
         // Make sure Doze and background-not-restricted don't affect tests.
-        js.setDeviceNotDozingConstraintSatisfied(/* state */ true, /* whitelisted */false);
+        js.setDeviceNotDozingConstraintSatisfied(/* state */ true, /* allowlisted */false);
         js.setBackgroundNotRestrictedConstraintSatisfied(true);
         return js;
     }
diff --git a/services/tests/mockingservicestests/src/com/android/server/location/LocationFudgerTest.java b/services/tests/mockingservicestests/src/com/android/server/location/LocationFudgerTest.java
index f2246da..a0f48c6 100644
--- a/services/tests/mockingservicestests/src/com/android/server/location/LocationFudgerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/location/LocationFudgerTest.java
@@ -148,7 +148,7 @@
         // accurate the coarsened average will be. we use 70% as a lower bound by -very- roughly
         // taking the area within a grid where we expect a reasonable percentage of points generated
         // by step() to fall in another grid square. this likely doesn't have much mathematical
-        // validity, but it serves as a sanity test as least.
+        // validity, but it serves as a validity test as least.
         assertThat(passed / (double) iterations).isGreaterThan(.70);
     }
 
diff --git a/services/tests/servicestests/apks/install_uses_sdk/res/values/strings.xml b/services/tests/servicestests/apks/install_uses_sdk/res/values/strings.xml
index 3b8b3b1..fcab92b 100644
--- a/services/tests/servicestests/apks/install_uses_sdk/res/values/strings.xml
+++ b/services/tests/servicestests/apks/install_uses_sdk/res/values/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 
-<!-- Just need this dummy file to have something to build. -->
+<!-- Just need this placeholder file to have something to build. -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
   <string name="dummy">dummy</string>
 </resources>
diff --git a/services/tests/servicestests/src/com/android/server/CertBlacklisterTest.java b/services/tests/servicestests/src/com/android/server/CertBlacklisterTest.java
index 10b9e7c..90df786 100644
--- a/services/tests/servicestests/src/com/android/server/CertBlacklisterTest.java
+++ b/services/tests/servicestests/src/com/android/server/CertBlacklisterTest.java
@@ -50,14 +50,14 @@
     public void testClearBlacklistPubkey() throws Exception {
         // clear the gservices setting for a clean slate
         overrideSettings(PUBKEY_KEY, "");
-        // read the contents of the pubkey blacklist
+        // read the contents of the pubkey denylist
         String blacklist = IoUtils.readFileAsString(PUBKEY_PATH);
         // Verify that it's empty
         assertEquals("", blacklist);
     }
 
     public void testSetBlacklistPubkey() throws Exception {
-        // build a new thing to blacklist
+        // build a new thing to denylist
         String badPubkey = "7ccabd7db47e94a5759901b6a7dfd45d1c091ccc";
         // add the gservices override
         overrideSettings(PUBKEY_KEY, badPubkey);
@@ -110,14 +110,14 @@
     public void testClearBlacklistSerial() throws Exception {
         // clear the gservices setting for a clean slate
         overrideSettings(SERIAL_KEY, "");
-        // read the contents of the pubkey blacklist
+        // read the contents of the pubkey denylist
         String blacklist = IoUtils.readFileAsString(SERIAL_PATH);
         // Verify that it's empty
         assertEquals("", blacklist);
     }
 
     public void testSetBlacklistSerial() throws Exception {
-        // build a new thing to blacklist
+        // build a new thing to denylist
         String badSerial = "22e514121e61c643b1e9b06bd4b9f7d0";
         // add the gservices override
         overrideSettings(SERIAL_KEY, badSerial);
diff --git a/services/tests/servicestests/src/com/android/server/NetworkManagementInternalTest.java b/services/tests/servicestests/src/com/android/server/NetworkManagementInternalTest.java
index ebbebcb..33ea1d6 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkManagementInternalTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkManagementInternalTest.java
@@ -81,14 +81,14 @@
                 mNmi.isNetworkRestrictedForUid(TEST_UID));
         mInjector.reset();
 
-        // Data saver is on and uid is not whitelisted
+        // Data saver is on and uid is not allowlisted
         mInjector.setDataSaverMode(true);
         mInjector.setUidOnMeteredNetworkList(false, TEST_UID, false);
         assertTrue("Should be true since data saver is on and the uid is not whitelisted",
                 mNmi.isNetworkRestrictedForUid(TEST_UID));
         mInjector.reset();
 
-        // Data saver is on and uid is whitelisted
+        // Data saver is on and uid is allowlisted
         mInjector.setDataSaverMode(true);
         mInjector.setUidOnMeteredNetworkList(false, TEST_UID, true);
         assertFalse("Should be false since data saver is on and the uid is whitelisted",
diff --git a/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java b/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java
index 8871348..9a5c633 100644
--- a/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java
@@ -176,7 +176,7 @@
     }
 
     /**
-     * Sends dummy widget updates to {@link #mManager}.
+     * Sends placeholder widget updates to {@link #mManager}.
      * @param widgetId widget to update
      * @param viewIds a list of view ids for which
      *                {@link AppWidgetManager#notifyAppWidgetViewDataChanged} will be called
diff --git a/services/tests/servicestests/src/com/android/server/appwidget/DummyAppWidget.java b/services/tests/servicestests/src/com/android/server/appwidget/DummyAppWidget.java
index 803119f4..fd99b21 100644
--- a/services/tests/servicestests/src/com/android/server/appwidget/DummyAppWidget.java
+++ b/services/tests/servicestests/src/com/android/server/appwidget/DummyAppWidget.java
@@ -21,7 +21,7 @@
 import android.content.Intent;
 
 /**
- * Dummy widget for testing
+ * Placeholder widget for testing
  */
 public class DummyAppWidget extends BroadcastReceiver {
 
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
index 30bb38a..737eeaf 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java
@@ -77,7 +77,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        // Dummy test config
+        // Placeholder test config
         final String[] config = {
                 "0:2:15", // ID0:Fingerprint:Strong
                 "1:4:15", // ID1:Iris:Strong
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index daaabf8..6786f60 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -5153,7 +5153,7 @@
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
         assertTrue(dpms.isNotificationListenerServicePermitted(packageName, userId));
 
-        // Attempt to set to empty list (which means no listener is whitelisted)
+        // Attempt to set to empty list (which means no listener is allowlisted)
         mContext.binder.callingUid = adminUid;
         assertFalse(dpms.setPermittedCrossProfileNotificationListeners(
                 admin1, Collections.emptyList()));
@@ -5227,7 +5227,7 @@
         assertTrue(dpms.isNotificationListenerServicePermitted(
                 systemListener, MANAGED_PROFILE_USER_ID));
 
-        // Setting only one package in the whitelist
+        // Setting only one package in the allowlist
         mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
         assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
                 admin1, Collections.singletonList(permittedListener)));
@@ -5241,11 +5241,11 @@
                 permittedListener, MANAGED_PROFILE_USER_ID));
         assertFalse(dpms.isNotificationListenerServicePermitted(
                 notPermittedListener, MANAGED_PROFILE_USER_ID));
-        // System packages are always allowed (even if not in the whitelist)
+        // System packages are always allowed (even if not in the allowlist)
         assertTrue(dpms.isNotificationListenerServicePermitted(
                 systemListener, MANAGED_PROFILE_USER_ID));
 
-        // Setting an empty whitelist - only system listeners allowed
+        // Setting an empty allowlist - only system listeners allowed
         mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
         assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
                 admin1, Collections.emptyList()));
@@ -5256,11 +5256,11 @@
                 permittedListener, MANAGED_PROFILE_USER_ID));
         assertFalse(dpms.isNotificationListenerServicePermitted(
                 notPermittedListener, MANAGED_PROFILE_USER_ID));
-        // System packages are always allowed (even if not in the whitelist)
+        // System packages are always allowed (even if not in the allowlist)
         assertTrue(dpms.isNotificationListenerServicePermitted(
                 systemListener, MANAGED_PROFILE_USER_ID));
 
-        // Setting a null whitelist - all listeners allowed
+        // Setting a null allowlist - all listeners allowed
         mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
         assertTrue(dpms.setPermittedCrossProfileNotificationListeners(admin1, null));
         assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
@@ -5308,7 +5308,7 @@
         assertTrue(dpms.isNotificationListenerServicePermitted(
                 systemListener, UserHandle.USER_SYSTEM));
 
-        // Setting an empty whitelist - only system listeners allowed in managed profile, but
+        // Setting an empty allowlist - only system listeners allowed in managed profile, but
         // all allowed in primary profile
         mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
         assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
diff --git a/services/tests/servicestests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java b/services/tests/servicestests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java
index e8e6ded..df672c9 100644
--- a/services/tests/servicestests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/AmbientBrightnessStatsTrackerTest.java
@@ -294,7 +294,7 @@
         AmbientBrightnessStatsTracker statsTracker = getTestStatsTracker();
         ArrayList<AmbientBrightnessDayStats> userStats;
         float[] expectedStats;
-        // Generate some dummy data
+        // Generate some placeholder data
         // Data: very old which should not be read
         statsTracker.start();
         statsTracker.add(0, 0.05f);
diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java
index 48dda01..ae966aa 100644
--- a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java
@@ -466,7 +466,7 @@
         Resources resources = createResources(GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS,
                 DISPLAY_LEVELS_NITS, DISPLAY_LEVELS_BACKLIGHT);
         BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources);
-        // Let's start with a sanity check:
+        // Let's start with a validity check:
         assertEquals(y1, strategy.getBrightness(x1), 0.01f /* tolerance */);
         assertEquals(y2, strategy.getBrightness(x2), 0.01f /* tolerance */);
         assertEquals(y3, strategy.getBrightness(x3), 0.01f /* tolerance */);
@@ -494,7 +494,7 @@
         Resources resources = createResources(GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS,
                 DISPLAY_LEVELS_NITS, DISPLAY_LEVELS_BACKLIGHT);
         BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources);
-        // Sanity check:
+        // Validity check:
         assertEquals(y1, strategy.getBrightness(x1), 0.01f /* tolerance */);
         assertEquals(y2, strategy.getBrightness(x2), 0.01f /* tolerance */);
         assertEquals(y3, strategy.getBrightness(x3), 0.01f /* tolerance */);
@@ -540,7 +540,7 @@
         Resources resources = createResources(GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS,
                 DISPLAY_LEVELS_NITS, DISPLAY_LEVELS_BACKLIGHT);
         BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources);
-        // Sanity, as per tradition:
+        // Validity, as per tradition:
         assertEquals(y0, strategy.getBrightness(x0), 0.01f /* tolerance */);
         assertEquals(y2, strategy.getBrightness(x2), 0.01f /* tolerance */);
         assertEquals(y4, strategy.getBrightness(x4), 0.01f /* tolerance */);
diff --git a/services/tests/servicestests/src/com/android/server/emergency/EmergencyAffordanceServiceTest.java b/services/tests/servicestests/src/com/android/server/emergency/EmergencyAffordanceServiceTest.java
index d438a0e..3ecff91 100644
--- a/services/tests/servicestests/src/com/android/server/emergency/EmergencyAffordanceServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/emergency/EmergencyAffordanceServiceTest.java
@@ -448,7 +448,7 @@
         List<SubscriptionInfo> subInfos = new ArrayList<>(2);
 
         // Test with Multiple SIMs. SIM1 is a non-EA SIM
-        // Only country iso is valuable, all other info are filled with dummy values
+        // Only country iso is valuable, all other info are filled with placeholder values
         SubscriptionInfo subInfo = new SubscriptionInfo(1, "890126042XXXXXXXXXXX", 0, "T-mobile",
                 "T-mobile", 0, 255, "12345", 0, null,
                 "310", "226", NON_EMERGENCY_ISO_CODE, false, null, null);
diff --git a/services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluationEngineTest.java b/services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluationEngineTest.java
index 0488745..441cd4b 100644
--- a/services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluationEngineTest.java
+++ b/services/tests/servicestests/src/com/android/server/integrity/engine/RuleEvaluationEngineTest.java
@@ -178,7 +178,7 @@
                 .isEqualTo(IntegrityCheckResult.Effect.DENY);
     }
 
-    /** Returns a builder with all fields filled with some dummy data. */
+    /** Returns a builder with all fields filled with some placeholder data. */
     private AppInstallMetadata.Builder getAppInstallMetadataBuilder() {
         return new AppInstallMetadata.Builder()
                 .setPackageName("abc")
diff --git a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
index cae7b57..deaeb46 100644
--- a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
@@ -505,7 +505,7 @@
                 first.getTransientExtras().toString(), second.getTransientExtras().toString());
 
         // Since people can forget to add tests here for new fields, do one last
-        // sanity check based on bits-on-wire equality.
+        // validity check based on bits-on-wire equality.
         final byte[] firstBytes = marshall(first);
         final byte[] secondBytes = marshall(second);
         if (!Arrays.equals(firstBytes, secondBytes)) {
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
index 7d3ec03..a38745f 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
@@ -406,7 +406,7 @@
         mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
                 TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
 
-        // Enter test mode with whitelisted credentials
+        // Enter test mode with allowlisted credentials
         when(mTestOnlyInsecureCertificateHelper.isTestOnlyCertificateAlias(any())).thenReturn(true);
         when(mTestOnlyInsecureCertificateHelper.doesCredentialSupportInsecureMode(anyInt(), any()))
                 .thenReturn(true);
@@ -415,7 +415,7 @@
         verify(mTestOnlyInsecureCertificateHelper)
                 .getDefaultCertificateAliasIfEmpty(eq(TEST_ROOT_CERT_ALIAS));
 
-        // run whitelist checks
+        // run allowlist checks
         verify(mTestOnlyInsecureCertificateHelper)
                 .doesCredentialSupportInsecureMode(anyInt(), any());
         verify(mTestOnlyInsecureCertificateHelper)
@@ -424,7 +424,7 @@
         KeyChainSnapshot keyChainSnapshot = mRecoverySnapshotStorage.get(TEST_RECOVERY_AGENT_UID);
         assertNotNull(keyChainSnapshot); // created snapshot
         List<WrappedApplicationKey> applicationKeys = keyChainSnapshot.getWrappedApplicationKeys();
-        assertThat(applicationKeys).hasSize(0); // non whitelisted key is not included
+        assertThat(applicationKeys).hasSize(0); // non allowlisted key is not included
         verify(mMockScrypt, never()).scrypt(any(), any(), anyInt(), anyInt(), anyInt(), anyInt());
     }
 
@@ -437,7 +437,7 @@
         mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
                 TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
 
-        // Enter test mode with non whitelisted credentials
+        // Enter test mode with non allowlisted credentials
         when(mTestOnlyInsecureCertificateHelper.isTestOnlyCertificateAlias(any())).thenReturn(true);
         when(mTestOnlyInsecureCertificateHelper.doesCredentialSupportInsecureMode(anyInt(), any()))
                 .thenReturn(false);
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 58b71d4..f8043fa 100644
--- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
@@ -1396,7 +1396,7 @@
         actualCycleDay = mService.getCycleDayFromCarrierConfig(null, DEFAULT_CYCLE_DAY);
         assertEquals(DEFAULT_CYCLE_DAY, actualCycleDay);
 
-        // Sane, non-default values
+        // Valid, non-default values
         assertCycleDayAsExpected(config, 1, true);
         assertCycleDayAsExpected(config, cal.getMaximum(Calendar.DAY_OF_MONTH), true);
         assertCycleDayAsExpected(config, cal.getMinimum(Calendar.DAY_OF_MONTH), true);
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
index b0b5386..21b3659 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java
@@ -468,7 +468,7 @@
             ParsedInstrumentation b) {
         assertComponentsEqual(a, b);
 
-        // Sanity check for InstrumentationInfo.
+        // Validity check for InstrumentationInfo.
         assertEquals(a.getTargetPackage(), b.getTargetPackage());
         assertEquals(a.getTargetProcesses(), b.getTargetProcesses());
         assertEquals(a.isHandleProfiling(), b.isHandleProfiling());
@@ -483,7 +483,7 @@
     ) {
         assertComponentsEqual(a, b);
 
-        // Sanity check for ServiceInfo.
+        // Validity check for ServiceInfo.
         ServiceInfo aInfo = PackageInfoUtils.generateServiceInfo(aPkg, a, 0,
                 new PackageUserState(), 0, mockPkgSetting(aPkg));
         ServiceInfo bInfo = PackageInfoUtils.generateServiceInfo(bPkg, b, 0,
@@ -510,7 +510,7 @@
     ) {
         assertComponentsEqual(a, b);
 
-        // Sanity check for ActivityInfo.
+        // Validity check for ActivityInfo.
         ActivityInfo aInfo = PackageInfoUtils.generateActivityInfo(aPkg, a, 0,
                 new PackageUserState(), 0, mockPkgSetting(aPkg));
         ActivityInfo bInfo = PackageInfoUtils.generateActivityInfo(bPkg, b, 0,
@@ -523,7 +523,7 @@
             ParsedPermissionGroup b) {
         assertComponentsEqual(a, b);
 
-        // Sanity check for PermissionGroupInfo.
+        // Validity check for PermissionGroupInfo.
         assertEquals(a.getName(), b.getName());
         assertEquals(a.getDescriptionRes(), b.getDescriptionRes());
     }
@@ -666,13 +666,13 @@
             }
 
             if (List.class.isAssignableFrom(fieldType)) {
-                // Sanity check for list fields: Assume they're non-null and contain precisely
+                // Validity check for list fields: Assume they're non-null and contain precisely
                 // one element.
                 List<?> list = (List<?>) f.get(pkg);
                 assertNotNull("List was null: " + f, list);
                 assertEquals(1, list.size());
             } else if (fieldType.getComponentType() != null) {
-                // Sanity check for array fields: Assume they're non-null and contain precisely
+                // Validity check for array fields: Assume they're non-null and contain precisely
                 // one element.
                 Object array = f.get(pkg);
                 assertNotNull(Array.get(array, 0));
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java
index 87979fb..8e94544 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java
@@ -150,7 +150,7 @@
                 ArrayMap<String, Set<String>> r = new ArrayMap<>();
                 r.put("com.android.package1", new ArraySet<>(Arrays.asList(
                         USER_TYPE_PROFILE_MANAGED, "invalid-garbage2")));
-                // com.android.package2 has nothing blacklisted
+                // com.android.package2 has nothing denylisted
                 r.put("com.android.package3", new ArraySet<>(Arrays.asList("SYSTEM")));
                 return r;
             }
@@ -196,7 +196,7 @@
 
     /**
      * Test that determineWhitelistedPackagesForUserTypes does not include packages that were never
-     * whitelisted properly, but does include packages that were whitelisted but then blacklisted.
+     * allowlisted properly, but does include packages that were allowlisted but then denylisted.
      */
     @Test
     public void testDetermineWhitelistedPackagesForUserTypes_noNetWhitelisting() {
@@ -205,22 +205,22 @@
             public ArrayMap<String, Set<String>> getAndClearPackageToUserTypeWhitelist() {
                 ArrayMap<String, Set<String>> r = new ArrayMap<>();
                 r.put("com.android.package1", new ArraySet<>(Arrays.asList("invalid1")));
-                // com.android.package2 has no whitelisting
+                // com.android.package2 has no allowlisting
                 r.put("com.android.package3", new ArraySet<>(Arrays.asList("PROFILE", "FULL")));
                 r.put("com.android.package4", new ArraySet<>(Arrays.asList("PROFILE")));
                 r.put("com.android.package5", new ArraySet<>());
-                // com.android.package6 has no whitelisting
+                // com.android.package6 has no allowlisting
                 return r;
             }
 
             @Override
             public ArrayMap<String, Set<String>> getAndClearPackageToUserTypeBlacklist() {
                 ArrayMap<String, Set<String>> r = new ArrayMap<>();
-                // com.android.package1 has no blacklisting
+                // com.android.package1 has no denylisting
                 r.put("com.android.package2", new ArraySet<>(Arrays.asList("FULL")));
                 r.put("com.android.package3", new ArraySet<>(Arrays.asList("PROFILE", "FULL")));
                 r.put("com.android.package4", new ArraySet<>(Arrays.asList("PROFILE", "invalid4")));
-                // com.android.package5 has no blacklisting
+                // com.android.package5 has no denylisting
                 r.put("com.android.package6", new ArraySet<>(Arrays.asList("invalid6")));
                 return r;
             }
@@ -242,18 +242,18 @@
      */
     @Test
     public void testShouldInstallPackage() {
-        final String packageName1 = "pkg1"; // whitelisted
-        final String packageName2 = "pkg2"; // whitelisted and blacklisted
-        final String packageName3 = "pkg3"; // whitelisted for a different user type
-        final String packageName4 = "pkg4"; // not whitelisted nor blacklisted at all
+        final String packageName1 = "pkg1"; // allowlisted
+        final String packageName2 = "pkg2"; // allowlisted and denylisted
+        final String packageName3 = "pkg3"; // allowlisted for a different user type
+        final String packageName4 = "pkg4"; // not allowlisted nor denylisted at all
 
-        // Whitelist: user type bitset for each pkg (for the test, all that matters is 0 vs non-0).
+        // Allowlist: user type bitset for each pkg (for the test, all that matters is 0 vs non-0).
         final ArrayMap<String, Long> pkgBitSetMap = new ArrayMap<>();
         pkgBitSetMap.put(packageName1, 0b01L);
         pkgBitSetMap.put(packageName2, 0L);
         pkgBitSetMap.put(packageName3, 0b10L);
 
-        // Whitelist of pkgs for this specific user, i.e. subset of pkgBitSetMap for this user.
+        // Allowlist of pkgs for this specific user, i.e. subset of pkgBitSetMap for this user.
         final Set<String> userWhitelist = new ArraySet<>();
         userWhitelist.add(packageName1);
 
@@ -266,7 +266,7 @@
         final AndroidPackage pkg4 = ((ParsedPackage) PackageImpl.forTesting(packageName4)
                 .hideAsParsed()).hideAsFinal();
 
-        // No implicit whitelist, so only install pkg1.
+        // No implicit allowlist, so only install pkg1.
         boolean implicit = false;
         assertTrue(UserSystemPackageInstaller.shouldInstallPackage(
                 pkg1, pkgBitSetMap, userWhitelist, implicit));
@@ -277,7 +277,7 @@
         assertFalse(UserSystemPackageInstaller.shouldInstallPackage(
                 pkg4, pkgBitSetMap, userWhitelist, implicit));
 
-        // Use implicit whitelist, so install pkg1 and pkg4
+        // Use implicit allowlist, so install pkg1 and pkg4
         implicit = true;
         assertTrue(UserSystemPackageInstaller.shouldInstallPackage(
                 pkg1, pkgBitSetMap, userWhitelist, implicit));
@@ -302,12 +302,12 @@
         final long maskOfTypeA = 0b0001L;
         final long maskOfTypeC = 0b0100L;
 
-        final String packageName1 = "pkg1"; // whitelisted for user type A
-        final String packageName2 = "pkg2"; // blacklisted whenever whitelisted
-        final String packageName3 = "pkg3"; // whitelisted for user type C
-        final String packageName4 = "pkg4"; // whitelisted for user type A
+        final String packageName1 = "pkg1"; // allowlisted for user type A
+        final String packageName2 = "pkg2"; // denylisted whenever allowlisted
+        final String packageName3 = "pkg3"; // allowlisted for user type C
+        final String packageName4 = "pkg4"; // allowlisted for user type A
 
-        final ArrayMap<String, Long> pkgBitSetMap = new ArrayMap<>(); // Whitelist: bitset per pkg
+        final ArrayMap<String, Long> pkgBitSetMap = new ArrayMap<>(); // Allowlist: bitset per pkg
         pkgBitSetMap.put(packageName1, maskOfTypeA);
         pkgBitSetMap.put(packageName2, 0L);
         pkgBitSetMap.put(packageName3, maskOfTypeC);
@@ -368,7 +368,7 @@
         }
 
         // Add auto-generated RRO package to expectedPackages since they are not (supposed to be)
-        // in the whitelist but they should be installed.
+        // in the allowlist but they should be installed.
         for (PackageInfo p : packageInfos) {
             if (p.isOverlayPackage()
                         && UserSystemPackageInstaller.hasAutoGeneratedRROSuffix(p.packageName)
@@ -396,7 +396,7 @@
     }
 
     /**
-     * Test that overlay package not in whitelist should be installed for all user at Explicit mode.
+     * Test that overlay package not in allowlist should be installed for all user at Explicit mode.
      */
     @Test
     public void testInstallOverlayPackagesExplicitMode() {
@@ -513,7 +513,7 @@
         assertFalse(mUserSystemPackageInstaller.isIgnoreOtaMode());
     }
 
-    /** Sets the whitelist mode to the desired value via adb's setprop. */
+    /** Sets the allowlist mode to the desired value via adb's setprop. */
     private void setUserTypePackageWhitelistMode(int mode) {
         UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
         try {
@@ -529,7 +529,7 @@
     /** @see UserSystemPackageInstaller#mWhitelistedPackagesForUserTypes */
     private ArrayMap<String, Long> getNewPackageToWhitelistedBitSetMap() {
         final ArrayMap<String, Long> pkgBitSetMap = new ArrayMap<>();
-        // "android" is always treated as whitelisted for all types, regardless of the xml file.
+        // "android" is always treated as allowlisted for all types, regardless of the xml file.
         pkgBitSetMap.put("android", ~0L);
         return pkgBitSetMap;
     }
diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java
index 8398585..ff43da6 100644
--- a/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexManagerTests.java
@@ -836,7 +836,7 @@
 
     @Test
     public void testOobPackageSelectionWhitelist() {
-        // Various whitelist of apps to run in OOB mode.
+        // Various allowlist of apps to run in OOB mode.
         final String kWhitelistApp0 = "com.priv.app0";
         final String kWhitelistApp1 = "com.priv.app1";
         final String kWhitelistApp2 = "com.priv.app2";
@@ -845,17 +845,17 @@
         // Packages that shares the targeting process.
         final Collection<String> runningPackages = Arrays.asList("com.priv.app1", "com.priv.app2");
 
-        // Feature is off, whitelist does not matter
+        // Feature is off, allowlist does not matter
         assertFalse(shouldPackageRunOob(false, kWhitelistApp0, runningPackages));
         assertFalse(shouldPackageRunOob(false, kWhitelistApp1, runningPackages));
         assertFalse(shouldPackageRunOob(false, "", runningPackages));
         assertFalse(shouldPackageRunOob(false, "ALL", runningPackages));
 
-        // Feature is on, app not in whitelist
+        // Feature is on, app not in allowlist
         assertFalse(shouldPackageRunOob(true, kWhitelistApp0, runningPackages));
         assertFalse(shouldPackageRunOob(true, "", runningPackages));
 
-        // Feature is on, app in whitelist
+        // Feature is on, app in allowlist
         assertTrue(shouldPackageRunOob(true, kWhitelistApp1, runningPackages));
         assertTrue(shouldPackageRunOob(true, kWhitelistApp2, runningPackages));
         assertTrue(shouldPackageRunOob(true, kWhitelistApp1AndApp2, runningPackages));
diff --git a/services/tests/servicestests/src/com/android/server/storage/DiskStatsFileLoggerTest.java b/services/tests/servicestests/src/com/android/server/storage/DiskStatsFileLoggerTest.java
index 13a3c2f..46224cb 100644
--- a/services/tests/servicestests/src/com/android/server/storage/DiskStatsFileLoggerTest.java
+++ b/services/tests/servicestests/src/com/android/server/storage/DiskStatsFileLoggerTest.java
@@ -123,7 +123,7 @@
         JSONArray cacheSizes = output.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY);
         assertThat(cacheSizes.length()).isEqualTo(2);
 
-        // We need to do this crazy Set over this because the DiskStatsFileLogger provides no
+        // We need to do this unexpected Set over this because the DiskStatsFileLogger provides no
         // guarantee of the ordering of the apps in its output. By using a set, we avoid any order
         // problems.
         ArraySet<AppSizeGrouping> apps = new ArraySet<>();
diff --git a/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java b/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java
index 10981ab..17d99e6 100644
--- a/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java
+++ b/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java
@@ -184,7 +184,7 @@
 
     /**
      * Tests that readPermissions works correctly with {@link SystemConfig#ALLOW_APP_CONFIGS}
-     * permission flag for the tag: whitelisted-staged-installer.
+     * permission flag for the tag: allowlisted-staged-installer.
      */
     @Test
     public void readPermissions_allowAppConfigs_parsesStagedInstallerWhitelist()
@@ -204,7 +204,7 @@
 
     /**
      * Tests that readPermissions works correctly without {@link SystemConfig#ALLOW_APP_CONFIGS}
-     * permission flag for the tag: whitelisted-staged-installer.
+     * permission flag for the tag: allowlisted-staged-installer.
      */
     @Test
     public void readPermissions_notAllowAppConfigs_wontParseStagedInstallerWhitelist()
diff --git a/services/tests/servicestests/src/com/android/server/textclassifier/IconsContentProviderTest.java b/services/tests/servicestests/src/com/android/server/textclassifier/IconsContentProviderTest.java
index a787c32..3b963f6 100644
--- a/services/tests/servicestests/src/com/android/server/textclassifier/IconsContentProviderTest.java
+++ b/services/tests/servicestests/src/com/android/server/textclassifier/IconsContentProviderTest.java
@@ -29,7 +29,7 @@
 import org.junit.runner.RunWith;
 
 /**
- * Sanity test for {@link IconsContentProvider}.
+ * Validity test for {@link IconsContentProvider}.
  */
 @RunWith(AndroidJUnit4.class)
 public final class IconsContentProviderTest {
diff --git a/services/tests/servicestests/utils/com/android/server/testutils/TestUtils.java b/services/tests/servicestests/utils/com/android/server/testutils/TestUtils.java
index b200293..fa14b24 100644
--- a/services/tests/servicestests/utils/com/android/server/testutils/TestUtils.java
+++ b/services/tests/servicestests/utils/com/android/server/testutils/TestUtils.java
@@ -52,7 +52,7 @@
      * EasyMock-style "strict" mock that throws immediately on any interaction that was not
      * explicitly allowed.
      *
-     * You can allow certain method calls on a whitelist basis by stubbing them e.g. with
+     * You can allow certain method calls on a allowlist basis by stubbing them e.g. with
      * {@link Mockito#doAnswer}, {@link Mockito#doNothing}, etc.
      */
     public static <T> T strictMock(Class<T> c) {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 16aa87b..10976882 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -385,7 +385,7 @@
         MockitoAnnotations.initMocks(this);
 
         DeviceIdleInternal deviceIdleInternal = mock(DeviceIdleInternal.class);
-        when(deviceIdleInternal.getNotificationWhitelistDuration()).thenReturn(3000L);
+        when(deviceIdleInternal.getNotificationAllowlistDuration()).thenReturn(3000L);
         ActivityManagerInternal activityManagerInternal = mock(ActivityManagerInternal.class);
 
         LocalServices.removeServiceForTest(UriGrantsManagerInternal.class);
diff --git a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java
index 56cb447..f53894a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java
@@ -102,7 +102,7 @@
         final FakeDeviceConfig config = new FakeDeviceConfig();
         mBlacklist = new HighRefreshRateBlacklist(r, config);
 
-        // First check that the default blacklist is in effect
+        // First check that the default denylist is in effect
         assertTrue(mBlacklist.isBlacklisted(APP1));
         assertFalse(mBlacklist.isBlacklisted(APP2));
         assertFalse(mBlacklist.isBlacklisted(APP3));
@@ -130,7 +130,7 @@
         assertTrue(mBlacklist.isBlacklisted(APP2));
         assertTrue(mBlacklist.isBlacklisted(APP3));
 
-        //  Change an unrelated flag in our namespace and verify that the blacklist is intact
+        //  Change an unrelated flag in our namespace and verify that the denylist is intact
         config.putPropertyAndNotify(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, "someKey", "someValue");
         assertFalse(mBlacklist.isBlacklisted(APP1));
         assertTrue(mBlacklist.isBlacklisted(APP2));
