Add mic privacy chip animation.

Only includes the view animation change without mic blocked
functionality.

Bug: 180132982
Test: Manual & atest -c PrivacyChipViewControllerTest
Change-Id: I40d4e61bcc02142325f3aaaa51c70b279fca469c
diff --git a/res/drawable/ic_mic_black.xml b/res/drawable/ic_mic_black.xml
new file mode 100644
index 0000000..8748d70
--- /dev/null
+++ b/res/drawable/ic_mic_black.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="@dimen/system_bar_icon_drawing_size"
+        android:height="@dimen/system_bar_icon_drawing_size"
+        android:viewportWidth="44"
+        android:viewportHeight="44">
+    <path
+        android:pathData="M22 25.6666667C25.0433333 25.6666667 27.4816667 23.21 27.4816667 20.1666667L27.5 9.16666667C27.5 6.12333333 25.0433333 3.66666667 22 3.66666667C18.9566667 3.66666667 16.5 6.12333333 16.5 9.16666667L16.5 20.1666667C16.5 23.21 18.9566667 25.6666667 22 25.6666667ZM31.7166667 20.1666667C31.7166667 25.6666667 27.06 29.5166667 22 29.5166667C16.94 29.5166667 12.2833333 25.6666667 12.2833333 20.1666667L9.16666667 20.1666667C9.16666667 26.4183333 14.1533333 31.5883333 20.1666667 32.4866667L20.1666667 38.5L23.8333333 38.5L23.8333333 32.4866667C29.8466667 31.6066667 34.8333333 26.4366667 34.8333333 20.1666667L31.7166667 20.1666667Z"
+        android:fillColor="@color/mic_privacy_chip_dark_icon_color" />
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_mic_off_white.xml b/res/drawable/ic_mic_off_white.xml
new file mode 100644
index 0000000..3b56be1
--- /dev/null
+++ b/res/drawable/ic_mic_off_white.xml
@@ -0,0 +1,25 @@
+<!--
+  ~ 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.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"
+        android:width="@dimen/system_bar_icon_drawing_size"
+        android:height="@dimen/system_bar_icon_drawing_size"
+        android:viewportWidth="44"
+        android:viewportHeight="44">
+    <path
+        android:pathData="M19 11h-1.7c0 0.74 -0.16 1.43 -0.43 2.05l1.23 1.23c0.56 -0.98 0.9 -2.09 0.9 -3.28zm-4.02 0.17c0 -0.06 0.02 -0.11 0.02 -0.17V5c0 -1.66 -1.34 -3 -3 -3S9 3.34 9 5v0.18l5.98 5.99zM4.27 3L3 4.27l6.01 6.01V11c0 1.66 1.33 3 2.99 3 0.22 0 0.44 -0.03 0.65 -0.08l1.66 1.66c-0.71 0.33 -1.5 0.52 -2.31 0.52 -2.76 0 -5.3 -2.1 -5.3 -5.1H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c0.91 -0.13 1.77 -0.45 2.54 -0.9L19.73 21 21 19.73 4.27 3z"
+        android:fillColor="@color/car_nav_icon_fill_color_selected" />
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_mic_white.xml b/res/drawable/ic_mic_white.xml
index 71fcc53..24652fa 100644
--- a/res/drawable/ic_mic_white.xml
+++ b/res/drawable/ic_mic_white.xml
@@ -21,5 +21,5 @@
         android:viewportHeight="44">
 <path
         android:pathData="M22 25.6666667C25.0433333 25.6666667 27.4816667 23.21 27.4816667 20.1666667L27.5 9.16666667C27.5 6.12333333 25.0433333 3.66666667 22 3.66666667C18.9566667 3.66666667 16.5 6.12333333 16.5 9.16666667L16.5 20.1666667C16.5 23.21 18.9566667 25.6666667 22 25.6666667ZM31.7166667 20.1666667C31.7166667 25.6666667 27.06 29.5166667 22 29.5166667C16.94 29.5166667 12.2833333 25.6666667 12.2833333 20.1666667L9.16666667 20.1666667C9.16666667 26.4183333 14.1533333 31.5883333 20.1666667 32.4866667L20.1666667 38.5L23.8333333 38.5L23.8333333 32.4866667C29.8466667 31.6066667 34.8333333 26.4366667 34.8333333 20.1666667L31.7166667 20.1666667Z"
-        android:fillColor="@color/car_nav_icon_fill_color" />
+        android:fillColor="@color/car_nav_icon_fill_color_selected" />
 </vector>
\ No newline at end of file
diff --git a/res/drawable/mic_privacy_chip_background_pill.xml b/res/drawable/mic_privacy_chip_background_pill.xml
new file mode 100644
index 0000000..028aa3d
--- /dev/null
+++ b/res/drawable/mic_privacy_chip_background_pill.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  ~ 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.
+  -->
+<layer-list
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt">
+    <item>
+        <aapt:attr name="android:drawable">
+            <shape android:shape="rectangle">
+                <solid android:color="@color/mic_privacy_chip_indicator_color"/>
+                <corners android:radius="@dimen/system_bar_pill_radius"/>
+            </shape>
+        </aapt:attr>
+    </item>
+    <item>
+        <aapt:attr name="android:drawable">
+            <ripple android:color="?android:attr/colorControlHighlight"/>
+        </aapt:attr>
+    </item>
+</layer-list>
diff --git a/res/drawable/system_bar_background_pill.xml b/res/drawable/system_bar_background_pill.xml
index 51d2b9d..f765719 100644
--- a/res/drawable/system_bar_background_pill.xml
+++ b/res/drawable/system_bar_background_pill.xml
@@ -21,7 +21,7 @@
         <aapt:attr name="android:drawable">
             <shape android:shape="rectangle">
                 <solid android:color="@color/system_bar_background_pill_color"/>
-                <corners android:radius="30dp"/>
+                <corners android:radius="@dimen/system_bar_pill_radius"/>
             </shape>
         </aapt:attr>
     </item>
