Snap for 5649081 from 3b43fa76b8f7d27e3791c08113140cd86357f609 to qt-release

Change-Id: I7d6212d724c504359585edbb04e1d8d8a9729cb8
diff --git a/service/src/com/android/car/ICarImpl.java b/service/src/com/android/car/ICarImpl.java
index 0335186..8c5b981 100644
--- a/service/src/com/android/car/ICarImpl.java
+++ b/service/src/com/android/car/ICarImpl.java
@@ -217,6 +217,7 @@
             service.init();
         }
         traceEnd();
+        mSystemInterface.reconfigureSecondaryDisplays();
     }
 
     void release() {
diff --git a/service/src/com/android/car/systeminterface/DisplayInterface.java b/service/src/com/android/car/systeminterface/DisplayInterface.java
index 885657b..4d8f180 100644
--- a/service/src/com/android/car/systeminterface/DisplayInterface.java
+++ b/service/src/com/android/car/systeminterface/DisplayInterface.java
@@ -31,12 +31,16 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.PowerManager;
+import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.UserHandle;
 import android.provider.Settings.SettingNotFoundException;
 import android.provider.Settings.System;
 import android.util.Log;
 import android.view.Display;
+import android.view.DisplayAddress;
+import android.view.IWindowManager;
 
 import com.android.car.CarLog;
 import com.android.car.CarPowerManagementService;
@@ -59,9 +63,15 @@
     void refreshDisplayBrightness();
 
     /**
+     * Reconfigure all secondary displays due to b/131909551
+     */
+    void reconfigureSecondaryDisplays();
+    /**
      * Default implementation of display operations
      */
     class DefaultImpl implements DisplayInterface, OnUsersUpdateListener {
+        static final String TAG = DisplayInterface.class.getSimpleName();
+
         private final ActivityManager mActivityManager;
         private final ContentResolver mContentResolver;
         private final Context mContext;
@@ -211,5 +221,32 @@
             mLastBrightnessLevel = -1;
             refreshDisplayBrightness();
         }
+
+        @Override
+        public void reconfigureSecondaryDisplays() {
+            IWindowManager wm = IWindowManager.Stub
+                    .asInterface(ServiceManager.getService(Context.WINDOW_SERVICE));
+            if (wm == null) {
+                Log.e(TAG, "reconfigureSecondaryDisplays IWindowManager not available");
+                return;
+            }
+            Display[] displays = mDisplayManager.getDisplays();
+            for (Display display : displays) {
+                if (display.getDisplayId() == Display.DEFAULT_DISPLAY) { // skip main
+                    continue;
+                }
+                // Only use physical secondary displays
+                if (display.getAddress() instanceof DisplayAddress.Physical) {
+                    int displayId = display.getDisplayId();
+                    try {
+                        // Do not change the mode but this triggers reconfiguring.
+                        int windowingMode = wm.getWindowingMode(displayId);
+                        wm.setWindowingMode(displayId, windowingMode);
+                    } catch (RemoteException e) {
+                        Log.e(CarLog.TAG_SERVICE, "cannot access IWindowManager", e);
+                    }
+                }
+            }
+        }
     }
 }
diff --git a/service/src/com/android/car/systeminterface/SystemInterface.java b/service/src/com/android/car/systeminterface/SystemInterface.java
index a617a5a..8e7f863 100644
--- a/service/src/com/android/car/systeminterface/SystemInterface.java
+++ b/service/src/com/android/car/systeminterface/SystemInterface.java
@@ -123,6 +123,11 @@
     }
 
     @Override
+    public void reconfigureSecondaryDisplays() {
+        mDisplayInterface.reconfigureSecondaryDisplays();
+    }
+
+    @Override
     public void startDisplayStateMonitoring(CarPowerManagementService service) {
         mDisplayInterface.startDisplayStateMonitoring(service);
     }
diff --git a/service/src/com/android/car/trust/CarTrustAgentBleManager.java b/service/src/com/android/car/trust/CarTrustAgentBleManager.java
index 718bd22..022477e 100644
--- a/service/src/com/android/car/trust/CarTrustAgentBleManager.java
+++ b/service/src/com/android/car/trust/CarTrustAgentBleManager.java
@@ -85,7 +85,7 @@
     private CarTrustAgentUnlockService mCarTrustAgentUnlockService;
     private String mOriginalBluetoothName;
     private byte[] mUniqueId;
-    private String mRandomName;
+    private String mEnrollmentDeviceName;
     private int mMtuSize = 20;
 
     // Enrollment Service and Characteristic UUIDs
@@ -247,15 +247,15 @@
     }
 
     @Nullable
