Merge Android 12

Bug: 202323961
Merged-In: I291da39a81666a7bbd001a685d1db12c84e4d31c
Change-Id: If480657962daa2337bd215a4af6f226d4a711213
diff --git a/Android.bp b/Android.bp
index cdb25af..161e0e9 100644
--- a/Android.bp
+++ b/Android.bp
@@ -33,3 +33,12 @@
     ],
     // large-scale-change unable to identify any license_text files
 }
+
+vintf_compatibility_matrix {
+    name: "redfin_product_compatibility_matrix.xml",
+    stem: "compatibility_matrix.redfin.xml",
+    product_specific: true,
+    srcs: [
+        "device_framework_matrix_product.xml",
+    ],
+}
diff --git a/AndroidProducts.mk b/AndroidProducts.mk
index 366759c..bc17b20 100644
--- a/AndroidProducts.mk
+++ b/AndroidProducts.mk
@@ -16,7 +16,10 @@
 
 PRODUCT_MAKEFILES := \
     $(LOCAL_DIR)/aosp_redfin.mk \
+    $(LOCAL_DIR)/aosp_redfin_64.mk \
+    $(LOCAL_DIR)/vf/aosp_redfin_vf.mk \
     $(LOCAL_DIR)/aosp_redfin_hwasan.mk \
 
 COMMON_LUNCH_CHOICES := \
     aosp_redfin-userdebug \
+    aosp_redfin_vf-userdebug \
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 2f8d947..6beafe6 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -48,3 +48,11 @@
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.vibrator@1.3-service.redfin.rc)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.vibrator@1.3-service.redfin)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.vibrator@1.3-service.redfin.xml)
+
+# Update to USB HAL 1.3
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.usb@1.2-service.redfin)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.usb@1.2-service.redfin.rc)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.usb@1.2-service.redfin.xml)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.usb@1.3-service.redfin)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.usb@1.3-service.redfin.rc)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.usb@1.3-service.redfin.xml)
diff --git a/METADATA b/METADATA
new file mode 100644
index 0000000..d97975c
--- /dev/null
+++ b/METADATA
@@ -0,0 +1,3 @@
+third_party {
+  license_type: NOTICE
+}
diff --git a/aosp_redfin.mk b/aosp_redfin.mk
index 5f2ced8..10b4b21 100644
--- a/aosp_redfin.mk
+++ b/aosp_redfin.mk
@@ -17,8 +17,12 @@
 #
 # All components inherited here go to system image
 #
+ifeq (,$(filter %_64,$(TARGET_PRODUCT)))
 $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
-$(call inherit-product, $(SRC_TARGET_DIR)/product/mainline_system.mk)
+else
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit_only.mk)
+endif
+$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_system.mk)
 
 # Enable mainline checking
 PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := strict
@@ -49,11 +53,13 @@
 PRODUCT_COPY_FILES += \
     frameworks/native/data/etc/aosp_excluded_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/aosp_excluded_hardware.xml
 
-# Keep the VNDK APEX in /system partition for REL branches as these branches are
-# expected to have stable API/ABI surfaces.
+# Keep the VNDK APEX in /system partition for REL branches and Vendor Freeze targets
+# as these are expected to have stable API/ABI surfaces.
 ifneq (REL,$(PLATFORM_VERSION_CODENAME))
+ifneq ($(PRODUCT_VENDOR_FREEZE_SYSTEM_BUILD),true)
   PRODUCT_PACKAGES += com.android.vndk.current.on_vendor
 endif
+endif
 
 # Don't build super.img.
 PRODUCT_BUILD_SUPER_PARTITION := false
diff --git a/aosp_redfin_64.mk b/aosp_redfin_64.mk
new file mode 100644
index 0000000..7d743ee
--- /dev/null
+++ b/aosp_redfin_64.mk
@@ -0,0 +1,20 @@
+#
+# Copyright 2021 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+$(call inherit-product, device/google/redfin/aosp_redfin.mk)
+
+PRODUCT_NAME := aosp_redfin_64
+PRODUCT_MODEL := AOSP on Redfin 64-bit only
diff --git a/audio/audio_policy_configuration.xml b/audio/audio_policy_configuration.xml
index 83a4995..a2c2819 100644
--- a/audio/audio_policy_configuration.xml
+++ b/audio/audio_policy_configuration.xml
@@ -14,7 +14,7 @@
      limitations under the License.
 -->
 
-<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
+<audioPolicyConfiguration version="7.0" xmlns:xi="http://www.w3.org/2001/XInclude">
     <globalConfiguration speaker_drc_enabled="true" call_screen_mode_supported="true"/>
 
     <modules>
@@ -33,13 +33,13 @@
                 <mixPort name="voip_rx" role="source"
                          flags="AUDIO_OUTPUT_FLAG_VOIP_RX">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                           samplingRates="8000,16000,32000,48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
+                           samplingRates="8000 16000 32000 48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
-                <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY|AUDIO_OUTPUT_FLAG_FAST">
+                <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY AUDIO_OUTPUT_FLAG_FAST">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
-                <mixPort name="raw" role="source" flags="AUDIO_OUTPUT_FLAG_RAW|AUDIO_OUTPUT_FLAG_FAST">
+                <mixPort name="raw" role="source" flags="AUDIO_OUTPUT_FLAG_RAW AUDIO_OUTPUT_FLAG_FAST">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
@@ -47,62 +47,67 @@
                 <mixPort name="deep_buffer" role="source"
                         flags="AUDIO_OUTPUT_FLAG_DEEP_BUFFER">
                     <profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
-                             samplingRates="44100,48000"
+                             samplingRates="44100 48000"
                              channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
                 <mixPort name="compressed_offload" role="source"
-                         flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING">
+                         flags="AUDIO_OUTPUT_FLAG_DIRECT AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD AUDIO_OUTPUT_FLAG_NON_BLOCKING AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD">
                     <profile name="" format="AUDIO_FORMAT_MP3"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO"/>
                     <profile name="" format="AUDIO_FORMAT_AAC_LC"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
-                             channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000 64000 88200 96000"
+                             channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO"/>
                     <profile name="" format="AUDIO_FORMAT_AAC_HE_V1"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
-                             channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000 64000 88200 96000"
+                             channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO"/>
                     <profile name="" format="AUDIO_FORMAT_AAC_HE_V2"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO"/>
                 </mixPort>
                 <mixPort name="voice_tx" role="source">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+                             samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_OUT_MONO AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
-                <mixPort name="mmap_no_irq_out" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_MMAP_NOIRQ">
+                <mixPort name="mmap_no_irq_out" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT AUDIO_OUTPUT_FLAG_MMAP_NOIRQ">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
                 <mixPort name="incall_music_uplink" role="source"
                         flags="AUDIO_OUTPUT_FLAG_INCALL_MUSIC">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,16000,48000"
+                             samplingRates="8000 16000 48000"
                              channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
                 <mixPort name="primary input" role="sink" maxActiveCount="0">
                     <profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO AUDIO_CHANNEL_IN_FRONT_BACK AUDIO_CHANNEL_INDEX_MASK_3"/>
+                </mixPort>
+                <mixPort name="hotword input" role="sink" flags="AUDIO_INPUT_FLAG_HW_HOTWORD">
+                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO"/>
                 </mixPort>
                 <mixPort name="fast input" role="sink" flags="AUDIO_INPUT_FLAG_FAST">
                     <profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO AUDIO_CHANNEL_IN_FRONT_BACK AUDIO_CHANNEL_INDEX_MASK_3"/>
                 </mixPort>
                 <mixPort name="hifi_input" role="sink" />
                 <mixPort name="voice_rx" role="sink">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO"/>
+                             samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO"/>
                 </mixPort>
                 <mixPort name="mmap_no_irq_in" role="sink" flags="AUDIO_INPUT_FLAG_MMAP_NOIRQ">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO AUDIO_CHANNEL_IN_FRONT_BACK AUDIO_CHANNEL_INDEX_MASK_3"/>
                 </mixPort>
                 <mixPort name="voip_tx" role="sink"
                          flags="AUDIO_INPUT_FLAG_VOIP_TX">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,16000,32000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
+                             samplingRates="8000 16000 32000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
                 </mixPort>
             </mixPorts>
             <devicePorts>
@@ -133,17 +138,17 @@
                 <devicePort tagName="BT A2DP Out" type="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP" role="sink"
                             encodedFormats="AUDIO_FORMAT_LDAC AUDIO_FORMAT_APTX AUDIO_FORMAT_APTX_HD AUDIO_FORMAT_AAC AUDIO_FORMAT_SBC">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="44100,48000,88200,96000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
+                             samplingRates="44100 48000 88200 96000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </devicePort>
                 <devicePort tagName="BT A2DP Headphones" type="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES" role="sink"
                             encodedFormats="AUDIO_FORMAT_LDAC AUDIO_FORMAT_APTX AUDIO_FORMAT_APTX_HD AUDIO_FORMAT_AAC AUDIO_FORMAT_SBC">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="44100,48000,88200,96000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
+                             samplingRates="44100 48000 88200 96000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </devicePort>
                 <devicePort tagName="BT A2DP Speaker" type="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER" role="sink"
                             encodedFormats="AUDIO_FORMAT_LDAC AUDIO_FORMAT_APTX AUDIO_FORMAT_APTX_HD AUDIO_FORMAT_AAC AUDIO_FORMAT_SBC">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="44100,48000,88200,96000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
+                             samplingRates="44100 48000 88200 96000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </devicePort>
                 <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source">
                 </devicePort>
@@ -188,6 +193,8 @@
                        sources="voice_tx,incall_music_uplink"/>
                 <route type="mix" sink="primary input"
                        sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic,BT SCO Headset Mic,USB Device In,USB Headset In"/>
+                <route type="mix" sink="hotword input"
+                       sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic,BT SCO Headset Mic,USB Device In,USB Headset In"/>
                 <route type="mix" sink="fast input"
                        sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic,BT SCO Headset Mic,USB Device In,USB Headset In"/>
                 <route type="mix" sink="voice_rx"
@@ -206,9 +213,6 @@
             </routes>
         </module>
 
-        <!-- A2DP Input Audio HAL -->
-        <xi:include href="a2dp_in_audio_policy_configuration.xml"/>
-
         <!-- Usb Audio HAL -->
         <module name="usb" halVersion="2.0">
             <mixPorts>
diff --git a/audio/audio_policy_configuration_a2dp_offload_disabled.xml b/audio/audio_policy_configuration_a2dp_offload_disabled.xml
index dcbcd55..cb174f8 100644
--- a/audio/audio_policy_configuration_a2dp_offload_disabled.xml
+++ b/audio/audio_policy_configuration_a2dp_offload_disabled.xml
@@ -14,7 +14,7 @@
      limitations under the License.
 -->
 
-<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
+<audioPolicyConfiguration version="7.0" xmlns:xi="http://www.w3.org/2001/XInclude">
     <globalConfiguration speaker_drc_enabled="true"/>
 
     <modules>
@@ -30,11 +30,11 @@
             </attachedDevices>
             <defaultOutputDevice>Speaker</defaultOutputDevice>
             <mixPorts>
-                <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY|AUDIO_OUTPUT_FLAG_FAST">
+                <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY AUDIO_OUTPUT_FLAG_FAST">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
-                <mixPort name="raw" role="source" flags="AUDIO_OUTPUT_FLAG_RAW|AUDIO_OUTPUT_FLAG_FAST">
+                <mixPort name="raw" role="source" flags="AUDIO_OUTPUT_FLAG_RAW AUDIO_OUTPUT_FLAG_FAST">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
@@ -42,67 +42,67 @@
                 <mixPort name="deep_buffer" role="source"
                         flags="AUDIO_OUTPUT_FLAG_DEEP_BUFFER">
                     <profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
-                             samplingRates="44100,48000"
+                             samplingRates="44100 48000"
                              channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
                 <mixPort name="compressed_offload" role="source"
-                         flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING">
+                         flags="AUDIO_OUTPUT_FLAG_DIRECT AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD AUDIO_OUTPUT_FLAG_NON_BLOCKING AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD">
                     <profile name="" format="AUDIO_FORMAT_MP3"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO"/>
                     <profile name="" format="AUDIO_FORMAT_AAC_LC"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
-                             channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000 64000 88200 96000"
+                             channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO"/>
                     <profile name="" format="AUDIO_FORMAT_AAC_HE_V1"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
-                             channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000 64000 88200 96000"
+                             channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO"/>
                     <profile name="" format="AUDIO_FORMAT_AAC_HE_V2"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO"/>
                 </mixPort>
                 <mixPort name="voice_tx" role="source">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+                             samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_OUT_MONO AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
-                <mixPort name="mmap_no_irq_out" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_MMAP_NOIRQ">
+                <mixPort name="mmap_no_irq_out" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT AUDIO_OUTPUT_FLAG_MMAP_NOIRQ">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
                 <mixPort name="voip_rx" role="source"
                          flags="AUDIO_OUTPUT_FLAG_VOIP_RX">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                           samplingRates="8000,16000,32000,48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
+                           samplingRates="8000 16000 32000 48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
                 <mixPort name="incall_music_uplink" role="source"
                         flags="AUDIO_OUTPUT_FLAG_INCALL_MUSIC">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,16000,48000"