diff --git a/res/layout/car_top_system_bar.xml b/res/layout/car_top_system_bar.xml
index 9be01af..65cca26 100644
--- a/res/layout/car_top_system_bar.xml
+++ b/res/layout/car_top_system_bar.xml
@@ -30,16 +30,6 @@
         android:layout_weight="1"
         android:layoutDirection="ltr">
 
-        <include layout="@layout/ongoing_privacy_chip"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_alignParentStart="true"
-            android:layout_centerVertical="true"
-            android:layout_marginStart="@dimen/car_padding_2"
-            android:layout_marginEnd="@dimen/car_padding_2"
-            android:layout_marginTop="@dimen/car_padding_2"
-            android:gravity="center_vertical"/>
-
         <FrameLayout
             android:id="@+id/system_icon_area"
             android:layout_width="wrap_content"
@@ -47,7 +37,7 @@
             android:layout_marginTop="@dimen/car_padding_2"
             android:layout_marginStart="@dimen/car_padding_2"
             android:layout_centerVertical="true"
-            android:layout_toRightOf="@id/privacy_chip"
+            android:layout_alignParentStart="true"
             android:gravity="center_vertical"
         >
             <com.android.systemui.car.systembar.CarSystemBarButton
@@ -95,6 +85,13 @@
             />
         </FrameLayout>
 
+        <include layout="@layout/mic_privacy_chip"
+            android:layout_width="@dimen/privacy_chip_width"
+            android:layout_height="match_parent"
+            android:layout_centerVertical="true"
+            android:layout_toRightOf="@id/clock_container"
+            android:layout_toLeftOf="@id/user_name_container" />
+
         <FrameLayout
             android:id="@+id/user_name_container"
             android:layout_width="wrap_content"
diff --git a/res/layout/car_top_system_bar_unprovisioned.xml b/res/layout/car_top_system_bar_unprovisioned.xml
index ababca0..3e7a209 100644
--- a/res/layout/car_top_system_bar_unprovisioned.xml
+++ b/res/layout/car_top_system_bar_unprovisioned.xml
@@ -70,6 +70,10 @@
                 systemui:amPmStyle="normal"/>
         </FrameLayout>
 
-    </RelativeLayout>
+        <include layout="@layout/mic_privacy_chip"
+           android:layout_width="@dimen/privacy_chip_width"
+           android:layout_height="match_parent"
+           android:layout_alignParentEnd="true"/>
+  </RelativeLayout>
 
 </com.android.systemui.car.systembar.CarSystemBarView>
diff --git a/res/layout/mic_privacy_chip.xml b/res/layout/mic_privacy_chip.xml
new file mode 100644
index 0000000..a485f8b
--- /dev/null
+++ b/res/layout/mic_privacy_chip.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+
+<com.android.systemui.car.privacy.MicPrivacyChip
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/privacy_chip"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingTop="@dimen/car_padding_1"
+    android:paddingBottom="@dimen/car_padding_1"
+    android:paddingStart="@dimen/car_padding_3"
+    android:paddingEnd="@dimen/car_padding_3"
+    android:focusable="true"
+    app:layoutDescription="@xml/mic_privacy_chip_scene">
+
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/max_width_guideline"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintGuide_end="@dimen/privacy_chip_width" />
+
+    <View
+        android:id="@+id/inactive_background"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:alpha="0.0"
+        android:background="@drawable/system_bar_background_pill"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="parent" />
+
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/circular_active_indicator_vertical_guideline"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintGuide_end="@dimen/privacy_chip_indicator_circle_diameter" />
+
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/circular_active_indicator_horizontal_guideline"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        app:layout_constraintGuide_end="@dimen/privacy_chip_indicator_circle_diameter" />
+
+    <View
+        android:id="@+id/active_background"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:alpha="0.0"
+        android:background="@drawable/mic_privacy_chip_background_pill"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="parent" />
+
+    <ImageView
+        android:id="@+id/light_muted_icon"
+        android:src="@drawable/ic_mic_off_white"
+        android:layout_width="@dimen/privacy_chip_icon_size"
+        android:layout_height="@dimen/privacy_chip_icon_size"
+        android:alpha="0.0"
+        android:gravity="center"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="parent"
+    />
+
+    <ImageView
+        android:id="@+id/light_icon"
+        android:src="@drawable/ic_mic_white"
+        android:layout_width="@dimen/privacy_chip_icon_size"
+        android:layout_height="@dimen/privacy_chip_icon_size"
+        android:alpha="0.0"
+        android:gravity="center"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="parent"
+    />
+
+    <ImageView
+        android:id="@+id/dark_icon"
+        android:src="@drawable/ic_mic_black"
+        android:layout_width="@dimen/privacy_chip_icon_size"
+        android:layout_height="@dimen/privacy_chip_icon_size"
+        android:alpha="0.0"
+        android:gravity="center"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="parent"
+    />
+</com.android.systemui.car.privacy.MicPrivacyChip>
\ No newline at end of file
diff --git a/res/layout/ongoing_privacy_chip.xml b/res/layout/ongoing_privacy_chip.xml
deleted file mode 100644
index f48de70..0000000
--- a/res/layout/ongoing_privacy_chip.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-
-
-<com.android.systemui.car.privacy.CarOngoingPrivacyChip
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/privacy_chip"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    android:layout_gravity="center_vertical"
-    android:focusable="true">
-
-    <FrameLayout
-        android:id="@+id/background"
-        android:layout_width="wrap_content"
-        android:layout_height="@dimen/privacy_chip_dialog_icon_height"
-        android:minWidth="@dimen/privacy_chip_bg_min_width"
-        android:layout_gravity="center_vertical">
-        <LinearLayout
-            android:id="@+id/icons_container"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:gravity="center_vertical"
-        />
-    </FrameLayout>
-</com.android.systemui.car.privacy.CarOngoingPrivacyChip>
\ No newline at end of file
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 8524c2a..a25ee2f 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -33,6 +33,9 @@
 
     <!-- colors for status bar -->
     <color name="system_bar_background_pill_color">#282A2D</color>