-    private String getRandomName() {
-        if (mRandomName != null) {
-            return mRandomName;
+    private String getEnrollmentDeviceName() {
+        if (mEnrollmentDeviceName != null) {
+            return mEnrollmentDeviceName;
         }
 
         if (getTrustedDeviceService() != null) {
-            mRandomName = getTrustedDeviceService().getRandomName();
+            mEnrollmentDeviceName = getTrustedDeviceService().getEnrollmentDeviceName();
         }
-        return mRandomName;
+        return mEnrollmentDeviceName;
     }
 
     private void resolveBLEVersion(BluetoothDevice device, byte[] value,
@@ -374,17 +374,17 @@
     void startEnrollmentAdvertising() {
         mCurrentTrustedDeviceOperation = TRUSTED_DEVICE_OPERATION_ENROLLMENT;
         // Replace name to ensure it is small enough to be advertised
-        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
-        String name = getRandomName();
-        if (mOriginalBluetoothName == null) {
-            mOriginalBluetoothName = adapter.getName();
-        }
+        String name = getEnrollmentDeviceName();
         if (name != null) {
+            BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+            if (mOriginalBluetoothName == null) {
+                mOriginalBluetoothName = adapter.getName();
+            }
             adapter.setName(name);
-        }
-        if (Log.isLoggable(TAG, Log.DEBUG)) {
-            Log.d(TAG, "Changing bluetooth adapter name from "
-                    + mOriginalBluetoothName + " to " + name);
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Changing bluetooth adapter name from "
+                        + mOriginalBluetoothName + " to " + name);
+            }
         }
         startAdvertising(mEnrollmentGattService,
                 new AdvertiseData.Builder()
diff --git a/service/src/com/android/car/trust/CarTrustedDeviceService.java b/service/src/com/android/car/trust/CarTrustedDeviceService.java
index cc79eff..d7e3321 100644
--- a/service/src/com/android/car/trust/CarTrustedDeviceService.java
+++ b/service/src/com/android/car/trust/CarTrustedDeviceService.java
@@ -24,6 +24,7 @@
 import android.content.SharedPreferences;
 import android.security.keystore.KeyGenParameterSpec;
 import android.security.keystore.KeyProperties;
+import android.sysprop.CarProperties;
 import android.util.Base64;
 import android.util.Log;
 
@@ -71,20 +72,31 @@
     private static final String KEYSTORE_PROVIDER = "AndroidKeyStore";
     private static final String IV_SPEC_SEPARATOR = ";";
 
+    // Device name length is limited by available bytes in BLE advertisement data packet.
+    //
+    // BLE advertisement limits data packet length to 31
+    // Currently we send:
+    // - 18 bytes for 16 chars UUID: 16 bytes + 2 bytes for header;
+    // - 3 bytes for advertisement being connectable;
+    // which leaves 10 bytes.
+    // Subtracting 2 bytes used by header, we have 8 bytes for device name.
+    private static final int DEVICE_NAME_LENGTH_LIMIT = 8;
+    // Limit prefix to 4 chars and fill the rest with randomly generated name. Use random name
+    // to improve uniqueness in paired device name.
+    private static final int DEVICE_NAME_PREFIX_LIMIT = 4;
+
     // The length of the authentication tag for a cipher in GCM mode. The GCM specification states
     // that this length can only have the values {128, 120, 112, 104, 96}. Using the highest
     // possible value.
     private static final int GCM_AUTHENTICATION_TAG_LENGTH = 128;
 
-    private static final int RANDOM_NAME_LENGTH = 6;
-
     private final Context mContext;
     private CarTrustAgentEnrollmentService mCarTrustAgentEnrollmentService;
     private CarTrustAgentUnlockService mCarTrustAgentUnlockService;
     private CarTrustAgentBleManager mCarTrustAgentBleManager;
     private SharedPreferences mTrustAgentTokenPreferences;
     private UUID mUniqueId;
-    private String mRandomName;
+    private String mEnrollmentDeviceName;
 
     public CarTrustedDeviceService(Context context) {
         mContext = context;
@@ -286,17 +298,22 @@
     }
 
     /**
-     * Get generated random name for enrollment
+     * Returns the name that should be used for the device during enrollment of a trusted device.
      *
-     * @return a random name for enrollment
+     * <p>The returned name will be a combination of a prefix sysprop and randomized digits.
      */
-    String getRandomName() {
-        if (mRandomName == null) {
-            // Create random RANDOM_NAME_LENGTH digit number for name
-            mRandomName = Utils.generateRandomNumberString(RANDOM_NAME_LENGTH);
-        }
+    String getEnrollmentDeviceName() {
+        if (mEnrollmentDeviceName == null) {
+            String deviceNamePrefix =
+                    CarProperties.trusted_device_device_name_prefix().orElse("");
+            deviceNamePrefix = deviceNamePrefix.substring(
+                    0, Math.min(deviceNamePrefix.length(), DEVICE_NAME_PREFIX_LIMIT));
 
-        return mRandomName;
+            int randomNameLength = DEVICE_NAME_LENGTH_LIMIT - deviceNamePrefix.length();
+            String randomName = Utils.generateRandomNumberString(randomNameLength);
+            mEnrollmentDeviceName = deviceNamePrefix + randomName;
+        }
+        return mEnrollmentDeviceName;
     }
 
     /**
diff --git a/tests/carservice_test/src/com/android/car/CarPowerManagementTest.java b/tests/carservice_test/src/com/android/car/CarPowerManagementTest.java
index ab5c271..58bf088 100644
--- a/tests/carservice_test/src/com/android/car/CarPowerManagementTest.java
+++ b/tests/carservice_test/src/com/android/car/CarPowerManagementTest.java
@@ -307,6 +307,9 @@
 
         @Override
         public void refreshDisplayBrightness() {}
+
+        @Override
+        public void reconfigureSecondaryDisplays() {}
     }
 
     private class PowerStatePropertyHandler implements VehicleHalPropertyHandler {
diff --git a/tests/carservice_test/src/com/android/car/MockedCarTestBase.java b/tests/carservice_test/src/com/android/car/MockedCarTestBase.java
index 44e07b2..894c402 100644
--- a/tests/carservice_test/src/com/android/car/MockedCarTestBase.java
+++ b/tests/carservice_test/src/com/android/car/MockedCarTestBase.java
@@ -311,6 +311,9 @@
 
         @Override
         public void refreshDisplayBrightness() {}
+
+        @Override
+        public void reconfigureSecondaryDisplays() {}
     }
 
     static final class MockIOInterface implements IOInterface {
diff --git a/tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java b/tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java
index 382d7ad..fa82f90 100644
--- a/tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java
@@ -296,6 +296,9 @@
 
         @Override
         public void refreshDisplayBrightness() {}
+
+        @Override
+        public void reconfigureSecondaryDisplays() {}
     }
 
     private static final class MockSystemStateInterface implements SystemStateInterface {