+                             samplingRates="8000 16000 48000"
                              channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
                 <mixPort name="primary input" role="sink">
                     <profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO AUDIO_CHANNEL_IN_FRONT_BACK AUDIO_CHANNEL_INDEX_MASK_3"/>
                 </mixPort>
                 <mixPort name="fast input" role="sink" flags="AUDIO_INPUT_FLAG_FAST">
                     <profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO AUDIO_CHANNEL_IN_FRONT_BACK AUDIO_CHANNEL_INDEX_MASK_3"/>
                 </mixPort>
                 <mixPort name="hifi_input" role="sink" />
                 <mixPort name="voice_rx" role="sink">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO"/>
+                             samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO"/>
                 </mixPort>
                 <mixPort name="mmap_no_irq_in" role="sink" flags="AUDIO_INPUT_FLAG_MMAP_NOIRQ">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO AUDIO_CHANNEL_IN_FRONT_BACK AUDIO_CHANNEL_INDEX_MASK_3"/>
                 </mixPort>
                 <mixPort name="voip_tx" role="sink"
                          flags="AUDIO_INPUT_FLAG_VOIP_TX">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,16000,32000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
+                             samplingRates="8000 16000 32000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
                 </mixPort>
             </mixPorts>
             <devicePorts>
@@ -186,7 +186,7 @@
         </module>
 
         <!-- A2DP Input Audio HAL -->
-        <xi:include href="a2dp_in_audio_policy_configuration.xml"/>
+        <xi:include href="a2dp_in_audio_policy_configuration_7_0.xml"/>
 
         <!-- Usb Audio HAL -->
         <module name="usb" halVersion="2.0">
@@ -212,7 +212,7 @@
         <xi:include href="r_submix_audio_policy_configuration.xml"/>
 
         <!-- Bluetooth Audio HAL -->
-        <xi:include href="bluetooth_audio_policy_configuration.xml"/>
+        <xi:include href="bluetooth_audio_policy_configuration_7_0.xml"/>
 
     </modules>
 
diff --git a/audio/audio_policy_configuration_bluetooth_legacy_hal.xml b/audio/audio_policy_configuration_bluetooth_legacy_hal.xml
index cf68c9b..5b8b28e 100644
--- a/audio/audio_policy_configuration_bluetooth_legacy_hal.xml
+++ b/audio/audio_policy_configuration_bluetooth_legacy_hal.xml
@@ -14,7 +14,7 @@
      limitations under the License.
 -->
 
-<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
+<audioPolicyConfiguration version="7.0" xmlns:xi="http://www.w3.org/2001/XInclude">
     <globalConfiguration speaker_drc_enabled="true"/>
 
     <modules>
@@ -30,11 +30,11 @@
             </attachedDevices>
             <defaultOutputDevice>Speaker</defaultOutputDevice>
             <mixPorts>
-                <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY|AUDIO_OUTPUT_FLAG_FAST">
+                <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY AUDIO_OUTPUT_FLAG_FAST">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
-                <mixPort name="raw" role="source" flags="AUDIO_OUTPUT_FLAG_RAW|AUDIO_OUTPUT_FLAG_FAST">
+                <mixPort name="raw" role="source" flags="AUDIO_OUTPUT_FLAG_RAW AUDIO_OUTPUT_FLAG_FAST">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
@@ -42,67 +42,67 @@
                 <mixPort name="deep_buffer" role="source"
                         flags="AUDIO_OUTPUT_FLAG_DEEP_BUFFER">
                     <profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
-                             samplingRates="44100,48000"
+                             samplingRates="44100 48000"
                              channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
                 <mixPort name="compressed_offload" role="source"
-                         flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING">
+                         flags="AUDIO_OUTPUT_FLAG_DIRECT AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD AUDIO_OUTPUT_FLAG_NON_BLOCKING AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD">
                     <profile name="" format="AUDIO_FORMAT_MP3"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO"/>
                     <profile name="" format="AUDIO_FORMAT_AAC_LC"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
-                             channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000 64000 88200 96000"
+                             channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO"/>
                     <profile name="" format="AUDIO_FORMAT_AAC_HE_V1"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
-                             channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000 64000 88200 96000"
+                             channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO"/>
                     <profile name="" format="AUDIO_FORMAT_AAC_HE_V2"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO"/>
                 </mixPort>
                 <mixPort name="voice_tx" role="source">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
+                             samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_OUT_MONO AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
-                <mixPort name="mmap_no_irq_out" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_MMAP_NOIRQ">
+                <mixPort name="mmap_no_irq_out" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT AUDIO_OUTPUT_FLAG_MMAP_NOIRQ">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
                 <mixPort name="voip_rx" role="source"
                          flags="AUDIO_OUTPUT_FLAG_VOIP_RX">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                           samplingRates="8000,16000,32000,48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
+                           samplingRates="8000 16000 32000 48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
                 <mixPort name="incall_music_uplink" role="source"
                         flags="AUDIO_OUTPUT_FLAG_INCALL_MUSIC">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,16000,48000"
+                             samplingRates="8000 16000 48000"
                              channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                 </mixPort>
                 <mixPort name="primary input" role="sink">
                     <profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO AUDIO_CHANNEL_IN_FRONT_BACK AUDIO_CHANNEL_INDEX_MASK_3"/>
                 </mixPort>
                 <mixPort name="fast input" role="sink" flags="AUDIO_INPUT_FLAG_FAST">
                     <profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO AUDIO_CHANNEL_IN_FRONT_BACK AUDIO_CHANNEL_INDEX_MASK_3"/>
                 </mixPort>
                 <mixPort name="hifi_input" role="sink" />
                 <mixPort name="voice_rx" role="sink">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO"/>
+                             samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO"/>
                 </mixPort>
                 <mixPort name="mmap_no_irq_in" role="sink" flags="AUDIO_INPUT_FLAG_MMAP_NOIRQ">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
-                             channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
+                             samplingRates="8000 11025 12000 16000 22050 24000 32000 44100 48000"
+                             channelMasks="AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO AUDIO_CHANNEL_IN_FRONT_BACK AUDIO_CHANNEL_INDEX_MASK_3"/>
                 </mixPort>
                 <mixPort name="voip_tx" role="sink"
                          flags="AUDIO_INPUT_FLAG_VOIP_TX">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                             samplingRates="8000,16000,32000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
+                             samplingRates="8000 16000 32000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
                 </mixPort>
             </mixPorts>
             <devicePorts>
@@ -186,7 +186,7 @@
         </module>
 
         <!-- A2DP Audio HAL -->
-        <xi:include href="a2dp_audio_policy_configuration.xml"/>
+        <xi:include href="a2dp_audio_policy_configuration_7_0.xml"/>
 
         <!-- Usb Audio HAL -->
         <module name="usb" halVersion="2.0">
@@ -212,7 +212,7 @@
         <xi:include href="r_submix_audio_policy_configuration.xml"/>
 
         <!-- Hearing aid Audio HAL -->
-        <xi:include href="hearing_aid_audio_policy_configuration.xml"/>
+        <xi:include href="hearing_aid_audio_policy_configuration_7_0.xml"/>
 
     </modules>
 
diff --git a/audio/sound_trigger_mixer_paths.xml b/audio/sound_trigger_mixer_paths.xml
index 94a9eb6..6c99e3a 100644
--- a/audio/sound_trigger_mixer_paths.xml
+++ b/audio/sound_trigger_mixer_paths.xml
@@ -259,15 +259,14 @@
     </path>
 
     <path name="listen-ape-handset-mic">
-        <ctl name="ADC1 Capture Volume" value="23" />
-        <ctl name="ADC2 Capture Volume" value="23" />
+        <ctl name="ADC1 Capture Volume" id="0" value="23" />
         <ctl name="PRI_TDM_TX_0 Channels" value="One" />
         <ctl name="Sto1 ADC MIXL BargeIn DMIC Switch" value="1" />
     </path>
 
     <path name="listen-ape-handset-dmic">
-        <ctl name="ADC1 Capture Volume" value="23"/>
-        <ctl name="ADC2 Capture Volume" value="23"/>
+        <ctl name="ADC1 Capture Volume" id="0" value="23"/>
+        <ctl name="ADC2 Capture Volume" id="1" value="23"/>
         <ctl name="PRI TDM TX Channel Offset" id="0" value="0"/>
         <ctl name="PRI TDM TX Channel Offset" id="1" value="12"/>
         <ctl name="PRI_TDM_TX_0 Channels" value="Two"/>
@@ -276,8 +275,9 @@
     </path>
 
     <path name="listen-ape-handset-tmic">
-        <ctl name="ADC1 Capture Volume" value="23" />
-        <ctl name="ADC2 Capture Volume" value="23" />
+        <ctl name="ADC1 Capture Volume" id="0" value="23" />
+        <ctl name="ADC2 Capture Volume" id="0" value="23" />
+        <ctl name="ADC2 Capture Volume" id="1" value="23" />
         <ctl name="PRI_TDM_TX_0 Channels" value="Three" />
     </path>
 
diff --git a/device-redfin.mk b/device-redfin.mk
index 4cb818d..df1b668 100644
--- a/device-redfin.mk
+++ b/device-redfin.mk
@@ -31,6 +31,8 @@
 include build/make/target/product/iorap_large_memory_config.mk
 include device/google/redbull/device-common.mk
 