+    <color name="mic_privacy_chip_indicator_color">#FA7B17</color>
+    <color name="mic_privacy_chip_light_icon_color">#FFFFFF</color>
+    <color name="mic_privacy_chip_dark_icon_color">#000000</color>
     <color name="system_bar_icon_color">#FFFFFF</color>
     <color name="system_bar_text_color">#FFFFFF</color>
     <color name="status_bar_background_color">#33000000</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ba36cb2..5f21770 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -60,6 +60,8 @@
     <dimen name="system_bar_button_margin">32dp</dimen>
     <!-- Padding between the system bar button and the icon within it -->
     <dimen name="system_bar_button_padding">16dp</dimen>
+    <!-- Radius for system bar pill buttons -->
+    <dimen name="system_bar_pill_radius">30dp</dimen>
 
     <!-- The amount by which to scale up the status bar icons. -->
     <item name="status_bar_icon_scale_factor" format="float" type="dimen">1.75</item>
@@ -100,14 +102,14 @@
 
     <!-- Height of icons in Privacy chip dialog. Both App Op icon and application icon -->
     <dimen name="privacy_chip_dialog_icon_height">48dp</dimen>
-    <!-- Start and End padding for Privacy chip -->
-    <dimen name="privacy_chip_side_padding">6dp</dimen>
     <!-- Icon size for Privacy chip -->
     <dimen name="privacy_chip_icon_size">32dp</dimen>
-    <!-- Minimum background width for Privacy chip -->
-    <dimen name="privacy_chip_bg_min_width">48dp</dimen>
+    <!-- Background width for Privacy chip -->
+    <dimen name="privacy_chip_width">76dp</dimen>
     <!-- Margin between icons of Privacy chip -->
     <dimen name="privacy_chip_icon_margin">2dp</dimen>
+    <!-- Diameter of indicator circle in mic privacy chip animation -->
+    <dimen name="privacy_chip_indicator_circle_diameter">21.5dp</dimen>
 
     <!-- Car volume dimens. -->
     <dimen name="car_volume_item_icon_size">@dimen/car_primary_icon_size</dimen>
diff --git a/res/values/integers.xml b/res/values/integers.xml
index 5ae5555..cdd9d85 100644
--- a/res/values/integers.xml
+++ b/res/values/integers.xml
@@ -31,4 +31,11 @@
     <integer name="car_volume_dialog_display_hovering_timeout">16000</integer>
     <integer name="car_volume_dialog_display_expanded_normal_timeout">6000</integer>
     <integer name="car_volume_dialog_display_expanded_hovering_timeout">32000</integer>
+
+    <!-- Privacy chip animation transition duration -->
+    <integer name="privacy_chip_animation_transition_duration">500</integer>
+    <!-- Privacy chip pill to circle animation delay -->
+    <integer name="privacy_chip_pill_to_circle_delay">2000</integer>
+    <!-- Privacy chip no mic usage animation delay -->
+    <integer name="privacy_chip_no_mic_usage_delay">15000</integer>
 </resources>
diff --git a/res/xml/mic_privacy_chip_scene.xml b/res/xml/mic_privacy_chip_scene.xml
new file mode 100644
index 0000000..2700a1c
--- /dev/null
+++ b/res/xml/mic_privacy_chip_scene.xml
@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
+             xmlns:motion="http://schemas.android.com/apk/res-auto">
+    <Transition
+        android:id="@+id/micOffFromInvisible"
+        motion:constraintSetStart="@id/invisible"
+        motion:constraintSetEnd="@id/mic_off"
+        motion:motionInterpolator="decelerate"
+        motion:duration="@integer/privacy_chip_animation_transition_duration"/>
+
+    <Transition
+        android:id="@+id/activeInitFromInvisible"
+        motion:constraintSetStart="@id/invisible"
+        motion:constraintSetEnd="@id/active_init"
+        motion:motionInterpolator="decelerate"
+        motion:duration="@integer/privacy_chip_animation_transition_duration"/>
+
+    <!-- TODO(182826082): Uncomment when implementing camera blocked functionality -->
+<!--    <Transition
+        android:id="@+id/micOffFromActiveInit"
+        motion:constraintSetStart="@id/active_init"
+        motion:constraintSetEnd="@id/mic_off"
+        motion:motionInterpolator="decelerate"
+        motion:duration="@integer/privacy_chip_animation_transition_duration"/>-->
+
+    <Transition
+        android:id="@+id/activeInitFromInactive"
+        motion:constraintSetStart="@id/inactive"
+        motion:constraintSetEnd="@id/active_init"
+        motion:motionInterpolator="decelerate"
+        motion:duration="@integer/privacy_chip_animation_transition_duration"/>
+
+    <Transition
+        android:id="@+id/activeFromActiveInit"
+        motion:constraintSetStart="@id/active_init"
+        motion:constraintSetEnd="@id/active"
+        motion:motionInterpolator="decelerate"
+        motion:duration="@integer/privacy_chip_animation_transition_duration"/>
+
+    <!-- TODO(182826082): Uncomment when implementing camera blocked functionality -->
+<!--    <Transition
+        android:id="@+id/micOffFromActive"
+        motion:constraintSetStart="@id/active"
+        motion:constraintSetEnd="@id/mic_off"
+        motion:motionInterpolator="decelerate"
+        motion:duration="@integer/privacy_chip_animation_transition_duration"/>-->
+
+    <Transition
+        android:id="@+id/invisibleFromInactive"
+        motion:constraintSetStart="@id/inactive"
+        motion:constraintSetEnd="@id/invisible"
+        motion:motionInterpolator="decelerate"
+        motion:duration="@integer/privacy_chip_animation_transition_duration" />
+
+    <Transition
+        android:id="@+id/micOffFromInactive"
+        motion:constraintSetStart="@id/inactive"
+        motion:constraintSetEnd="@id/mic_off"
+        motion:motionInterpolator="decelerate"
+        motion:duration="@integer/privacy_chip_animation_transition_duration"/>
+
+    <Transition
+        android:id="@+id/invisibleFromMicOff"
+        motion:constraintSetStart="@id/mic_off"
+        motion:constraintSetEnd="@id/invisible"
+        motion:motionInterpolator="decelerate"
+        motion:duration="@integer/privacy_chip_animation_transition_duration" />
+
+    <Transition
+        android:id="@+id/inactiveFromActive"
+        motion:constraintSetStart="@id/active"
+        motion:constraintSetEnd="@id/inactive"
+        motion:motionInterpolator="decelerate"
+        motion:duration="@integer/privacy_chip_animation_transition_duration" />
+
+    <Transition
+        android:id="@+id/inactiveFromActiveInit"
+        motion:constraintSetStart="@id/active_init"
+        motion:constraintSetEnd="@id/inactive"
+        motion:motionInterpolator="decelerate"
+        motion:duration="@integer/privacy_chip_animation_transition_duration" />
+
+    <ConstraintSet android:id="@+id/invisible">
+        <Constraint
+            android:id="@id/active_background"
+            android:alpha="0.0"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toEndOf="parent"
+            motion:layout_constraintTop_toBottomOf="parent" />
+        <Constraint
+            android:id="@id/inactive_background"
+            android:alpha="0.0"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toEndOf="parent"
+            motion:layout_constraintTop_toBottomOf="parent" />
+        <Constraint
+            android:id="@id/light_muted_icon"
+            android:alpha="0.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toEndOf="parent"
+            motion:layout_constraintTop_toBottomOf="parent" />
+        <Constraint
+            android:id="@id/light_icon"
+            android:alpha="0.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toEndOf="parent"
+            motion:layout_constraintTop_toBottomOf="parent" />
+        <Constraint
+            android:id="@id/dark_icon"
+            android:alpha="0.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toEndOf="parent"
+            motion:layout_constraintTop_toBottomOf="parent" />
+    </ConstraintSet>
+
+    <ConstraintSet android:id="@+id/active_init">
+        <Constraint
+            android:id="@id/active_background"
+            android:alpha="1.0"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/inactive_background"
+            android:alpha="1.0"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/light_muted_icon"
+            android:alpha="0.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/light_icon"
+            android:alpha="0.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/dark_icon"
+            android:alpha="1.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+    </ConstraintSet>
+
+    <ConstraintSet android:id="@+id/active">
+        <Constraint
+            android:id="@id/active_background"
+            android:alpha="1.0"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/circular_active_indicator_vertical_guideline"
+            motion:layout_constraintTop_toTopOf="@id/circular_active_indicator_horizontal_guideline" />
+        <Constraint
+            android:id="@id/inactive_background"
+            android:alpha="1.0"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/light_muted_icon"
+            android:alpha="0.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/light_icon"
+            android:alpha="1.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/dark_icon"
+            android:alpha="0.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toBottomOf="parent" />
+    </ConstraintSet>
+
+    <ConstraintSet android:id="@+id/inactive">
+        <Constraint
+            android:id="@id/active_background"
+            android:alpha="0.0"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toEndOf="parent"
+            motion:layout_constraintTop_toBottomOf="parent" />
+        <Constraint
+            android:id="@id/inactive_background"
+            android:alpha="1.0"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/light_muted_icon"
+            android:alpha="0.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/light_icon"
+            android:alpha="1.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/dark_icon"
+            android:alpha="0.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+    </ConstraintSet>
+
+    <ConstraintSet android:id="@+id/mic_off">
+        <Constraint
+            android:id="@id/active_background"
+            android:alpha="0.0"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toEndOf="parent"
+            motion:layout_constraintTop_toBottomOf="parent" />
+        <Constraint
+            android:id="@id/inactive_background"
+            android:alpha="1.0"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/light_muted_icon"
+            android:alpha="1.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/light_icon"
+            android:alpha="0.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+        <Constraint
+            android:id="@id/dark_icon"
+            android:alpha="0.0"
+            android:layout_width="@dimen/privacy_chip_icon_size"
+            android:layout_height="@dimen/privacy_chip_icon_size"
+            motion:layout_constraintBottom_toBottomOf="parent"
+            motion:layout_constraintEnd_toEndOf="parent"
+            motion:layout_constraintStart_toStartOf="@id/max_width_guideline"
+            motion:layout_constraintTop_toTopOf="parent" />
+    </ConstraintSet>
+</MotionScene>
\ No newline at end of file
diff --git a/src/com/android/systemui/car/privacy/CarOngoingPrivacyChip.java b/src/com/android/systemui/car/privacy/CarOngoingPrivacyChip.java
deleted file mode 100644
index baf0f59..0000000
--- a/src/com/android/systemui/car/privacy/CarOngoingPrivacyChip.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.systemui.car.privacy;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-
-import com.android.systemui.R;
-import com.android.systemui.privacy.PrivacyChipBuilder;
-import com.android.systemui.privacy.PrivacyItem;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Car optimized {@link com.android.systemui.privacy.OngoingPrivacyChip}.
- */
-public class CarOngoingPrivacyChip extends FrameLayout {
-
-    private final int mIconMargin;
-    private final int mIconSize;
-    @ColorInt
-    private final int mIconColor;
-    private final int mSidePadding;
-    private final Drawable mBackgroundDrawable;
-
-    private LinearLayout mIconsContainer;
-    private FrameLayout mBackgroundView;
-
-    private List<PrivacyItem> mPrivacyItems = Collections.emptyList();
-
-    public CarOngoingPrivacyChip(@NotNull Context context) {
-        this(context, /* attrs= */ null);
-    }
-
-    public CarOngoingPrivacyChip(@NotNull Context context, @Nullable AttributeSet attrs) {
-        this(context, attrs, /* defStyleAttrs= */ 0);
-    }
-
-    public CarOngoingPrivacyChip(@NotNull Context context,
-            @Nullable AttributeSet attrs, int defStyleAttrs) {
-        this(context, attrs, defStyleAttrs, /* defStyleRes= */ 0);
-    }
-
-    public CarOngoingPrivacyChip(@NotNull Context context, @Nullable AttributeSet attrs,
-            int defStyleAttrs, int defStyleRes) {
-        super(context, attrs, defStyleAttrs, defStyleRes);
-        Resources res = getResources();
-
-        mIconMargin = Math.round(res.getDimension(R.dimen.privacy_chip_icon_margin));
-        mIconSize = res.getDimensionPixelSize(R.dimen.privacy_chip_icon_size);
-        mIconColor = res.getColor(R.color.status_bar_clock_color, getContext().getTheme());
-        mSidePadding = Math.round(res.getDimension(R.dimen.privacy_chip_side_padding));
-        mBackgroundDrawable =
-                res.getDrawable(R.drawable.system_bar_background_pill, getContext().getTheme());
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-
-        mBackgroundView = requireViewById(R.id.background);
-        mIconsContainer = requireViewById(R.id.icons_container);
-    }
-
-    public List<PrivacyItem> getPrivacyItemList() {
-        return mPrivacyItems;
-    }
-
-    /**
-     * Sets current {@link PrivacyItem} list and updates view.
-     */
-    public void setPrivacyItemList(@NonNull List<PrivacyItem> privacyItemList) {
-        mPrivacyItems = privacyItemList;
-        updateView();
-    }
-
-    private void updateView() {
-        mBackgroundView.setBackground(mBackgroundDrawable);
-        mBackgroundView.setPaddingRelative(mSidePadding, /* top= */ 0, mSidePadding,
-                /* bottom= */ 0);
-
-        if (!mPrivacyItems.isEmpty()) {
-            PrivacyChipBuilder builder = new PrivacyChipBuilder(getContext(), mPrivacyItems);
-            generateContentDescription(builder.joinTypes());
-            setIcons(builder.generateIcons(), mIconsContainer);
-            FrameLayout.LayoutParams layoutParams =
-                    (LayoutParams) mIconsContainer.getLayoutParams();
-            layoutParams.gravity = Gravity.CENTER;
-            mIconsContainer.setLayoutParams(layoutParams);
-        } else {
-            mIconsContainer.removeAllViews();
-        }
-        requestLayout();
-    }
-
-    private void setIcons(List<Drawable> icons, ViewGroup iconsContainer) {
-        iconsContainer.removeAllViews();
-        for (int i = 0; i < icons.size(); i++) {
-            Drawable icon = icons.get(i);
-            icon.mutate().setTint(mIconColor);
-            ImageView imageView = new ImageView(getContext());
-            imageView.setImageDrawable(icon);
-            imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
-            mIconsContainer.addView(imageView, mIconSize, mIconSize);
-            if (i != 0) {
-                MarginLayoutParams layoutParams = (MarginLayoutParams) imageView.getLayoutParams();
-                layoutParams.setMarginStart(mIconMargin);
-                imageView.setLayoutParams(layoutParams);
-            }
-        }
-    }
-
-    private void generateContentDescription(String typesText) {
-        setContentDescription(
-                getResources().getString(R.string.ongoing_privacy_chip_content_multiple_apps,
-                        typesText));
-    }
-}
diff --git a/src/com/android/systemui/car/privacy/MicPrivacyChip.java b/src/com/android/systemui/car/privacy/MicPrivacyChip.java
new file mode 100644
index 0000000..6b19557
--- /dev/null
+++ b/src/com/android/systemui/car/privacy/MicPrivacyChip.java
@@ -0,0 +1,244 @@
+/*
+ * 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.
+ */
+
+package com.android.systemui.car.privacy;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.UiThread;
+import androidx.constraintlayout.motion.widget.MotionLayout;
+
+import com.android.systemui.R;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Car optimized Mic Privacy Chip View that is shown when microphone is being used.
+ *
+ * State flows:
+ * Base state:
+ * <ul>
+ * <li>INVISIBLE - Start Mic Use ->> Mic Status?</li>
+ * </ul>
+ * Mic On:
+ * <ul>
+ * <li>Mic Status? - On ->> ACTIVE_INIT</li>
+ * <li>ACTIVE_INIT - delay ->> ACTIVE</li>
+ * <li>ACTIVE - Stop Mic Use ->> INACTIVE</li>
+ * <li>INACTIVE - delay ->> INVISIBLE</li>
+ * </ul>
+ * Mic Off:
+ * <ul>
+ * <li>Mic Status? - Off ->> MICROPHONE_OFF</li>
+ * <li>MICROPHONE_OFF - delay ->> INVISIBLE</li>
+ * </ul>
+ */
+public class MicPrivacyChip extends MotionLayout {
+    private final static boolean DEBUG = false;
+    private final static String TAG = "MicPrivacyChip";
+    private final static String TYPES_TEXT_MICROPHONE = "microphone";
+
+    private final int mDelayPillToCircle;
+    private final int mDelayToNoMicUsage;
+
+    private AnimationStates mCurrentTransitionState;
+    private boolean mIsInflated;
+    private ScheduledExecutorService mExecutor;
+
+    private enum AnimationStates {
+        INVISIBLE,
+        ACTIVE_INIT,
+        ACTIVE,
+        INACTIVE,
+        MICROPHONE_OFF,
+    }
+
+    public MicPrivacyChip(@NonNull Context context) {
+        this(context, /* attrs= */ null);
+    }
+
+    public MicPrivacyChip(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, /* defStyleAttrs= */ 0);
+    }
+
+    public MicPrivacyChip(@NonNull Context context,
+            @Nullable AttributeSet attrs, int defStyleAttrs) {
+        super(context, attrs, defStyleAttrs);
+
+        mDelayPillToCircle = getResources().getInteger(R.integer.privacy_chip_pill_to_circle_delay);
+        mDelayToNoMicUsage = getResources().getInteger(R.integer.privacy_chip_no_mic_usage_delay);
+
+        mExecutor = Executors.newSingleThreadScheduledExecutor();
+        mIsInflated = false;
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        mCurrentTransitionState = AnimationStates.INVISIBLE;
+        mIsInflated = true;
+    }
+
+    private boolean isMicrophoneToggledOff() {
+        // TODO(182826082): Implement Microphone off functionality
+        return false;
+    }
+
+    private void setContentDescription(boolean isMicOff) {
+        if (isMicOff) {
+            // TODO(182826082): Implement Microphone off functionality
+            setContentDescription(null);
+        } else {
+            setContentDescription(
+                    getResources().getString(R.string.ongoing_privacy_chip_content_multiple_apps,
+                            TYPES_TEXT_MICROPHONE));
+        }
+    }
+
+    /**
+     * Starts reveal animation for Mic Privacy Chip.
+     */
+    @UiThread
+    public void animateIn() {
+        if (!mIsInflated) {
+            if (DEBUG) Log.d(TAG, "Layout not inflated");
+
+            return;
+        }
+
+        if (mCurrentTransitionState == null) {
+            if (DEBUG) Log.d(TAG, "Current transition state is null or empty.");
+
+            return;
+        }
+
+        if (mCurrentTransitionState.equals(AnimationStates.INVISIBLE)) {
+            if (DEBUG) Log.d(TAG, isMicrophoneToggledOff() ? "setTransition: micOffFromInvisible"
+                    : "setTransition: activeInitFromInvisible");
+
+            setTransition(isMicrophoneToggledOff() ? R.id.micOffFromInvisible
+                    : R.id.activeInitFromInvisible);
+        } else if (mCurrentTransitionState.equals(AnimationStates.INACTIVE)) {
+            if (DEBUG) Log.d(TAG, isMicrophoneToggledOff() ? "setTransition: micOffFromInactive"
+                    : "setTransition: activeInitFromInactive");
+
+            setTransition(isMicrophoneToggledOff() ? R.id.micOffFromInactive
+                    : R.id.activeInitFromInactive);
+        } else {
+            if (DEBUG) Log.d(TAG, "Early exit, mCurrentTransitionState= "
+                    + mCurrentTransitionState);
+
+            return;
+        }
+
+        mExecutor.shutdownNow();
+        mExecutor = Executors.newSingleThreadScheduledExecutor();
+
+        // TODO(182938429): Use Transition Listeners once ConstraintLayout 2.0.0 is being used.
+        setContentDescription(false);
+        setVisibility(View.VISIBLE);
+        transitionToEnd();
+        mCurrentTransitionState = AnimationStates.ACTIVE_INIT;
+        if (!isMicrophoneToggledOff()) {
+            mExecutor.schedule(MicPrivacyChip.this::animateToOrangeCircle, mDelayPillToCircle,
+                    TimeUnit.MILLISECONDS);
+        }
+    }
+
+    // TODO(182938429): Use Transition Listeners once ConstraintLayout 2.0.0 is being used.
+    private void animateToOrangeCircle() {
+        setTransition(R.id.activeFromActiveInit);
+
+        // Since this is launched using a {@link ScheduledExecutorService}, its UI based elements
+        // need to execute on main executor.
+        getContext().getMainExecutor().execute(() -> {
+            mCurrentTransitionState = AnimationStates.ACTIVE;
+            transitionToEnd();
+        });
+    }
+
+    /**
+     * Starts conceal animation for Mic Privacy Chip.
+     */
+    @UiThread
+    public void animateOut() {
+        if (!mIsInflated) {
+            if (DEBUG) Log.d(TAG, "Layout not inflated");
+
+            return;
+        }
+
+        if (mCurrentTransitionState.equals(AnimationStates.ACTIVE_INIT)) {
+            if (DEBUG) Log.d(TAG, "setTransition: inactiveFromActiveInit");
+
+            setTransition(R.id.inactiveFromActiveInit);
+        } else if (mCurrentTransitionState.equals(AnimationStates.ACTIVE)) {
+            if (DEBUG) Log.d(TAG, "setTransition: inactiveFromActive");
+
+            setTransition(R.id.inactiveFromActive);
+        } else {
+            if (DEBUG) Log.d(TAG, "Early exit, mCurrentTransitionState= "
+                    + mCurrentTransitionState);
+
+            return;
+        }
+
+        mExecutor.shutdownNow();
+        mExecutor = Executors.newSingleThreadScheduledExecutor();
+
+        if (mCurrentTransitionState.equals(AnimationStates.MICROPHONE_OFF)) {
+            mCurrentTransitionState = AnimationStates.INACTIVE;
+            mExecutor.schedule(MicPrivacyChip.this::reset, mDelayToNoMicUsage,
+                    TimeUnit.MILLISECONDS);
+            return;
+        }
+
+        // TODO(182938429): Use Transition Listeners once ConstraintLayout 2.0.0 is being used.
+        mCurrentTransitionState = AnimationStates.INACTIVE;
+        transitionToEnd();
+        mExecutor.schedule(MicPrivacyChip.this::reset, mDelayToNoMicUsage,
+                TimeUnit.MILLISECONDS);
+    }
+
+    // TODO(182938429): Use Transition Listeners once ConstraintLayout 2.0.0 is being used.
+    private void reset() {
+        if (isMicrophoneToggledOff()) {
+            if (DEBUG) Log.d(TAG, "setTransition: invisibleFromMicOff");
+
+            setTransition(R.id.invisibleFromMicOff);
+        } else {
+            if (DEBUG) Log.d(TAG, "setTransition: invisibleFromInactive");
+
+            setTransition(R.id.invisibleFromInactive);
+        }
+
+        // Since this is launched using a {@link ScheduledExecutorService}, its UI based elements
+        // need to execute on main executor.
+        getContext().getMainExecutor().execute(() -> {
+            mCurrentTransitionState = AnimationStates.INVISIBLE;
+            transitionToEnd();
+            setVisibility(View.GONE);
+        });
+    }
+}
diff --git a/src/com/android/systemui/car/statusbar/PrivacyChipViewController.java b/src/com/android/systemui/car/statusbar/PrivacyChipViewController.java
index 55b3c8e..0b5c55a 100644
--- a/src/com/android/systemui/car/statusbar/PrivacyChipViewController.java
+++ b/src/com/android/systemui/car/statusbar/PrivacyChipViewController.java
@@ -23,16 +23,19 @@
 import android.view.View;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.UiThread;
 
 import com.android.systemui.R;