+$(call inherit-product, $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
+
 # LOCAL_PATH is device/google/redbull before this
 LOCAL_PATH := device/google/redfin
 
@@ -52,10 +54,10 @@
     $(LOCAL_PATH)/audio/audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration.xml \
     $(LOCAL_PATH)/audio/audio_policy_configuration_a2dp_offload_disabled.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration_a2dp_offload_disabled.xml \
     $(LOCAL_PATH)/audio/audio_policy_configuration_bluetooth_legacy_hal.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration_bluetooth_legacy_hal.xml \
-    frameworks/av/services/audiopolicy/config/a2dp_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_audio_policy_configuration.xml \
-    frameworks/av/services/audiopolicy/config/a2dp_in_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_in_audio_policy_configuration.xml \
-    frameworks/av/services/audiopolicy/config/bluetooth_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth_audio_policy_configuration.xml \
-    frameworks/av/services/audiopolicy/config/hearing_aid_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/hearing_aid_audio_policy_configuration.xml \
+    frameworks/av/services/audiopolicy/config/a2dp_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_audio_policy_configuration.xml \
+    frameworks/av/services/audiopolicy/config/a2dp_in_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_in_audio_policy_configuration_7_0.xml \
+    frameworks/av/services/audiopolicy/config/bluetooth_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth_audio_policy_configuration_7_0.xml \
+    frameworks/av/services/audiopolicy/config/hearing_aid_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/hearing_aid_audio_policy_configuration_7_0.xml \
     frameworks/av/services/audiopolicy/config/usb_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/usb_audio_policy_configuration.xml \
     frameworks/av/services/audiopolicy/config/r_submix_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/r_submix_audio_policy_configuration.xml \
     frameworks/av/services/audiopolicy/config/default_volume_tables.xml:$(TARGET_COPY_OUT_VENDOR)/etc/default_volume_tables.xml
@@ -107,7 +109,7 @@
     $(LOCAL_PATH)/audio/cs35l41/B2/R-cs35l41-revB2-dsp1-spk-prot.bin:$(TARGET_COPY_OUT_VENDOR)/firmware/R-cs35l41-revB2-dsp1-spk-prot.bin
 
 # Audio CS35L41 speaker calibration tool
-PRODUCT_PACKAGES += \
+PRODUCT_PACKAGES_DEBUG += \
     crus_sp_cal
 
 # Audio audiozoom config data
@@ -130,7 +132,7 @@
 endif
 
 PRODUCT_PACKAGES += \
-    android.hardware.usb@1.2-service.redfin
+    android.hardware.usb@1.3-service.redfin
 
 # Vibrator HAL
 PRODUCT_PACKAGES += \
@@ -178,8 +180,6 @@
 # Support to disable thermal protection at run time
 ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
     PRODUCT_COPY_FILES += \
-        $(LOCAL_PATH)/init.hardware.chamber.rc.userdebug:$(TARGET_COPY_OUT_VENDOR)/etc/init/init.$(PRODUCT_HARDWARE).chamber.rc
-    PRODUCT_COPY_FILES += \
 	$(LOCAL_PATH)/init.hardware.wlc.rc.userdebug:$(TARGET_COPY_OUT_VENDOR)/etc/init/init.$(PRODUCT_PLATFORM).wlc.rc
 endif
 
@@ -187,6 +187,11 @@
 #PRODUCT_COPY_FILES += \
 #    $(LOCAL_PATH)/gnss_antenna_info.conf:$(TARGET_COPY_OUT_VENDOR)/etc/gnss_antenna_info.conf
 
+# Display configuration
+PRODUCT_COPY_FILES += \
+    device/google/redfin/displayconfig/display_id_4630946523002478721.xml:$(TARGET_COPY_OUT_VENDOR)/etc/displayconfig/display_id_4630946523002478721.xml
+
+
 # Audio effects
 PRODUCT_PACKAGES += \
     libqcomvoiceprocessingdescriptors
@@ -221,3 +226,21 @@
     $(LOCAL_PATH)/bluetooth_power_limits_redfin_us.csv:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth_power_limits_US.csv \
     $(LOCAL_PATH)/bluetooth_power_limits_redfin_eu.csv:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth_power_limits_EU.csv \
     $(LOCAL_PATH)/bluetooth_power_limits_redfin_jp.csv:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth_power_limits_JP.csv
+
+# Set support hide display cutout feature
+PRODUCT_PRODUCT_PROPERTIES += \
+    ro.support_hide_display_cutout=true
+
+PRODUCT_PACKAGES += \
+    NoCutoutOverlay \
+    AvoidAppsInCutoutOverlay
+
+# (b/183612348): Enable skia reduceOpsTaskSplitting
+PRODUCT_PROPERTY_OVERRIDES += \
+    renderthread.skia.reduceopstasksplitting=true
+
+# Include the redfin product FCM.
+# Vendor Freeze system-only builds use a different FCM.
+ifneq ($(PRODUCT_VENDOR_FREEZE_SYSTEM_BUILD),true)
+PRODUCT_PACKAGES += redfin_product_compatibility_matrix.xml
+endif
diff --git a/device_framework_matrix.xml b/device_framework_matrix_product.xml
similarity index 72%
rename from device_framework_matrix.xml
rename to device_framework_matrix_product.xml
index bbba187..f3fcd07 100644
--- a/device_framework_matrix.xml
+++ b/device_framework_matrix_product.xml
@@ -1,7 +1,7 @@
-<compatibility-matrix version="1.0" type="framework">
+<compatibility-matrix version="1.0" type="framework" level="5">
     <hal format="hidl" optional="true">
         <name>vendor.google.wireless_charger</name>
-        <version>1.2</version>
+        <version>1.3</version>
         <interface>
             <name>IWirelessCharger</name>
             <instance>default</instance>
diff --git a/displayconfig/display_id_4630946523002478721.xml b/displayconfig/display_id_4630946523002478721.xml
new file mode 100644
index 0000000..30f1388
--- /dev/null
+++ b/displayconfig/display_id_4630946523002478721.xml
@@ -0,0 +1,41 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+
+<!-- Copyright (C) 2020 Google Inc.
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<displayConfiguration>
+    <screenBrightnessMap>
+        <point>
+            <value>0.0</value>
+            <nits>2.0</nits>
+        </point>
+        <point>
+            <value>1.0</value>
+            <nits>500.0</nits>
+        </point>
+    </screenBrightnessMap>
+
+    <highBrightnessMode enabled="false">
+        <transitionPoint>0.8</transitionPoint>
+        <minimumLux>10000</minimumLux>
+        <timing>
+            <!-- allow for 5 minutes out of every 30 minutes -->
+            <timeWindowSecs>1800</timeWindowSecs>
+            <timeMaxSecs>300</timeMaxSecs>
+            <timeMinSecs>60</timeMinSecs>
+        </timing>
+    </highBrightnessMode>
+</displayConfiguration>
+
diff --git a/dumpstate/DumpstateDevice.cpp b/dumpstate/DumpstateDevice.cpp
index bbbc685..62f6379 100755
--- a/dumpstate/DumpstateDevice.cpp
+++ b/dumpstate/DumpstateDevice.cpp
@@ -27,6 +27,7 @@
 #include <log/log.h>
 #include <pthread.h>
 #include <string.h>
+#include <sys/stat.h>
 
 #define _SVID_SOURCE
 #include <dirent.h>
@@ -43,8 +44,6 @@
 
 #define DIAG_MDLOG_NUMBER_BUGREPORT "persist.vendor.sys.modem.diag.mdlog_br_num"
 
-#define UFS_BOOTDEVICE "ro.boot.bootdevice"
-
 #define TCPDUMP_NUMBER_BUGREPORT "persist.vendor.tcpdump.log.br_num"
 #define TCPDUMP_PERSIST_PROPERTY "persist.vendor.tcpdump.log.alwayson"
 
@@ -67,13 +66,146 @@
 #define TCPDUMP_LOG_PREFIX "tcpdump"
 #define EXTENDED_LOG_PREFIX "extended_log_"
 
+#define BUFSIZE 65536
+static void copyFile(std::string srcFile, std::string destFile) {
+    uint8_t buffer[BUFSIZE];
+    ssize_t size;
+
+    int fdSrc = open(srcFile.c_str(), O_RDONLY);
+    if (fdSrc < 0) {
+        ALOGD("Failed to open source file %s\n", srcFile.c_str());
+        return;
+    }
+
+    int fdDest = open(destFile.c_str(), O_WRONLY | O_CREAT, 0666);
+    if (fdDest < 0) {
+        ALOGD("Failed to open destination file %s\n", destFile.c_str());
+        close(fdSrc);
+        return;
+    }
+
+    ALOGD("Copying %s to %s\n", srcFile.c_str(), destFile.c_str());
+    while ((size = TEMP_FAILURE_RETRY(read(fdSrc, buffer, BUFSIZE))) > 0) {
+        TEMP_FAILURE_RETRY(write(fdDest, buffer, size));
+    }
+
+    close(fdDest);
+    close(fdSrc);
+}
+
+struct PosixTarHeader {
+    char name[100];               /*   0 */
+    char mode[8];                 /* 100 */
+    char uid[8];                  /* 108 */
+    char gid[8];                  /* 116 */
+    char size[12];                /* 124 */
+    char mtime[12];               /* 136 */
+    char chksum[8];               /* 148 */
+    char typeflag;                /* 156 */
+    char linkname[100];           /* 157 */
+    char magic[6];                /* 257 */
+    char version[2];              /* 259 */
+    char uname[32];               /* 265 */
+    char gname[32];               /* 297 */
+    char devmajor[8];             /* 329 */
+    char devminor[8];             /* 337 */
+    char prefix[155];             /* 345 */
+    char pad[12];                 /* 500 */
+};
+
+static unsigned int tarCheckSum(PosixTarHeader *header) {
+    unsigned int sum = 0;
+    char *p = (char *)header;
+    char *q = p + sizeof(PosixTarHeader);
+    for (int i = 0; i < 8; i++) {
+        header->chksum[i] = ' ';
+    }
+    while (p < q) {
+        sum += *p++ & 0xff;
+    }
+    return sum;
+}
+
+static PosixTarHeader *tarHeader(PosixTarHeader *header, char *fileName, ssize_t fileSize) {
+    memset(header, 0, sizeof(PosixTarHeader));
+    strcpy(header->name, fileName);
+    sprintf(header->mode, "%07o", 0600);
+    sprintf(header->size, "%011llo", (long long unsigned int)fileSize);
+    sprintf(header->mtime, "%011o", 0);
+    header->typeflag = '0';
+    strcpy(header->magic, "ustar");
+    strcpy(header->version, " ");
+    sprintf(header->chksum, "%06o", tarCheckSum(header));
+    return header;
+}
+
+static void createTarFile(std::string tarFile, std::string srcDir) {
+    uint8_t buffer[BUFSIZE];
+    struct dirent *dirent;
+    struct stat st;
+    PosixTarHeader header;
+    ssize_t size, tarLen = 0, blockSize = sizeof(PosixTarHeader);
+    char padding = '\0';
+
+    DIR *dirp = opendir(srcDir.c_str());
+    if (dirp == NULL) {
+        ALOGD("Unable to open folder %s\n", srcDir.c_str());
+        return;
+    }
+
+    int fdTar = open(tarFile.c_str(), O_WRONLY | O_CREAT, 0666);
+    if (fdTar < 0) {
+        ALOGD("Unable to open file %s\n", tarFile.c_str());
+        closedir(dirp);
+        return;
+    }
+
+    ALOGD("Creating tar file %s\n", tarFile.c_str());
+    while ((dirent = readdir(dirp)) != NULL) {
+        if (dirent->d_name[0] == '.') {
+            continue;
+        }
+
+        std::string path = srcDir + "/" + dirent->d_name;
+        int fd = open(path.c_str(), O_RDONLY);
+        if (fd < 0) {
+            ALOGD("Unable to open file %s\n", path.c_str());
+            continue;
+        }
+        fstat(fd, &st);
+
+        if (TEMP_FAILURE_RETRY(write(fdTar, tarHeader(
+            &header, dirent->d_name, st.st_size), blockSize)) <= 0) {
+            ALOGD("Error while writing file %s, errno=%d\n", tarFile.c_str(), errno);
+            close(fd);
+            continue;
+        }
+        tarLen += blockSize;
+
+        while ((size = TEMP_FAILURE_RETRY(read(fd, buffer, BUFSIZE))) > 0) {
+            write(fdTar, buffer, size);
+            tarLen += size;
+        }
+
+        while (tarLen % blockSize != 0) {
+            write(fdTar, &padding, 1);
+            tarLen++;
+        }
+        close(fd);
+    }
+    close(fdTar);
+    closedir(dirp);
+}
+
 static void dumpLogs(int fd, std::string srcDir, std::string destDir,
                      int maxFileNum, const char *logPrefix) {
+    (void) fd;
     struct dirent **dirent_list = NULL;
     int num_entries = scandir(srcDir.c_str(),
                               &dirent_list,
                               0,
                               (int (*)(const struct dirent **, const struct dirent **)) alphasort);
+
     if (!dirent_list) {
         return;
     } else if (num_entries <= 0) {
@@ -96,14 +228,9 @@
 
         copiedFiles++;
 
-        CommandOptions options = CommandOptions::WithTimeout(120).Build();
         std::string srcLogFile = srcDir + "/" + dirent_list[i]->d_name;
         std::string destLogFile = destDir + "/" + dirent_list[i]->d_name;
-
-        std::string copyCmd = "/vendor/bin/cp " + srcLogFile + " " + destLogFile;
-
-        ALOGD("Copying %s to %s\n", srcLogFile.c_str(), destLogFile.c_str());
-        RunCommandToFd(fd, "CP DIAG LOGS", { "/vendor/bin/sh", "-c", copyCmd.c_str() }, options);
+        copyFile(srcLogFile, destLogFile);
     }
 
     while (num_entries--) {
@@ -132,22 +259,10 @@
         return NULL;
     }
 
-    sleep(1);
-    ALOGD("Waited modem for 1 second to flush logs");
-
-    const std::string modemLogCombined = modemLogDir + "/" + filePrefix + "all.tar";
-    const std::string modemLogAllDir = modemLogDir + "/modem_log";
-
-    RunCommandToFd(STDOUT_FILENO, "MKDIR MODEM LOG", {"/vendor/bin/mkdir", "-p", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build());
-
-    const std::string diagLogDir = "/data/vendor/radio/diag_logs/logs";
-    const std::string diagPoweronLogPath = "/data/vendor/radio/diag_logs/logs/diag_poweron_log.qmdl";
-
     bool diagLogEnabled = android::base::GetBoolProperty(DIAG_MDLOG_PERSIST_PROPERTY, false);
+    bool diagLogStarted = android::base::GetBoolProperty(DIAG_MDLOG_STATUS_PROPERTY, false);
 
     if (diagLogEnabled) {
-        bool diagLogStarted = android::base::GetBoolProperty( DIAG_MDLOG_STATUS_PROPERTY, false);
-
         if (diagLogStarted) {
             android::base::SetProperty(DIAG_MDLOG_PROPERTY, "false");
             ALOGD("Stopping diag_mdlog...\n");
@@ -159,7 +274,20 @@
         } else {
             ALOGD("diag_mdlog is not running");
         }
+    }
 
+    sleep(1);
+    ALOGD("Waited modem for 1 second to flush logs");
+
+    const std::string modemLogCombined = modemLogDir + "/" + filePrefix + "all.tar";
+    const std::string modemLogAllDir = modemLogDir + "/modem_log";
+
+    RunCommandToFd(STDOUT_FILENO, "MKDIR MODEM LOG", {"/vendor/bin/mkdir", "-p", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build());
+
+    const std::string diagLogDir = "/data/vendor/radio/diag_logs/logs";
+    const std::string diagPoweronLogPath = "/data/vendor/radio/diag_logs/logs/diag_poweron_log.qmdl";
+
+    if (diagLogEnabled) {
         dumpLogs(STDOUT_FILENO, diagLogDir, modemLogAllDir, android::base::GetIntProperty(DIAG_MDLOG_NUMBER_BUGREPORT, 100), DIAG_LOG_PREFIX);
 
         if (diagLogStarted) {
@@ -167,7 +295,7 @@
             android::base::SetProperty(DIAG_MDLOG_PROPERTY, "true");
         }
     }
-    RunCommandToFd(STDOUT_FILENO, "CP MODEM POWERON LOG", {"/vendor/bin/cp", diagPoweronLogPath.c_str(), modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build());
+    copyFile(diagPoweronLogPath, modemLogAllDir + "/" + basename(diagPoweronLogPath.c_str()));
 
     if (!PropertiesHelper::IsUserBuild()) {
         char cmd[256] = { 0 };
@@ -207,7 +335,7 @@
         }
 
         for (const auto& logFile : rilAndNetmgrLogs) {
-            RunCommandToFd(STDOUT_FILENO, "CP MODEM LOG", {"/vendor/bin/cp", logFile.c_str(), modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build());
+            copyFile(logFile, modemLogAllDir + "/" + basename(logFile.c_str()));
         }
 
         //Dump IPA log
@@ -220,8 +348,7 @@
         android::base::SetProperty(MODEM_EFS_DUMP_PROPERTY, "false");
     }
 
-    RunCommandToFd(STDOUT_FILENO, "TAR LOG", {"/vendor/bin/tar", "cvf", modemLogCombined.c_str(), "-C", modemLogAllDir.c_str(), "."}, CommandOptions::WithTimeout(20).Build());
-    RunCommandToFd(STDOUT_FILENO, "CHG PERM", {"/vendor/bin/chmod", "a+w", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build());
+    createTarFile(modemLogCombined, modemLogAllDir);
 
     std::vector<uint8_t> buffer(65536);
     android::base::unique_fd fdLog(TEMP_FAILURE_RETRY(open(modemLogCombined.c_str(), O_RDONLY | O_CLOEXEC | O_NONBLOCK)));
@@ -389,10 +516,6 @@
 
 static void DumpF2FS(int fd) {
     DumpFileToFd(fd, "F2FS", "/sys/kernel/debug/f2fs/status");
-    RunCommandToFd(fd, "F2FS - fragmentation", {"/vendor/bin/sh", "-c",
-                       "for d in $(ls /proc/fs/f2fs/); do "
-                       "echo $d: /dev/block/mapper/`ls -l /dev/block/mapper | grep $d | awk '{print $8,$9,$10}'`; "
-                       "cat /proc/fs/f2fs/$d/segment_info; done"});
     RunCommandToFd(fd, "F2FS - fsck time (ms)", {"/vendor/bin/sh", "-c", "getprop ro.boottime.init.fsck.data"});
     RunCommandToFd(fd, "F2FS - checkpoint=disable time (ms)", {"/vendor/bin/sh", "-c", "getprop ro.boottime.init.mount.data"});
 }
@@ -402,52 +525,49 @@
     DumpFileToFd(fd, "UFS rev", "/sys/block/sda/device/rev");
     DumpFileToFd(fd, "UFS size", "/sys/block/sda/size");
 
-    std::string bootdev = android::base::GetProperty(UFS_BOOTDEVICE, "");
-    if (!bootdev.empty()) {
-        DumpFileToFd(fd, "UFS Slow IO Read", "/sys/devices/platform/soc/" + bootdev + "/slowio_read_cnt");
-        DumpFileToFd(fd, "UFS Slow IO Write", "/sys/devices/platform/soc/" + bootdev + "/slowio_write_cnt");
-        DumpFileToFd(fd, "UFS Slow IO Unmap", "/sys/devices/platform/soc/" + bootdev + "/slowio_unmap_cnt");
-        DumpFileToFd(fd, "UFS Slow IO Sync", "/sys/devices/platform/soc/" + bootdev + "/slowio_sync_cnt");
+    DumpFileToFd(fd, "UFS Slow IO Read", "/dev/sys/block/bootdevice/slowio_read_cnt");
+    DumpFileToFd(fd, "UFS Slow IO Write", "/dev/sys/block/bootdevice/slowio_write_cnt");
+    DumpFileToFd(fd, "UFS Slow IO Unmap", "/dev/sys/block/bootdevice/slowio_unmap_cnt");
+    DumpFileToFd(fd, "UFS Slow IO Sync", "//dev/sys/block/bootdevice/slowio_sync_cnt");
 
-        RunCommandToFd(fd, "UFS err_stats", {"/vendor/bin/sh", "-c",
-                           "path=\"/sys/devices/platform/soc/" + bootdev + "/err_stats\"; "
-                           "for node in `ls $path/err_*`; do "
-                           "printf \"%s:%d\\n\" $(basename $node) $(cat $node); done;"});
+    RunCommandToFd(fd, "UFS err_stats", {"/vendor/bin/sh", "-c",
+                       "path=\"/dev/sys/block/bootdevice/err_stats\"; "
+                       "for node in `ls $path/err_*`; do "
+                       "printf \"%s:%d\\n\" $(basename $node) $(cat $node); done;"});
 
-        RunCommandToFd(fd, "UFS io_stats", {"/vendor/bin/sh", "-c",
-                           "path=\"/sys/devices/platform/soc/" + bootdev + "/io_stats\"; "
-                           "printf \"\\t\\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
-                           "ReadCnt ReadBytes WriteCnt WriteBytes RWCnt RWBytes; "
-                           "str=$(cat $path/*_start); arr=($str); "
-                           "printf \"Started: \\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
-                           "${arr[1]} ${arr[0]} ${arr[5]} ${arr[4]} ${arr[3]} ${arr[2]}; "
-                           "str=$(cat $path/*_complete); arr=($str); "
-                           "printf \"Completed: \\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
-                           "${arr[1]} ${arr[0]} ${arr[5]} ${arr[4]} ${arr[3]} ${arr[2]}; "
-                           "str=$(cat $path/*_maxdiff); arr=($str); "
-                           "printf \"MaxDiff: \\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\\n\" "
-                           "${arr[1]} ${arr[0]} ${arr[5]} ${arr[4]} ${arr[3]} ${arr[2]}; "});
+    RunCommandToFd(fd, "UFS io_stats", {"/vendor/bin/sh", "-c",
+                       "path=\"/dev/sys/block/bootdevice/io_stats\"; "
+                       "printf \"\\t\\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+                       "ReadCnt ReadBytes WriteCnt WriteBytes RWCnt RWBytes; "
+                       "str=$(cat $path/*_start); arr=($str); "
+                       "printf \"Started: \\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+                       "${arr[1]} ${arr[0]} ${arr[5]} ${arr[4]} ${arr[3]} ${arr[2]}; "
+                       "str=$(cat $path/*_complete); arr=($str); "
+                       "printf \"Completed: \\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+                       "${arr[1]} ${arr[0]} ${arr[5]} ${arr[4]} ${arr[3]} ${arr[2]}; "
+                       "str=$(cat $path/*_maxdiff); arr=($str); "
+                       "printf \"MaxDiff: \\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\\n\" "
+                       "${arr[1]} ${arr[0]} ${arr[5]} ${arr[4]} ${arr[3]} ${arr[2]}; "});
 
-        RunCommandToFd(fd, "UFS req_stats", {"/vendor/bin/sh", "-c",
-                           "path=\"/sys/devices/platform/soc/" + bootdev + "/req_stats\"; "
-                           "printf \"\\t%-10s %-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
-                           "All Write Read Read\\(urg\\) Write\\(urg\\) Flush Discard; "
-                           "str=$(cat $path/*_min); arr=($str); "
-                           "printf \"Min:\\t%-10s %-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
-                           "${arr[0]} ${arr[3]} ${arr[6]} ${arr[4]} ${arr[5]} ${arr[2]} ${arr[1]}; "
-                           "str=$(cat $path/*_max); arr=($str); "
-                           "printf \"Max:\\t%-10s %-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
-                           "${arr[0]} ${arr[3]} ${arr[6]} ${arr[4]} ${arr[5]} ${arr[2]} ${arr[1]}; "
-                           "str=$(cat $path/*_avg); arr=($str); "
-                           "printf \"Avg.:\\t%-10s %-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
-                           "${arr[0]} ${arr[3]} ${arr[6]} ${arr[4]} ${arr[5]} ${arr[2]} ${arr[1]}; "
-                           "str=$(cat $path/*_sum); arr=($str); "
-                           "printf \"Count:\\t%-10s %-10s %-10s %-10s %-10s %-10s %-10s\\n\\n\" "
-                           "${arr[0]} ${arr[3]} ${arr[6]} ${arr[4]} ${arr[5]} ${arr[2]} ${arr[1]};"});
+    RunCommandToFd(fd, "UFS req_stats", {"/vendor/bin/sh", "-c",
+                       "path=\"/dev/sys/block/bootdevice/req_stats\"; "
+                       "printf \"\\t%-10s %-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+                       "All Write Read Read\\(urg\\) Write\\(urg\\) Flush Discard; "
+                       "str=$(cat $path/*_min); arr=($str); "
+                       "printf \"Min:\\t%-10s %-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+                       "${arr[0]} ${arr[3]} ${arr[6]} ${arr[4]} ${arr[5]} ${arr[2]} ${arr[1]}; "
+                       "str=$(cat $path/*_max); arr=($str); "
+                       "printf \"Max:\\t%-10s %-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+                       "${arr[0]} ${arr[3]} ${arr[6]} ${arr[4]} ${arr[5]} ${arr[2]} ${arr[1]}; "
+                       "str=$(cat $path/*_avg); arr=($str); "
+                       "printf \"Avg.:\\t%-10s %-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+                       "${arr[0]} ${arr[3]} ${arr[6]} ${arr[4]} ${arr[5]} ${arr[2]} ${arr[1]}; "
+                       "str=$(cat $path/*_sum); arr=($str); "
+                       "printf \"Count:\\t%-10s %-10s %-10s %-10s %-10s %-10s %-10s\\n\\n\" "
+                       "${arr[0]} ${arr[3]} ${arr[6]} ${arr[4]} ${arr[5]} ${arr[2]} ${arr[1]};"});
 
-        std::string ufs_health = "for f in $(find /sys/devices/platform/soc/" + bootdev + "/health_descriptor -type f); do if [[ -r $f && -f $f ]]; then echo --- $f; cat $f; echo ''; fi; done";
-        RunCommandToFd(fd, "UFS health", {"/vendor/bin/sh", "-c", ufs_health.c_str()});
-    }
+    std::string ufs_health = "for f in $(find /dev/sys/block/bootdevice/health_descriptor -type f); do if [[ -r $f && -f $f ]]; then echo --- $f; cat $f; echo ''; fi; done";
+    RunCommandToFd(fd, "UFS health", {"/vendor/bin/sh", "-c", ufs_health.c_str()});
 }
 
 // Methods from ::android::hardware::dumpstate::V1_0::IDumpstateDevice follow.
@@ -607,6 +727,8 @@
     // Dump fastrpc dma buffer size
     DumpFileToFd(fd, "Fastrpc dma buffer", "/sys/kernel/fastrpc/total_dma_kb");
 
+    // Dump page owner
+    DumpFileToFd(fd, "Page Owner", "/sys/kernel/debug/page_owner");
     if (modemThreadHandle) {
         pthread_join(modemThreadHandle, NULL);
     }
diff --git a/init.hardware.chamber.rc.userdebug b/init.hardware.chamber.rc.userdebug
deleted file mode 100644
index 2c1df4f..0000000
--- a/init.hardware.chamber.rc.userdebug
+++ /dev/null
@@ -1,59 +0,0 @@
-#
-# Copyright (C) 2020 The Android Open-Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-on property:persist.vendor.disable.thermal.control=1
-  write /sys/devices/virtual/thermal/tz-by-name/skin-therm/emul_temp 25000
-  write /sys/devices/virtual/thermal/tz-by-name/skin-therm/mode disabled
-  write /sys/devices/virtual/thermal/tz-by-name/skin-therm-cpu/emul_temp 25000
-  write /sys/devices/virtual/thermal/tz-by-name/skin-therm-cpu/mode disabled
-  write /sys/devices/virtual/thermal/tz-by-name/skin-therm-monitor/emul_temp 25000
-  write /sys/devices/virtual/thermal/tz-by-name/skin-therm-monitor/mode disabled
-  write /sys/devices/virtual/thermal/tz-by-name/panel-audio-therm/emul_temp 25000
-  write /sys/devices/virtual/thermal/tz-by-name/panel-audio-therm/mode disabled
-  write /sys/devices/virtual/thermal/tz-by-name/cellular-emergency/emul_temp 25000
-  write /sys/devices/virtual/thermal/tz-by-name/cellular-emergency/mode disabled
-  write /sys/devices/virtual/thermal/tz-by-name/sdm-therm/emul_temp 25000
-  write /sys/devices/virtual/thermal/tz-by-name/sdm-therm/mode disabled
-  write /sys/devices/virtual/thermal/tz-by-name/usbc-therm-adc/emul_temp 25000
-  write /sys/devices/virtual/thermal/tz-by-name/usbc-therm-adc/mode disabled
-  write /sys/devices/virtual/thermal/tz-by-name/usbc-therm-monitor/emul_temp 25000
-  write /sys/devices/virtual/thermal/tz-by-name/usbc-therm-monitor/mode disabled
-  write /sys/module/overheat_mitigation/parameters/enable 0
-
-on property:persist.vendor.disable.thermal.control=0
-  write /sys/devices/virtual/thermal/tz-by-name/skin-therm/emul_temp 0
-  write /sys/devices/virtual/thermal/tz-by-name/skin-therm/mode enabled
-  write /sys/devices/virtual/thermal/tz-by-name/skin-therm-cpu/emul_temp 0
-  write /sys/devices/virtual/thermal/tz-by-name/skin-therm-cpu/mode enabled
-  write /sys/devices/virtual/thermal/tz-by-name/skin-therm-monitor/emul_temp 0
-  write /sys/devices/virtual/thermal/tz-by-name/skin-therm-monitor/mode enabled
-  write /sys/devices/virtual/thermal/tz-by-name/panel-audio-therm/emul_temp 0
-  write /sys/devices/virtual/thermal/tz-by-name/panel-audio-therm/mode enabled
-  write /sys/devices/virtual/thermal/tz-by-name/cellular-emergency/emul_temp 0
-  write /sys/devices/virtual/thermal/tz-by-name/cellular-emergency/mode enabled
-  write /sys/devices/virtual/thermal/tz-by-name/sdm-therm/emul_temp 0
-  write /sys/devices/virtual/thermal/tz-by-name/sdm-therm/mode enabled
-  write /sys/devices/virtual/thermal/tz-by-name/usbc-therm-adc/emul_temp 0
-  write /sys/devices/virtual/thermal/tz-by-name/usbc-therm-adc/mode enabled
-  write /sys/devices/virtual/thermal/tz-by-name/usbc-therm-monitor/emul_temp 0
-  write /sys/devices/virtual/thermal/tz-by-name/usbc-therm-monitor/mode enabled
-  write /sys/module/overheat_mitigation/parameters/enable 1
-
-on property:persist.vendor.disable.usb.overheat.mitigation=1
-  write /sys/module/overheat_mitigation/parameters/enable 0
-
-on property:persist.vendor.disable.usb.overheat.mitigation=0
-  write /sys/module/overheat_mitigation/parameters/enable 1
diff --git a/manifest.xml b/manifest.xml
deleted file mode 100644
index a663664..0000000
--- a/manifest.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<!-- Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-    * Neither the name of The Linux Foundation nor the names of its
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<manifest version="1.0" type="device" target-level="5">
-    <kernel target-level="5"/>
-    <hal format="hidl">
-      <name>vendor.google.wireless_charger</name>
-      <transport>hwbinder</transport>
-      <version>1.2</version>
-      <interface>
-        <name>IWirelessCharger</name>
-        <instance>default</instance>
-      </interface>
-    </hal>
-</manifest>
diff --git a/redfin/BoardConfig.mk b/redfin/BoardConfig.mk
index aa3bc5a..d155f40 100644
--- a/redfin/BoardConfig.mk
+++ b/redfin/BoardConfig.mk
@@ -14,16 +14,18 @@
 # limitations under the License.
 #
 
-TARGET_BOOTLOADER_BOARD_NAME := redfin
-TARGET_SCREEN_DENSITY := 440
-TARGET_RECOVERY_UI_MARGIN_HEIGHT := 165
-USES_DEVICE_GOOGLE_REDFIN := true
+ifdef PHONE_CAR_BOARD_CONFIG
+  include $(PHONE_CAR_BOARD_CONFIG)
+else
+  TARGET_BOOTLOADER_BOARD_NAME := redfin
+  TARGET_SCREEN_DENSITY := 440
+  TARGET_RECOVERY_UI_MARGIN_HEIGHT := 165
+  USES_DEVICE_GOOGLE_REDFIN := true
 
-include device/google/redbull/BoardConfig-common.mk
-DEVICE_MANIFEST_FILE += device/google/redfin/manifest.xml
-DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE += device/google/redfin/device_framework_matrix.xml
+  include device/google/redbull/BoardConfig-common.mk
 
-# Testing related defines
-#BOARD_PERFSETUP_SCRIPT := platform_testing/scripts/perf-setup/r3-setup.sh
+  # Testing related defines
+  #BOARD_PERFSETUP_SCRIPT := platform_testing/scripts/perf-setup/r3-setup.sh
 
--include vendor/google_devices/$(TARGET_BOOTLOADER_BOARD_NAME)/proprietary/BoardConfigVendor.mk
+  -include vendor/google_devices/$(TARGET_BOOTLOADER_BOARD_NAME)/proprietary/BoardConfigVendor.mk
+endif
diff --git a/redfin/overlay/frameworks/base/core/res/res/values/config.xml b/redfin/overlay/frameworks/base/core/res/res/values/config.xml
index 3aa7584..d280189 100755
--- a/redfin/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/redfin/overlay/frameworks/base/core/res/res/values/config.xml
@@ -147,6 +147,20 @@
         <item>500.0</item>
     </array>
 
+    <!-- Nonlinear coefficients for maximum panel brightness of 500 nits -->
+    <string-array name="config_reduceBrightColorsCoefficientsNonlinear">
+        <!-- a-coefficient --> <item>-0.4553233597</item>
+        <!-- b-coefficient --> <item>-0.2380196976</item>
+        <!-- y-intercept --> <item>0.9801096801</item>
+    </string-array>
+
+    <!-- Linear coefficients for maximum panel brightness of 500 nits -->
+    <string-array name="config_reduceBrightColorsCoefficients">
+        <!-- a-coefficient --> <item>0.0</item>
+        <!-- b-coefficient --> <item>-0.96</item>
+        <!-- y-intercept --> <item>1.0</item>
+    </string-array>
+
     <!-- The nominal white coordinates, in CIE1931 XYZ color space, for Display White Balance to
          use in its calculations. AWB will adapt this white point to the target ambient white
          point. The array must include a total of 3 float values (X, Y, Z) -->
@@ -214,12 +228,18 @@
     <!-- Radius of the software rounded corners. -->
     <dimen name="rounded_corner_radius">108px</dimen>
 
+    <!-- Top adjustment for the software rounded corners since corners are not perfectly
+        round. This value is used when retrieving the "radius" of the rounded corner in cases
+        where the exact bezier curve cannot be retrieved. This value will be subtracted from
+        rounded_corner_radius to more accurately provide a "radius" for the rounded corners.-->
+    <dimen name="rounded_corner_radius_adjustment">8px</dimen>
+
     <!-- Height of the status bar in portrait. The height should be
          Max((status bar content height + waterfall top size), top cutout size) -->
     <dimen name="status_bar_height_portrait">145px</dimen>
     <dimen name="status_bar_height_landscape">28dp</dimen>
-    <!-- Height of area above QQS where battery/time go (equal to status bar) -->
-    <dimen name="quick_qs_offset_height">145px</dimen>
+    <!-- Height of area above QQS where battery/time go (48dp to reduce scrolling) -->
+    <dimen name="quick_qs_offset_height">48dp</dimen>
 
     <!-- Not allow to switch to higher refresh rate when display brightness setting is
          equal or less than this value -->
diff --git a/redfin/overlay/frameworks/base/core/res/res/xml/power_profile.xml b/redfin/overlay/frameworks/base/core/res/res/xml/power_profile.xml
index 9d6bae0..41fb085 100644
--- a/redfin/overlay/frameworks/base/core/res/res/xml/power_profile.xml
+++ b/redfin/overlay/frameworks/base/core/res/res/xml/power_profile.xml
@@ -174,7 +174,16 @@
     <item name="wifi.controller.rx">118</item>
     <!-- Tx current for wifi radio in mA-->
     <item name="wifi.controller.tx">331</item>
-    <!-- Operating volatage for wifi radio in mV.-->
+    <!-- Operating voltage for wifi radio in mV.-->
     <item name="wifi.controller.voltage">3700</item>
+
+    <!-- Idle current for bluetooth in mA.-->
+    <item name="bluetooth.controller.idle">0.01</item>
+    <!-- Rx current for bluetooth in mA.-->
+    <item name="bluetooth.controller.rx">9</item>
+    <!-- Tx current for bluetooth in mA-->
+    <item name="bluetooth.controller.tx">7</item>
+    <!-- Operating voltage for bluetooth in mV.-->
+    <item name="bluetooth.controller.voltage">3300</item>
 </device>
 
diff --git a/redfin/overlay/frameworks/base/packages/SystemUI/res/values/config.xml b/redfin/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
index 0e34711..5b105c8 100644
--- a/redfin/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
+++ b/redfin/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
@@ -51,6 +51,12 @@
     <!-- Doze: can we assume the pickup sensor includes a proximity check? -->
     <bool name="doze_pickup_performs_proximity_check">true</bool>
 
+
+    <!-- Doze: only register sensors that use prox when device is in certain Display states. This
+     may delay registering sensors when device first shows dozing UI but the
+     Display & Power state hasn't changed to low-power mode yet. -->
+    <bool name="doze_selectively_register_prox">true</bool>
+
     <!-- Doze: whether the double tap sensor reports 2D touch coordinates -->
     <bool name="doze_double_tap_reports_touch_coordinates">true</bool>
 
@@ -104,4 +110,7 @@
     <string translatable="false" name="config_cameraProtectionExcludedPackages">com.google.android.as</string>
 
     <bool name="config_enableDisplayCutoutProtection">true</bool>
+
+    <!-- Whether global actions should show an informational message about changes in S -->
+    <bool name="global_actions_show_change_info">true</bool>
 </resources>
diff --git a/redfin/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml b/redfin/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
index f5a3f24..bf54bb4 100644
--- a/redfin/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
+++ b/redfin/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
@@ -31,5 +31,18 @@
     <dimen name="config_rounded_mask_size">156px</dimen>
     <dimen name="config_rounded_mask_size_top">156px</dimen>
     <dimen name="config_rounded_mask_size_bottom">156px</dimen>
+
+    <!-- Location on the screen of the center of the physical power button. -->
+    <dimen name="physical_power_button_center_screen_location_y">620px</dimen>
+
+    <!-- Location on the screen of the center of the physical volume up/down buttons. -->
+    <dimen name="physical_volume_up_button_center_screen_location_y">950px</dimen>
+    <dimen name="physical_volume_down_button_center_screen_location_y">1150px</dimen>
+
+    <!-- Location on the screen of the center of the fingerprint sensor. For devices with under
+     display fingerprint sensors, this directly corresponds to the fingerprint sensor's location.
+     For devices with sensors on the back of the device, this corresponds to the location on the
+     screen directly in front of the sensor. -->
+    <dimen name="physical_fingerprint_sensor_center_screen_location_y">620px</dimen>
 </resources>
 
diff --git a/redfin/overlay/packages/apps/Nfc/res/values/config.xml b/redfin/overlay/packages/apps/Nfc/res/values/config.xml
index f26e67f..6bf40a0 100644
--- a/redfin/overlay/packages/apps/Nfc/res/values/config.xml
+++ b/redfin/overlay/packages/apps/Nfc/res/values/config.xml
@@ -20,6 +20,8 @@
   <integer name="unknown_tag_polling_delay">2000</integer>
   <string name="antenna_blocked_alert_link" translatable="false">https://support.google.com/pixelphone?p=nfc_tag_notification</string>
   <string-array name="config_skuSupportsSecureNfc" translatable="false">
+    <item>GD1YQ</item>
+    <item>GTT9Q</item>
     <item>G5NZ6</item>
   </string-array>
 </resources>
diff --git a/self-extractors/extract-lists.txt b/self-extractors/extract-lists.txt
index a08a5b2..85b49b1 100644
--- a/self-extractors/extract-lists.txt
+++ b/self-extractors/extract-lists.txt
@@ -12,18 +12,14 @@
             system_ext/etc/permissions/qcrilhook.xml \
             system_ext/etc/permissions/qti_telephony_hidl_wrapper.xml \
             system_ext/etc/permissions/qti_telephony_utils.xml \
-            system_ext/etc/permissions/telephonyservice.xml \
             system_ext/framework/com.qualcomm.qti.imscmservice-V2.0-java.jar \
             system_ext/framework/com.qualcomm.qti.imscmservice-V2.1-java.jar \
             system_ext/framework/com.qualcomm.qti.imscmservice-V2.2-java.jar \
             system_ext/framework/com.qualcomm.qti.uceservice-V2.0-java.jar \
             system_ext/framework/com.qualcomm.qti.uceservice-V2.1-java.jar \
-            system_ext/framework/ConnectivityExt.jar \
             system_ext/framework/qcrilhook.jar \
             system_ext/framework/qti-telephony-hidl-wrapper.jar \
             system_ext/framework/qti-telephony-utils.jar \
-            system_ext/framework/remotesimlockmanagerlibrary.jar \
-            system_ext/framework/uimremotesimlocklibrary.jar \
             system_ext/framework/vendor.qti.hardware.data.connection-V1.0-java.jar \
             system_ext/framework/vendor.qti.hardware.data.dynamicdds-V1.0-java.jar \
             system_ext/framework/vendor.qti.hardware.data.iwlan-V1.0-java.jar \
diff --git a/self-extractors/qcom/staging/device-partial.mk b/self-extractors/qcom/staging/device-partial.mk
index 4d0b147..7ab7c45 100644
--- a/self-extractors/qcom/staging/device-partial.mk
+++ b/self-extractors/qcom/staging/device-partial.mk
@@ -39,18 +39,14 @@
      vendor/qcom/redfin/proprietary/qcrilhook.xml:system_ext/etc/permissions/qcrilhook.xml \
      vendor/qcom/redfin/proprietary/qti_telephony_hidl_wrapper.xml:system_ext/etc/permissions/qti_telephony_hidl_wrapper.xml \
      vendor/qcom/redfin/proprietary/qti_telephony_utils.xml:system_ext/etc/permissions/qti_telephony_utils.xml \
-     vendor/qcom/redfin/proprietary/telephonyservice.xml:system_ext/etc/permissions/telephonyservice.xml \
      vendor/qcom/redfin/proprietary/com.qualcomm.qti.imscmservice-V2.0-java.jar:system_ext/framework/com.qualcomm.qti.imscmservice-V2.0-java.jar \
      vendor/qcom/redfin/proprietary/com.qualcomm.qti.imscmservice-V2.1-java.jar:system_ext/framework/com.qualcomm.qti.imscmservice-V2.1-java.jar \
      vendor/qcom/redfin/proprietary/com.qualcomm.qti.imscmservice-V2.2-java.jar:system_ext/framework/com.qualcomm.qti.imscmservice-V2.2-java.jar \
      vendor/qcom/redfin/proprietary/com.qualcomm.qti.uceservice-V2.0-java.jar:system_ext/framework/com.qualcomm.qti.uceservice-V2.0-java.jar \
      vendor/qcom/redfin/proprietary/com.qualcomm.qti.uceservice-V2.1-java.jar:system_ext/framework/com.qualcomm.qti.uceservice-V2.1-java.jar \
-     vendor/qcom/redfin/proprietary/ConnectivityExt.jar:system_ext/framework/ConnectivityExt.jar \
      vendor/qcom/redfin/proprietary/qcrilhook.jar:system_ext/framework/qcrilhook.jar \
      vendor/qcom/redfin/proprietary/qti-telephony-hidl-wrapper.jar:system_ext/framework/qti-telephony-hidl-wrapper.jar \
      vendor/qcom/redfin/proprietary/qti-telephony-utils.jar:system_ext/framework/qti-telephony-utils.jar \
-     vendor/qcom/redfin/proprietary/remotesimlockmanagerlibrary.jar:system_ext/framework/remotesimlockmanagerlibrary.jar \
-     vendor/qcom/redfin/proprietary/uimremotesimlocklibrary.jar:system_ext/framework/uimremotesimlocklibrary.jar \
      vendor/qcom/redfin/proprietary/vendor.qti.hardware.data.connection-V1.0-java.jar:system_ext/framework/vendor.qti.hardware.data.connection-V1.0-java.jar \
      vendor/qcom/redfin/proprietary/vendor.qti.hardware.data.dynamicdds-V1.0-java.jar:system_ext/framework/vendor.qti.hardware.data.dynamicdds-V1.0-java.jar \
      vendor/qcom/redfin/proprietary/vendor.qti.hardware.data.iwlan-V1.0-java.jar:system_ext/framework/vendor.qti.hardware.data.iwlan-V1.0-java.jar \
diff --git a/usb/Android.bp b/usb/Android.bp
index 018f2ea..03b0c92 100644
--- a/usb/Android.bp
+++ b/usb/Android.bp
@@ -18,11 +18,11 @@
 }
 
 cc_binary {
-    name: "android.hardware.usb@1.2-service.redfin",
+    name: "android.hardware.usb@1.3-service.redfin",
     relative_install_path: "hw",
-    init_rc: ["android.hardware.usb@1.2-service.redfin.rc"],
+    init_rc: ["android.hardware.usb@1.3-service.redfin.rc"],
     vintf_fragments: [
-        "android.hardware.usb@1.2-service.redfin.xml",
+        "android.hardware.usb@1.3-service.redfin.xml",
         "android.hardware.usb.gadget@1.1-service.redfin.xml",
     ],
     srcs: ["service.cpp", "Usb.cpp", "UsbGadget.cpp"],
@@ -30,6 +30,7 @@
         "android.hardware.usb@1.0",
         "android.hardware.usb@1.1",
         "android.hardware.usb@1.2",
+        "android.hardware.usb@1.3",
         "android.hardware.usb.gadget@1.0",
         "android.hardware.usb.gadget@1.1",
         "libbase",
diff --git a/usb/Usb.cpp b/usb/Usb.cpp
index a727c89..dde01ce 100644
--- a/usb/Usb.cpp
+++ b/usb/Usb.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#define LOG_TAG "android.hardware.usb@1.2-service.redfin"
+#define LOG_TAG "android.hardware.usb@1.3-service.redfin"
 
 #include <android-base/logging.h>
 #include <android-base/properties.h>
@@ -41,9 +41,49 @@
 namespace android {
 namespace hardware {
 namespace usb {
-namespace V1_2 {
+namespace V1_3 {
 namespace implementation {
 
+Return<bool> Usb::enableUsbDataSignal(bool enable) {
+    bool result = true;
+
+    ALOGI("Userspace turn %s USB data signaling", enable ? "on" : "off");
+
+    if (enable) {
+        if (!WriteStringToFile("1", USB_DATA_PATH)) {
+            ALOGE("Not able to turn on usb connection notification");
+            result = false;
+        }
+
+        if (!WriteStringToFile(kGadgetName, PULLUP_PATH)) {
+            ALOGE("Gadget cannot be pulled up");
+            result = false;
+        }
+    } else {
+        if (!WriteStringToFile("1", ID_PATH)) {
+            ALOGE("Not able to turn off host mode");
+            result = false;
+        }
+
+        if (!WriteStringToFile("0", VBUS_PATH)) {
+            ALOGE("Not able to set Vbus state");
+            result = false;
+        }
+
+        if (!WriteStringToFile("0", USB_DATA_PATH)) {
+            ALOGE("Not able to turn on usb connection notification");
+            result = false;
+        }
+
+        if (!WriteStringToFile("none", PULLUP_PATH)) {
+            ALOGE("Gadget cannot be pulled down");
+            result = false;
+        }
+    }
+
+    return result;
+}
+
 // Set by the signal handler to destroy the thread
 volatile bool destroyThread;
 
@@ -52,8 +92,7 @@
 constexpr char kConsole[] = "init.svc.console";
 constexpr char kDisableContatminantDetection[] = "vendor.usb.contaminantdisable";
 
-void queryVersionHelper(android::hardware::usb::V1_2::implementation::Usb *usb,
-                        hidl_vec<PortStatus> *currentPortStatus_1_2);
+void queryVersionHelper(implementation::Usb *usb, hidl_vec<PortStatus> *currentPortStatus_1_2);
 
 int32_t readFile(const std::string &filename, std::string *contents) {
     FILE *fp;
@@ -97,11 +136,16 @@
 Status queryMoistureDetectionStatus(hidl_vec<PortStatus> *currentPortStatus_1_2) {
     std::string enabled, status;
 
+    if (currentPortStatus_1_2 == NULL || currentPortStatus_1_2->size() == 0) {
+        ALOGE("currentPortStatus_1_2 is not available");
+        return Status::ERROR;
+    }
+
     (*currentPortStatus_1_2)[0].supportedContaminantProtectionModes = 0;
     (*currentPortStatus_1_2)[0].supportedContaminantProtectionModes |=
-        ContaminantProtectionMode::FORCE_SINK;
-    (*currentPortStatus_1_2)[0].contaminantProtectionStatus = ContaminantProtectionStatus::NONE;
-    (*currentPortStatus_1_2)[0].contaminantDetectionStatus = ContaminantDetectionStatus::DISABLED;
+        V1_2::ContaminantProtectionMode::FORCE_SINK;
+    (*currentPortStatus_1_2)[0].contaminantProtectionStatus = V1_2::ContaminantProtectionStatus::NONE;
+    (*currentPortStatus_1_2)[0].contaminantDetectionStatus = V1_2::ContaminantDetectionStatus::DISABLED;
     (*currentPortStatus_1_2)[0].supportsEnableContaminantPresenceDetection = true;
     (*currentPortStatus_1_2)[0].supportsEnableContaminantPresenceProtection = false;
 
@@ -117,12 +161,12 @@
         }
         if (status == "1") {
             (*currentPortStatus_1_2)[0].contaminantDetectionStatus =
-                ContaminantDetectionStatus::DETECTED;
+                V1_2::ContaminantDetectionStatus::DETECTED;
             (*currentPortStatus_1_2)[0].contaminantProtectionStatus =
-                ContaminantProtectionStatus::FORCE_SINK;
+                V1_2::ContaminantProtectionStatus::FORCE_SINK;
         } else
             (*currentPortStatus_1_2)[0].contaminantDetectionStatus =
-                ContaminantDetectionStatus::NOT_DETECTED;
+                V1_2::ContaminantDetectionStatus::NOT_DETECTED;
     }
 
      ALOGI("ContaminantDetectionStatus:%d ContaminantProtectionStatus:%d",
@@ -551,8 +595,7 @@
     return Status::ERROR;
 }
 
-void queryVersionHelper(android::hardware::usb::V1_2::implementation::Usb *usb,
-                        hidl_vec<PortStatus> *currentPortStatus_1_2) {
+void queryVersionHelper(implementation::Usb *usb, hidl_vec<PortStatus> *currentPortStatus_1_2) {
     hidl_vec<V1_1::PortStatus_1_1> currentPortStatus_1_1;
     hidl_vec<V1_0::PortStatus> currentPortStatus;
     Status status;
@@ -563,7 +606,8 @@
     if (usb->mCallback_1_0 != NULL) {
         if (callback_V1_2 != NULL) {
             status = getPortStatusHelper(currentPortStatus_1_2, HALVersion::V1_2);
-            queryMoistureDetectionStatus(currentPortStatus_1_2);
+            if (status == Status::SUCCESS)
+                queryMoistureDetectionStatus(currentPortStatus_1_2);
         } else if (callback_V1_1 != NULL) {
             status = getPortStatusHelper(currentPortStatus_1_2, HALVersion::V1_1);
             currentPortStatus_1_1.resize(currentPortStatus_1_2->size());
@@ -602,7 +646,7 @@
 
 struct data {
     int uevent_fd;
-    android::hardware::usb::V1_2::implementation::Usb *usb;
+    android::hardware::usb::V1_3::implementation::Usb *usb;
 };
 
 static void uevent_event(uint32_t /*epevents*/, struct data *payload) {
@@ -675,7 +719,7 @@
     }
 
     payload.uevent_fd = uevent_fd;
-    payload.usb = (android::hardware::usb::V1_2::implementation::Usb *)param;
+    payload.usb = (android::hardware::usb::V1_3::implementation::Usb *)param;
 
     fcntl(uevent_fd, F_SETFL, O_NONBLOCK);
 
@@ -790,7 +834,7 @@
 }
 
 }  // namespace implementation
-}  // namespace V1_2
+}  // namespace V1_3
 }  // namespace usb
 }  // namespace hardware
 }  // namespace android
diff --git a/usb/Usb.h b/usb/Usb.h
index 65be180..5ff110d 100644
--- a/usb/Usb.h
+++ b/usb/Usb.h
@@ -1,10 +1,26 @@
-#ifndef ANDROID_HARDWARE_USB_V1_1_USB_H
-#define ANDROID_HARDWARE_USB_V1_1_USB_H
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
 
-#include <android/hardware/usb/1.2/IUsb.h>
+#include <android-base/file.h>
 #include <android/hardware/usb/1.2/IUsbCallback.h>
 #include <android/hardware/usb/1.2/types.h>
+#include <android/hardware/usb/1.3/IUsb.h>
 #include <hidl/Status.h>
+#include <pixelusb/UsbGadgetCommon.h>
 #include <utils/Log.h>
 
 #define UEVENT_MSG_LEN 2048
@@ -17,10 +33,11 @@
 namespace android {
 namespace hardware {
 namespace usb {
-namespace V1_2 {
+namespace V1_3 {
 namespace implementation {
 
 using ::android::sp;
+using ::android::base::WriteStringToFile;
 using ::android::hardware::hidl_array;
 using ::android::hardware::hidl_memory;
 using ::android::hardware::hidl_string;
@@ -32,21 +49,27 @@
 using ::android::hardware::usb::V1_0::PortRole;
 using ::android::hardware::usb::V1_0::PortRoleType;
 using ::android::hardware::usb::V1_0::Status;
-using ::android::hardware::usb::V1_2::IUsb;
-using ::android::hardware::usb::V1_2::IUsbCallback;
-
 using ::android::hardware::usb::V1_1::PortMode_1_1;
 using ::android::hardware::usb::V1_1::PortStatus_1_1;
 using ::android::hardware::usb::V1_2::PortStatus;
+using ::android::hardware::usb::V1_2::IUsbCallback;
+using ::android::hardware::usb::V1_3::IUsb;
 using ::android::hidl::base::V1_0::DebugInfo;
 using ::android::hidl::base::V1_0::IBase;
 
 enum class HALVersion{
     V1_0,
     V1_1,
-    V1_2
+    V1_2,
+    V1_3
 };
 
+constexpr char kGadgetName[] = "a600000.dwc3";
+#define SOC_PATH "/sys/devices/platform/soc/a600000.ssusb/"
+#define ID_PATH SOC_PATH "id"
+#define VBUS_PATH SOC_PATH "b_sess"
+#define USB_DATA_PATH SOC_PATH "usb_data_enabled"
+
 struct Usb : public IUsb {
     Usb();
 
@@ -55,6 +78,7 @@
     Return<void> queryPortStatus() override;
     Return<void> enableContaminantPresenceDetection(const hidl_string& portName, bool enable);
     Return<void> enableContaminantPresenceProtection(const hidl_string& portName, bool enable);
+    Return<bool> enableUsbDataSignal(bool enable) override;
 
     sp<V1_0::IUsbCallback> mCallback_1_0;
     // Protects mCallback variable
@@ -73,9 +97,7 @@
 };
 
 }  // namespace implementation
-}  // namespace V1_2
+}  // namespace V1_3
 }  // namespace usb
 }  // namespace hardware
 }  // namespace android
-
-#endif  // ANDROID_HARDWARE_USB_V1_2_USB_H
diff --git a/usb/android.hardware.usb@1.2-service.redfin.rc b/usb/android.hardware.usb@1.2-service.redfin.rc
deleted file mode 100644
index 5e5077f..0000000
--- a/usb/android.hardware.usb@1.2-service.redfin.rc
+++ /dev/null
@@ -1,18 +0,0 @@
-service vendor.usb-hal-1-2 /vendor/bin/hw/android.hardware.usb@1.2-service.redfin
-    class hal
-    user system
-    group system shell mtp
-
-service init-gadgethal-sh /vendor/bin/init.gadgethal.sh
-    class hal
-    user root
-    disabled
-    oneshot
-
-on boot
-    chown root system /sys/class/typec/port0/power_role
-    chown root system /sys/class/typec/port0/data_role
-    chown root system /sys/class/typec/port0/port_type
-    chmod 664 /sys/class/typec/port0/power_role
-    chmod 664 /sys/class/typec/port0/data_role
-    chmod 664 /sys/class/typec/port0/port_type
diff --git a/usb/android.hardware.usb@1.3-service.redfin.rc b/usb/android.hardware.usb@1.3-service.redfin.rc
new file mode 100644
index 0000000..fffa93a
--- /dev/null
+++ b/usb/android.hardware.usb@1.3-service.redfin.rc
@@ -0,0 +1,26 @@
+service vendor.usb-hal-1-3 /vendor/bin/hw/android.hardware.usb@1.3-service.redfin
+    class hal
+    user system
+    group system shell mtp
+
+service init-gadgethal-sh /vendor/bin/init.gadgethal.sh
+    class hal
+    user root
+    disabled
+    oneshot
+
+on boot
+    chown root system /sys/class/typec/port0/power_role
+    chown root system /sys/class/typec/port0/data_role
+    chown root system /sys/class/typec/port0/port_type
+    chmod 664 /sys/class/typec/port0/power_role
+    chmod 664 /sys/class/typec/port0/data_role
+    chmod 664 /sys/class/typec/port0/port_type
+
+on post-fs
+    chown root system /sys/devices/platform/soc/a600000.ssusb/id
+    chown root system /sys/devices/platform/soc/a600000.ssusb/b_sess
+    chown root system /sys/devices/platform/soc/a600000.ssusb/usb_data_enabled
+    chmod 664 /sys/devices/platform/soc/a600000.ssusb/id
+    chmod 664 /sys/devices/platform/soc/a600000.ssusb/b_sess
+    chmod 664 /sys/devices/platform/soc/a600000.ssusb/usb_data_enabled
diff --git a/usb/android.hardware.usb@1.2-service.redfin.xml b/usb/android.hardware.usb@1.3-service.redfin.xml
similarity index 89%
rename from usb/android.hardware.usb@1.2-service.redfin.xml
rename to usb/android.hardware.usb@1.3-service.redfin.xml
index 25ecf65..cd54268 100644
--- a/usb/android.hardware.usb@1.2-service.redfin.xml
+++ b/usb/android.hardware.usb@1.3-service.redfin.xml
@@ -2,7 +2,7 @@
     <hal format="hidl">
         <name>android.hardware.usb</name>
         <transport>hwbinder</transport>
-        <version>1.2</version>
+        <version>1.3</version>
         <interface>
             <name>IUsb</name>
             <instance>default</instance>
diff --git a/usb/service.cpp b/usb/service.cpp
index 33ffe74..570beef 100644
--- a/usb/service.cpp
+++ b/usb/service.cpp
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#define LOG_TAG "android.hardware.usb@1.2-service.redfin"
+#define LOG_TAG "android.hardware.usb@1.3-service.redfin"
 
 #include <hidl/HidlTransportSupport.h>
 #include "Usb.h"
@@ -29,8 +29,8 @@
 // Generated HIDL files
 using android::hardware::usb::gadget::V1_1::IUsbGadget;
 using android::hardware::usb::gadget::V1_1::implementation::UsbGadget;
-using android::hardware::usb::V1_2::IUsb;
-using android::hardware::usb::V1_2::implementation::Usb;
+using android::hardware::usb::V1_3::IUsb;
+using android::hardware::usb::V1_3::implementation::Usb;
 
 using android::OK;
 using android::status_t;
diff --git a/vf/Android.bp b/vf/Android.bp
new file mode 100644
index 0000000..c8b5215
--- /dev/null
+++ b/vf/Android.bp
@@ -0,0 +1,21 @@
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+vintf_compatibility_matrix {
+    name: "redfin_product_compatibility_matrix.R.5.xml",
+    stem: "compatibility_matrix.redfin.R.5.xml",
+    product_specific: true,
+    srcs: [
+        "device_framework_matrix_product.R.5.xml",
+    ],
+}
+
+vintf_compatibility_matrix {
+    name: "redfin_product_compatibility_matrix.S.5.xml",
+    stem: "compatibility_matrix.redfin.S.5.xml",
+    product_specific: true,
+    srcs: [
+        "device_framework_matrix_product.S.5.xml",
+    ],
+}
diff --git a/vf/OWNERS b/vf/OWNERS
new file mode 100644
index 0000000..d3c5d2d
--- /dev/null
+++ b/vf/OWNERS
@@ -0,0 +1,6 @@
+# Treble team for Vendor Freeze
+bpeckham@google.com
+chrisgross@google.com
+danielnorman@google.com
+inseob@google.com
+justinyun@google.com
diff --git a/vf/aosp_redfin_vf.mk b/vf/aosp_redfin_vf.mk
new file mode 100644
index 0000000..bcaea71
--- /dev/null
+++ b/vf/aosp_redfin_vf.mk
@@ -0,0 +1,41 @@
+#
+# Copyright 2020 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Makefile for the system-only partial build of aosp_redfin.
+# Used for creating a merged Vendor Freeze device.
+
+PRODUCT_VENDOR_FREEZE_SYSTEM_BUILD := true
+
+# Include VNDK v30, needed by the Android 11 vendor half.
+PRODUCT_EXTRA_VNDK_VERSIONS = 30
+
+# Include a product compatibility matrix file that includes older HALs provided
+# by the Android 11 vendor half. This is needed because check_vintf fails for
+# any "unused" HALs in the device manifest that aren't found in the framework
+# compatibility matrix.
+PRODUCT_PACKAGES += redfin_product_compatibility_matrix.R.5.xml
+
+# Disable building certain non-system partitions in this build.
+PRODUCT_BUILD_BOOT_IMAGE := false
+PRODUCT_BUILD_RAMDISK_IMAGE := false
+PRODUCT_BUILD_RECOVERY_IMAGE := false
+PRODUCT_BUILD_VBMETA_IMAGE := false
+PRODUCT_BUILD_VENDOR_IMAGE := false
+PRODUCT_BUILD_VENDOR_BOOT_IMAGE := false
+
+$(call inherit-product, device/google/redfin/aosp_redfin.mk)
+
+PRODUCT_NAME := aosp_redfin_vf
diff --git a/vf/device_framework_matrix_product.R.5.xml b/vf/device_framework_matrix_product.R.5.xml
new file mode 100644
index 0000000..a3ad2be
--- /dev/null
+++ b/vf/device_framework_matrix_product.R.5.xml
@@ -0,0 +1,344 @@
+<compatibility-matrix version="1.0" type="framework" level="5">
+    <hal format="hidl" optional="false">
+       <name>com.qualcomm.qti.imscmservice</name>
+       <version>2.2</version>
+       <interface>
+         <name>IImsCmService</name>
+         <instance>qti.ims.connectionmanagerservice</instance>
+       </interface>
+   </hal>
+    <hal format="hidl" optional="false">
+        <name>com.qualcomm.qti.uceservice</name>
+        <version>2.2</version>
+        <interface>
+            <name>IUceService</name>
+            <instance>com.qualcomm.qti.uceservice</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.ims.factory</name>
+        <version>1.0</version>
+        <interface>
+            <name>IImsFactory</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.data.factory</name>
+        <version>2.1</version>
+        <interface>
+            <name>IFactory</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <!-- iwlan -->
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.data.iwlan</name>
+        <version>1.0</version>
+        <interface>
+            <name>IIWlan</name>
+            <instance>slot1</instance>
+            <instance>slot2</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>android.hardware.media.c2</name>
+        <version>1.0</version>
+        <interface>
+            <name>IComponentStore</name>
+            <instance>default</instance>
+            <instance>software</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>android.hardware.radio</name>
+        <version>1.2</version>
+        <interface>
+            <name>ISap</name>
+            <instance>slot2</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>android.hardware.radio.config</name>
+        <version>1.1</version>
+        <interface>
+            <name>IRadioConfig</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.display.color</name>
+        <version>1.0-5</version>
+        <interface>
+             <name>IDisplayColor</name>
+             <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.display.config</name>
+        <version>2.0</version>
+        <interface>
+            <name>IDisplayConfig</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.display.postproc</name>
+        <version>1.0</version>
+        <interface>
+             <name>IDisplayPostproc</name>
+             <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.google.google_battery</name>
+        <version>1.1</version>
+        <interface>
+            <name>IGoogleBattery</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.google.radioext</name>
+        <version>1.2-3</version>
+        <interface>
+            <name>IRadioExt</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.am</name>
+        <version>1.0</version>
+        <interface>
+            <name>IQcRilAudio</name>
+            <instance>slot1</instance>
+            <instance>slot2</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.ims</name>
+        <version>1.6</version>
+        <interface>
+            <name>IImsRadio</name>
+            <instance>imsradio0</instance>
+            <instance>imsradio1</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.lpa</name>
+        <version>1.0</version>
+        <interface>
+            <name>IUimLpa</name>
+            <instance>UimLpa0</instance>
+            <instance>UimLpa1</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.qcrilhook</name>
+        <version>1.0</version>
+        <interface>
+            <name>IQtiOemHook</name>
+            <instance>oemhook0</instance>
+            <instance>oemhook1</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.uim</name>
+        <version>1.2</version>
+        <interface>
+            <name>IUim</name>
+            <instance>Uim0</instance>
+            <instance>Uim1</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.uim_remote_client</name>
+        <version>1.0</version>
+        <interface>
+            <name>IUimRemoteServiceClient</name>
+            <instance>uimRemoteClient0</instance>
+            <instance>uimRemoteClient1</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.uim_remote_server</name>
+        <version>1.0</version>
+        <interface>
+            <name>IUimRemoteServiceServer</name>
+            <instance>uimRemoteServer0</instance>
+            <instance>uimRemoteServer1</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.tui_comm</name>
+        <version>1.0</version>
+        <interface>
+            <name>ITuiComm</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.display.allocator</name>
+        <version>1.0</version>
+        <version>3.0</version>
+        <version>4.0</version>
+        <interface>
+            <name>IQtiAllocator</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.display.mapper</name>
+        <version>2.0</version>
+        <version>3.0</version>
+        <version>4.0</version>
+        <interface>
+            <name>IQtiMapper</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.display.composer</name>
+        <version>3.0</version>
+        <interface>
+            <name>IQtiComposer</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.internal.deviceinfo</name>
+        <version>1.0</version>
+        <interface>
+            <name>IDeviceInfo</name>
+            <instance>deviceinfo</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.imsrtpservice</name>
+        <version>3.0</version>
+        <interface>
+            <name>IRTPService</name>
+            <instance>imsrtpservice</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.ims.callinfo</name>
+        <version>1.0</version>
+        <interface>
+            <name>IService</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.google.wifi_ext</name>
+        <version>1.1</version>
+        <interface>
+            <name>IWifiExt</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.cacert</name>
+        <version>1.0</version>
+        <interface>
+            <name>IService</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.data.connection</name>
+        <version>1.1</version>
+        <interface>
+            <name>IDataConnection</name>
+            <instance>slot1</instance>
+            <instance>slot2</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.qtiradio</name>
+        <version>1.0</version>
+        <interface>
+            <name>IQtiRadio</name>
+            <instance>slot1</instance>
+            <instance>slot2</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.qtiradio</name>
+        <version>2.4</version>
+        <interface>
+            <name>IQtiRadio</name>
+            <instance>slot1</instance>
+            <instance>slot2</instance>
+        </interface>
+    </hal>
+    <!-- QSEECom HAL service -->
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.qseecom</name>
+        <version>1.0</version>
+        <interface>
+            <name>IQSEECom</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <!-- QSPM HAL service -->
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.qspmhal</name>
+        <version>1.0</version>
+        <interface>
+            <name>IQspmhal</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.qteeconnector</name>
+        <version>1.0</version>
+        <interface>
+            <name>IAppConnector</name>
+            <instance>default</instance>
+        </interface>
+        <interface>
+            <name>IGPAppConnector</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="aidl" optional="false">
+         <name>com.google.hardware.pixel.display</name>
+         <interface>
+             <name>IDisplay</name>
+             <instance>default</instance>
+         </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.google.radioext</name>
+        <version>1.2</version>
+        <interface>
+            <name>IRadioExt</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.bt_channel_avoidance</name>
+        <version>1.0</version>
+        <interface>
+            <name>IBTChannelAvoidance</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.bluetooth_sar</name>
+        <version>1.1</version>
+        <interface>
+            <name>IBluetoothSar</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.google.wireless_charger</name>
+        <version>1.2</version>
+        <interface>
+            <name>IWirelessCharger</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+</compatibility-matrix>
diff --git a/vf/device_framework_matrix_product.S.5.xml b/vf/device_framework_matrix_product.S.5.xml
new file mode 100644
index 0000000..6d1e32e
--- /dev/null
+++ b/vf/device_framework_matrix_product.S.5.xml
@@ -0,0 +1,345 @@
+<compatibility-matrix version="1.0" type="framework" level="5">
+   <hal format="hidl" optional="false">
+       <name>com.qualcomm.qti.imscmservice</name>
+       <version>2.2</version>
+       <interface>
+         <name>IImsCmService</name>
+         <instance>qti.ims.connectionmanagerservice</instance>
+       </interface>
+   </hal>
+    <hal format="hidl" optional="false">
+        <name>com.qualcomm.qti.uceservice</name>
+        <version>2.2</version>
+        <interface>
+            <name>IUceService</name>
+            <instance>com.qualcomm.qti.uceservice</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.ims.factory</name>
+        <version>1.0</version>
+        <interface>
+            <name>IImsFactory</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.data.factory</name>
+        <version>2.1</version>
+        <interface>
+            <name>IFactory</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <!-- iwlan -->
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.data.iwlan</name>
+        <version>1.0</version>
+        <interface>
+            <name>IIWlan</name>
+            <instance>slot1</instance>
+            <instance>slot2</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>android.hardware.media.c2</name>
+        <version>1.0</version>
+        <interface>
+            <name>IComponentStore</name>
+            <instance>default</instance>
+            <instance>software</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>android.hardware.radio</name>
+        <version>1.2</version>
+        <interface>
+            <name>ISap</name>
+            <instance>slot2</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>android.hardware.radio.config</name>
+        <version>1.1</version>
+        <interface>
+            <name>IRadioConfig</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.display.color</name>
+        <version>1.0-5</version>
+        <interface>
+             <name>IDisplayColor</name>
+             <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.display.config</name>
+        <version>2.0</version>
+        <interface>
+            <name>IDisplayConfig</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.display.postproc</name>
+        <version>1.0</version>
+        <interface>
+             <name>IDisplayPostproc</name>
+             <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.google.google_battery</name>
+        <version>1.1</version>
+        <interface>
+            <name>IGoogleBattery</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.google.radioext</name>
+        <version>1.2-3</version>
+        <interface>
+            <name>IRadioExt</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.am</name>
+        <version>1.0</version>
+        <interface>
+            <name>IQcRilAudio</name>
+            <instance>slot1</instance>
+            <instance>slot2</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.ims</name>
+        <version>1.6</version>
+        <interface>
+            <name>IImsRadio</name>
+            <instance>imsradio0</instance>
+            <instance>imsradio1</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.lpa</name>
+        <version>1.0</version>
+        <interface>
+            <name>IUimLpa</name>
+            <instance>UimLpa0</instance>
+            <instance>UimLpa1</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.qcrilhook</name>
+        <version>1.0</version>
+        <interface>
+            <name>IQtiOemHook</name>
+            <instance>oemhook0</instance>
+            <instance>oemhook1</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.uim</name>
+        <version>1.2</version>
+        <interface>
+            <name>IUim</name>
+            <instance>Uim0</instance>
+            <instance>Uim1</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.uim_remote_client</name>
+        <version>1.0</version>
+        <interface>
+            <name>IUimRemoteServiceClient</name>
+            <instance>uimRemoteClient0</instance>
+            <instance>uimRemoteClient1</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.uim_remote_server</name>
+        <version>1.0</version>
+        <interface>
+            <name>IUimRemoteServiceServer</name>
+            <instance>uimRemoteServer0</instance>
+            <instance>uimRemoteServer1</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.tui_comm</name>
+        <version>1.0</version>
+        <interface>
+            <name>ITuiComm</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.display.allocator</name>
+        <version>1.0</version>
+        <version>3.0</version>
+        <version>4.0</version>
+        <interface>
+            <name>IQtiAllocator</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.display.mapper</name>
+        <version>2.0</version>
+        <version>3.0</version>
+        <version>4.0</version>
+        <interface>
+            <name>IQtiMapper</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.display.composer</name>
+        <version>3.0</version>
+        <interface>
+            <name>IQtiComposer</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.internal.deviceinfo</name>
+        <version>1.0</version>
+        <interface>
+            <name>IDeviceInfo</name>
+            <instance>deviceinfo</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.imsrtpservice</name>
+        <version>3.0</version>
+        <interface>
+            <name>IRTPService</name>
+            <instance>imsrtpservice</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.ims.callinfo</name>
+        <version>1.0</version>
+        <interface>
+            <name>IService</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>hardware.google.bluetooth.sar</name>
+        <version>1.0</version>
+        <interface>
+            <name>IBluetoothSar</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>hardware.google.bluetooth.bt_channel_avoidance</name>
+        <version>1.0</version>
+        <interface>
+            <name>IBTChannelAvoidance</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.google.wifi_ext</name>
+        <version>1.2</version>
+        <interface>
+            <name>IWifiExt</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.cacert</name>
+        <version>1.0</version>
+        <interface>
+            <name>IService</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.data.connection</name>
+        <version>1.1</version>
+        <interface>
+            <name>IDataConnection</name>
+            <instance>slot1</instance>
+            <instance>slot2</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.qtiradio</name>
+        <version>1.0</version>
+        <interface>
+            <name>IQtiRadio</name>
+            <instance>slot1</instance>
+            <instance>slot2</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.radio.qtiradio</name>
+        <version>2.4</version>
+        <interface>
+            <name>IQtiRadio</name>
+            <instance>slot1</instance>
+            <instance>slot2</instance>
+        </interface>
+    </hal>
+    <!-- QSEECom HAL service -->
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.qseecom</name>
+        <version>1.0</version>
+        <interface>
+            <name>IQSEECom</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <!-- QSPM HAL service -->
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.qspmhal</name>
+        <version>1.0</version>
+        <interface>
+            <name>IQspmhal</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.qteeconnector</name>
+        <version>1.0</version>
+        <interface>
+            <name>IAppConnector</name>
+            <instance>default</instance>
+        </interface>
+        <interface>
+            <name>IGPAppConnector</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+    <hal format="aidl" optional="false">
+         <name>com.google.hardware.pixel.display</name>
+         <interface>
+             <name>IDisplay</name>
+             <instance>default</instance>
+         </interface>
+    </hal>
+    <!-- DSP Service -->
+    <hal format="hidl" optional="false">
+        <name>vendor.qti.hardware.dsp</name>
+        <version>1.0</version>
+        <interface>
+            <name>IDspService</name>
+            <instance>dspservice</instance>
+        </interface>
+    </hal>
+    <hal format="hidl" optional="false">
+        <name>vendor.google.wireless_charger</name>
+        <version>1.3</version>
+        <interface>
+            <name>IWirelessCharger</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+</compatibility-matrix>
diff --git a/vf/framework_item_list.txt b/vf/framework_item_list.txt
new file mode 100644
index 0000000..6621c49
--- /dev/null
+++ b/vf/framework_item_list.txt
@@ -0,0 +1,22 @@
+IMAGES/product.img
+IMAGES/product.map
+IMAGES/system_ext.img
+IMAGES/system_ext.map
+IMAGES/system.img
+IMAGES/system.map
+IMAGES/system_other.img
+IMAGES/userdata.img
+META/apexkeys.txt
+META/apkcerts.txt
+META/filesystem_config.txt
+META/postinstall_config.txt
+META/product_filesystem_config.txt
+META/root_filesystem_config.txt
+META/system_ext_filesystem_config.txt
+META/system_other_filesystem_config.txt
+META/update_engine_config.txt
+PRODUCT/*
+ROOT/*
+SYSTEM/*
+SYSTEM_EXT/*
+SYSTEM_OTHER/*
diff --git a/vf/framework_misc_info_keys.txt b/vf/framework_misc_info_keys.txt
new file mode 100644
index 0000000..00496da
--- /dev/null
+++ b/vf/framework_misc_info_keys.txt
@@ -0,0 +1,22 @@
+ab_update
+avb_product_add_hashtree_footer_args
+avb_product_hashtree_enable
+avb_system_add_hashtree_footer_args
+avb_system_ext_add_hashtree_footer_args
+avb_system_ext_hashtree_enable
+avb_system_hashtree_enable
+avb_system_other_add_hashtree_footer_args
+avb_system_other_hashtree_enable
+avb_vbmeta_system
+avb_vbmeta_system_algorithm
+avb_vbmeta_system_args
+avb_vbmeta_system_key_path
+avb_vbmeta_system_rollback_index_location
+building_product_image
+building_system_ext_image
+building_system_image
+building_system_other_image
+default_system_dev_certificate
+product_fs_type
+root_dir
+system_ext_fs_type
diff --git a/vf/vendor_item_list.txt b/vf/vendor_item_list.txt
new file mode 100644
index 0000000..a86378c
--- /dev/null
+++ b/vf/vendor_item_list.txt
@@ -0,0 +1,21 @@
+BOOT/*
+DATA/*
+IMAGES/boot.img
+IMAGES/dtbo.img
+IMAGES/vendor_boot.img
+IMAGES/vendor.img
+IMAGES/vendor.map
+META/boot_filesystem_config.txt
+META/care_map.pb
+META/kernel_configs.txt
+META/kernel_version.txt
+META/otakeys.txt
+META/releasetools.py
+META/vendor_boot_filesystem_config.txt
+META/vendor_filesystem_config.txt
+ODM/*
+OTA/android-info.txt
+PREBUILT_IMAGES/*
+RADIO/*
+VENDOR/*
+VENDOR_BOOT/*
diff --git a/vibrator/drv2624/Vibrator.cpp b/vibrator/drv2624/Vibrator.cpp
index 744f16e..ba2d0eb 100644
--- a/vibrator/drv2624/Vibrator.cpp
+++ b/vibrator/drv2624/Vibrator.cpp
@@ -451,6 +451,7 @@
     if (mHwApi->hasRtpInput()) {
         ret |= IVibrator::CAP_AMPLITUDE_CONTROL;
     }
+    ret |= IVibrator::CAP_GET_RESONANT_FREQUENCY;
     *_aidl_return = ret;
     return ndk::ScopedAStatus::ok();
 }
@@ -709,6 +710,53 @@
     return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
 }
 
+static float freqPeriodFormulaFloat(std::uint32_t in) {
+    return static_cast<float>(1000000000) / static_cast<float>(24615 * in);
+}
+
+ndk::ScopedAStatus Vibrator::getResonantFrequency(float *resonantFreqHz) {
+    uint32_t lraPeriod;
+    if(!mHwCal->getLraPeriod(&lraPeriod)) {
+        ALOGE("Failed to get resonant frequency (%d): %s", errno, strerror(errno));
+        return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
+    }
+    *resonantFreqHz = freqPeriodFormulaFloat(lraPeriod);
+    return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus Vibrator::getQFactor(float * /*qFactor*/) {
+    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+}
+
+ndk::ScopedAStatus Vibrator::getFrequencyResolution(float * /*freqResolutionHz*/) {
+    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+}
+
+ndk::ScopedAStatus Vibrator::getFrequencyMinimum(float * /*freqMinimumHz*/) {
+    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+}
+
+ndk::ScopedAStatus Vibrator::getBandwidthAmplitudeMap(std::vector<float> * /*_aidl_return*/) {
+    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+}
+
+ndk::ScopedAStatus Vibrator::getPwlePrimitiveDurationMax(int32_t * /*durationMs*/) {
+    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+}
+
+ndk::ScopedAStatus Vibrator::getPwleCompositionSizeMax(int32_t * /*maxSize*/) {
+    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+}
+
+ndk::ScopedAStatus Vibrator::getSupportedBraking(std::vector<Braking> * /*supported*/) {
+    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+}
+
+ndk::ScopedAStatus Vibrator::composePwle(const std::vector<PrimitivePwle> & /*composite*/,
+                                         const std::shared_ptr<IVibratorCallback> & /*callback*/) {
+    return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+}
+
 }  // namespace vibrator
 }  // namespace hardware
 }  // namespace android
diff --git a/vibrator/drv2624/Vibrator.h b/vibrator/drv2624/Vibrator.h
index 7a93872..298fc07 100644
--- a/vibrator/drv2624/Vibrator.h
+++ b/vibrator/drv2624/Vibrator.h
@@ -179,6 +179,16 @@
     ndk::ScopedAStatus getSupportedAlwaysOnEffects(std::vector<Effect> *_aidl_return) override;
     ndk::ScopedAStatus alwaysOnEnable(int32_t id, Effect effect, EffectStrength strength) override;
     ndk::ScopedAStatus alwaysOnDisable(int32_t id) override;
+    ndk::ScopedAStatus getResonantFrequency(float *resonantFreqHz) override;
+    ndk::ScopedAStatus getQFactor(float *qFactor) override;
+    ndk::ScopedAStatus getFrequencyResolution(float *freqResolutionHz) override;
+    ndk::ScopedAStatus getFrequencyMinimum(float *freqMinimumHz) override;
+    ndk::ScopedAStatus getBandwidthAmplitudeMap(std::vector<float> *_aidl_return) override;
+    ndk::ScopedAStatus getPwlePrimitiveDurationMax(int32_t *durationMs) override;
+    ndk::ScopedAStatus getPwleCompositionSizeMax(int32_t *maxSize) override;
+    ndk::ScopedAStatus getSupportedBraking(std::vector<Braking> *supported) override;
+    ndk::ScopedAStatus composePwle(const std::vector<PrimitivePwle> &composite,
+                                   const std::shared_ptr<IVibratorCallback> &callback) override;
 
     binder_status_t dump(int fd, const char **args, uint32_t numArgs) override;
 
diff --git a/vibrator/drv2624/android.hardware.vibrator-service.redfin.xml b/vibrator/drv2624/android.hardware.vibrator-service.redfin.xml
index 49b11ec..4db8f8c 100644
--- a/vibrator/drv2624/android.hardware.vibrator-service.redfin.xml
+++ b/vibrator/drv2624/android.hardware.vibrator-service.redfin.xml
@@ -1,6 +1,7 @@
 <manifest version="1.0" type="device">
     <hal format="aidl">
         <name>android.hardware.vibrator</name>
+        <version>2</version>
         <fqname>IVibrator/default</fqname>
     </hal>
 </manifest>