-import com.android.systemui.car.privacy.CarOngoingPrivacyChip;
+import com.android.systemui.car.privacy.MicPrivacyChip;
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.privacy.OngoingPrivacyChip;
 import com.android.systemui.privacy.PrivacyItem;
 import com.android.systemui.privacy.PrivacyItemController;
+import com.android.systemui.privacy.PrivacyType;
 
 import java.util.List;
+import java.util.Optional;
 
 import javax.inject.Inject;
 
@@ -46,9 +49,10 @@
     private final PrivacyItemController mPrivacyItemController;
     private final Context mContext;
     private final Handler mMainHandler;
-    private CarOngoingPrivacyChip mPrivacyChip;
+    private MicPrivacyChip mPrivacyChip;
     private boolean mAllIndicatorsEnabled;
     private boolean mMicCameraIndicatorsEnabled;
+    private boolean mIsMicPrivacyChipVisible;
 
     private final PrivacyItemController.Callback mPicCallback =
             new PrivacyItemController.Callback() {
@@ -57,8 +61,14 @@
                     if (mPrivacyChip == null) {
                         return;
                     }
-                    mPrivacyChip.setPrivacyItemList(privacyItems);
-                    setChipVisibility(!privacyItems.isEmpty());
+
+                    boolean shouldShowMicPrivacyChip = isMicPartOfPrivacyItems(privacyItems);
+                    if (mIsMicPrivacyChipVisible == shouldShowMicPrivacyChip) {
+                        return;
+                    }
+
+                    mIsMicPrivacyChipVisible = shouldShowMicPrivacyChip;
+                    setChipVisibility(shouldShowMicPrivacyChip);
                 }
 
                 @Override
@@ -74,23 +84,14 @@
                 private void onMicCameraToggled(boolean enabled) {
                     if (mMicCameraIndicatorsEnabled != enabled) {
                         mMicCameraIndicatorsEnabled = enabled;
-                        update();
                     }
                 }
 
                 private void onAllIndicatorsToggled(boolean enabled) {
                     if (mAllIndicatorsEnabled != enabled) {
                         mAllIndicatorsEnabled = enabled;
-                        update();
                     }
                 }
-
-                private void update() {
-                    if (mPrivacyChip == null) {
-                        return;
-                    }
-                    setChipVisibility(!mPrivacyChip.getPrivacyItemList().isEmpty());
-                }
             };
 
     @Inject
@@ -99,6 +100,7 @@
         mContext = context;
         mMainHandler = mainHandler;
         mPrivacyItemController = privacyItemController;
+        mIsMicPrivacyChipVisible = false;
     }
 
     @Override
@@ -110,6 +112,14 @@
                 UserHandle.CURRENT));
     }
 
+    private boolean isMicPartOfPrivacyItems(@NonNull List<PrivacyItem> privacyItems) {
+        Optional<PrivacyItem> optionalMicPrivacyItem = privacyItems.stream()
+                .filter(privacyItem -> privacyItem.getPrivacyType()
+                        .equals(PrivacyType.TYPE_MICROPHONE))
+                .findAny();
+        return optionalMicPrivacyItem.isPresent();
+    }
+
     /**
      * Finds the {@link OngoingPrivacyChip} and sets {@link PrivacyItemController}'s callback.
      */
@@ -120,7 +130,6 @@
         }
 
         mPrivacyChip.setOnClickListener(this);
-        setChipVisibility(mPrivacyChip.getVisibility() == View.VISIBLE);
         mAllIndicatorsEnabled = mPrivacyItemController.getAllIndicatorsAvailable();
         mMicCameraIndicatorsEnabled = mPrivacyItemController.getMicCameraAvailable();
         mPrivacyItemController.addCallback(mPicCallback);
@@ -133,6 +142,7 @@
         if (mPrivacyChip != null) {
             mPrivacyChip.setOnClickListener(null);
         }
+
         mPrivacyItemController.removeCallback(mPicCallback);
     }
 
@@ -140,11 +150,16 @@
         if (mPrivacyChip == null) {
             return;
         }
-        if (chipVisible && getChipEnabled()) {
-            mPrivacyChip.setVisibility(View.VISIBLE);
-        } else {
-            mPrivacyChip.setVisibility(View.GONE);
-        }
+
+        // Since this is launched using a callback thread, its UI based elements need
+        // to execute on main executor.
+        mContext.getMainExecutor().execute(() -> {
+            if (chipVisible && getChipEnabled()) {
+                mPrivacyChip.animateIn();
+            } else {
+                mPrivacyChip.animateOut();
+            }
+        });
     }
 
     private boolean getChipEnabled() {
diff --git a/tests/src/com/android/systemui/car/statusbar/PrivacyChipViewControllerTest.java b/tests/src/com/android/systemui/car/statusbar/PrivacyChipViewControllerTest.java
index 27f1253..402d80e 100644
--- a/tests/src/com/android/systemui/car/statusbar/PrivacyChipViewControllerTest.java
+++ b/tests/src/com/android/systemui/car/statusbar/PrivacyChipViewControllerTest.java
@@ -21,7 +21,9 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.content.Intent;
 import android.os.Handler;
@@ -35,8 +37,10 @@
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.car.CarSystemUiTest;
-import com.android.systemui.car.privacy.CarOngoingPrivacyChip;
+import com.android.systemui.car.privacy.MicPrivacyChip;
+import com.android.systemui.privacy.PrivacyItem;
 import com.android.systemui.privacy.PrivacyItemController;
+import com.android.systemui.privacy.PrivacyType;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -46,6 +50,9 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.util.Collections;
+import java.util.concurrent.Executor;
+
 @CarSystemUiTest
 @RunWith(AndroidTestingRunner.class)
 @TestableLooper.RunWithLooper
@@ -54,27 +61,35 @@
 
     private PrivacyChipViewController mPrivacyChipViewController;
     private FrameLayout mFrameLayout;
+    private MicPrivacyChip mMicPrivacyChip;
 
     @Captor
     private ArgumentCaptor<Intent> mIntentArgumentCaptor;
     @Captor
     private ArgumentCaptor<Runnable> mRunnableArgumentCaptor;
+    @Captor
+    private ArgumentCaptor<PrivacyItemController.Callback> mPicCallbackArgumentCaptor;
 
     @Mock
     private PrivacyItemController mPrivacyItemController;
     @Mock
     private Handler mHandler;
+    @Mock
+    private PrivacyItem mPrivacyItem;
+    @Mock
+    private Executor mExecutor;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(/* testClass= */ this);
         mFrameLayout = new FrameLayout(mContext);
-        CarOngoingPrivacyChip carOngoingPrivacyChip = new CarOngoingPrivacyChip(mContext);
+        mMicPrivacyChip = spy(new MicPrivacyChip(mContext));
         mContext = spy(mContext);
+        when(mContext.getMainExecutor()).thenReturn(mExecutor);
         mPrivacyChipViewController =
                 new PrivacyChipViewController(mContext, mHandler, mPrivacyItemController);
-        carOngoingPrivacyChip.setId(R.id.privacy_chip);
-        mFrameLayout.addView(carOngoingPrivacyChip);
+        mMicPrivacyChip.setId(R.id.privacy_chip);
+        mFrameLayout.addView(mMicPrivacyChip);
     }
 
     @Test
@@ -137,4 +152,75 @@
         assertThat(mIntentArgumentCaptor.getValue().getFlags()).isEqualTo(
                 Intent.FLAG_ACTIVITY_NEW_TASK);
     }
+
+    @Test
+    public void onPrivacyItemsChanged_micIsPartOfPrivacyItems_animateInCalled() {
+        when(mPrivacyItem.getPrivacyType()).thenReturn(PrivacyType.TYPE_MICROPHONE);
+        mPrivacyChipViewController.addPrivacyChipView(mFrameLayout);
+        verify(mPrivacyItemController).addCallback(mPicCallbackArgumentCaptor.capture());
+        mPicCallbackArgumentCaptor.getValue().onFlagAllChanged(true);
+        mPicCallbackArgumentCaptor.getValue().onFlagMicCameraChanged(true);
+
+        mPicCallbackArgumentCaptor.getValue()
+                .onPrivacyItemsChanged(Collections.singletonList(mPrivacyItem));
+        verify(mExecutor).execute(mRunnableArgumentCaptor.capture());
+        mRunnableArgumentCaptor.getValue().run();
+
+        verify(mMicPrivacyChip).animateIn();
+    }
+
+    @Test
+    public void onPrivacyItemsChanged_micIsPartOfPrivacyItemsTwice_animateInCalledOnce() {
+        when(mPrivacyItem.getPrivacyType()).thenReturn(PrivacyType.TYPE_MICROPHONE);
+        mPrivacyChipViewController.addPrivacyChipView(mFrameLayout);
+        verify(mPrivacyItemController).addCallback(mPicCallbackArgumentCaptor.capture());
+        mPicCallbackArgumentCaptor.getValue().onFlagAllChanged(true);
+        mPicCallbackArgumentCaptor.getValue().onFlagMicCameraChanged(true);
+
+        mPicCallbackArgumentCaptor.getValue()
+                .onPrivacyItemsChanged(Collections.singletonList(mPrivacyItem));
+        mPicCallbackArgumentCaptor.getValue()
+                .onPrivacyItemsChanged(Collections.singletonList(mPrivacyItem));
+        verify(mExecutor).execute(mRunnableArgumentCaptor.capture());
+        mRunnableArgumentCaptor.getAllValues().forEach(Runnable::run);
+
+        verify(mMicPrivacyChip).animateIn();
+    }
+
+    @Test
+    public void onPrivacyItemsChanged_micIsNotPartOfPrivacyItems_animateOutCalled() {
+        when(mPrivacyItem.getPrivacyType()).thenReturn(PrivacyType.TYPE_MICROPHONE);
+        mPrivacyChipViewController.addPrivacyChipView(mFrameLayout);
+        verify(mPrivacyItemController).addCallback(mPicCallbackArgumentCaptor.capture());
+        mPicCallbackArgumentCaptor.getValue().onFlagAllChanged(true);
+        mPicCallbackArgumentCaptor.getValue().onFlagMicCameraChanged(true);
+        mPicCallbackArgumentCaptor.getValue()
+                .onPrivacyItemsChanged(Collections.singletonList(mPrivacyItem));
+
+        mPicCallbackArgumentCaptor.getValue().onPrivacyItemsChanged(Collections.emptyList());
+        verify(mExecutor, times(/* wantedNumberOfInvocations= */ 2))
+                .execute(mRunnableArgumentCaptor.capture());
+        mRunnableArgumentCaptor.getAllValues().forEach(Runnable::run);
+
+        verify(mMicPrivacyChip).animateOut();
+    }
+
+    @Test
+    public void onPrivacyItemsChanged_micIsNotPartOfPrivacyItemsTwice_animateOutCalledOnce() {
+        when(mPrivacyItem.getPrivacyType()).thenReturn(PrivacyType.TYPE_MICROPHONE);
+        mPrivacyChipViewController.addPrivacyChipView(mFrameLayout);
+        verify(mPrivacyItemController).addCallback(mPicCallbackArgumentCaptor.capture());
+        mPicCallbackArgumentCaptor.getValue().onFlagAllChanged(true);
+        mPicCallbackArgumentCaptor.getValue().onFlagMicCameraChanged(true);
+        mPicCallbackArgumentCaptor.getValue()
+                .onPrivacyItemsChanged(Collections.singletonList(mPrivacyItem));
+
+        mPicCallbackArgumentCaptor.getValue().onPrivacyItemsChanged(Collections.emptyList());
+        mPicCallbackArgumentCaptor.getValue().onPrivacyItemsChanged(Collections.emptyList());
+        verify(mExecutor, times(/* wantedNumberOfInvocations= */ 2))
+                .execute(mRunnableArgumentCaptor.capture());
+        mRunnableArgumentCaptor.getAllValues().forEach(Runnable::run);
+
+        verify(mMicPrivacyChip).animateOut();
+    }
 }