diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 78e6844..008b9e0 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -38,13 +38,6 @@
             </intent-filter>
         </service>
 
-        <!-- <service android:name=".volume.aospa.VolumeDialogImpl"
-            android:label="AOSPA volume panel">
-            <intent-filter>
-                <action android:name="com.android.systemui.action.PLUGIN_VOLUME" />
-            </intent-filter>
-        </service> -->
-
         <provider
             android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
             android:authorities="co.potatoproject.plugin"
diff --git a/res/drawable/ic_speaker_bluetooth.xml b/res/drawable/ic_speaker_bluetooth.xml
deleted file mode 100644
index 0f11c67..0000000
--- a/res/drawable/ic_speaker_bluetooth.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<!--
-    Copyright (C) 2020 The Paranoid Android 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:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@android:color/white"
-        android:pathData="M4,3A2,2 0 0,0 2,5V19A2,2 0 0,0 4,21H12A2,2 0 0,0 14,19V5A2,2 0 0,0 12,3H4M8,5A2,2 0 0,1 10,7A2,2 0 0,1 8,9A2,2 0 0,1 6,7A2,2 0 0,1 8,5M19,7V10.79L16.71,8.5L16,9.21L18.79,12L16,14.79L16.71,15.5L19,13.21V17H19.5L22.35,14.14L20.21,12L22.35,9.85L19.5,7H19M20,8.91L20.94,9.85L20,10.79V8.91M8,11A4,4 0 0,1 12,15A4,4 0 0,1 8,19A4,4 0 0,1 4,15A4,4 0 0,1 8,11M8,13A2,2 0 0,0 6,15A2,2 0 0,0 8,17A2,2 0 0,0 10,15A2,2 0 0,0 8,13M20,13.21L20.94,14.14L20,15.08V13.21Z" />
-</vector> 
\ No newline at end of file
diff --git a/res/drawable/ic_tick_mark_media.xml b/res/drawable/ic_tick_mark_media.xml
deleted file mode 100644
index 19bea6d..0000000
--- a/res/drawable/ic_tick_mark_media.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<!--
-    Copyright (C) 2020 The Paranoid Android 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:height="24dp"
-    android:width="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path android:fillColor="@android:color/white"
-        android:pathData="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" />
-</vector> 
\ No newline at end of file
diff --git a/res/drawable/rounded_volume_background.xml b/res/drawable/rounded_volume_background.xml
deleted file mode 100644
index a2183f3..0000000
--- a/res/drawable/rounded_volume_background.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-    <corners android:radius="?android:attr/dialogCornerRadius" />
-    <solid android:color="@color/volume_background_tint" />
-</shape>
\ No newline at end of file
diff --git a/res/drawable/volume_dialog_seekbar.xml b/res/drawable/volume_dialog_seekbar.xml
deleted file mode 100644
index f50240a..0000000
--- a/res/drawable/volume_dialog_seekbar.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:id="@android:id/progress">
-        <clip
-            android:clipOrientation="horizontal"
-            android:gravity="left">
-            <selector>
-                <item
-                    android:drawable="@android:color/transparent"
-                    android:state_enabled="false" />
-                <item>
-                    <shape android:shape="rectangle">
-                        <corners android:radius="?android:attr/dialogCornerRadius" />
-                        <size android:height="@dimen/volume_dialog_panel_width" />
-                        <solid android:color="?android:attr/colorAccent" />
-                    </shape>
-                </item>
-            </selector>
-        </clip>
-    </item>
-</layer-list>
\ No newline at end of file
diff --git a/res/layout/volume_dialog_aospa.xml b/res/layout/volume_dialog_aospa.xml
deleted file mode 100644
index 7bea77b..0000000
--- a/res/layout/volume_dialog_aospa.xml
+++ /dev/null
@@ -1,225 +0,0 @@
-<!--
-     Copyright (C) 2015 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:sysui="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/volume_dialog"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@android:color/transparent"
-    android:clipChildren="false"
-    android:clipToPadding="false"
-    android:gravity="start"
-    android:layout_gravity="start"
-    android:minWidth="@dimen/volume_dialog_panel_width"
-    android:orientation="vertical"
-    android:paddingBottom="@dimen/volume_dialog_panel_transparent_padding"
-    android:paddingLeft="@dimen/volume_dialog_panel_transparent_padding_left_right"
-    android:paddingRight="@dimen/volume_dialog_panel_transparent_padding_left_right"
-    android:paddingTop="@dimen/volume_dialog_panel_transparent_padding"
-    android:theme="@style/qs_theme">
-
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="@dimen/volume_dialog_spacer"
-        android:clipToPadding="false"
-        android:orientation="horizontal">
-
-        <FrameLayout
-            android:id="@+id/ringer"
-            android:layout_width="@dimen/volume_dialog_panel_width"
-            android:layout_height="@dimen/volume_dialog_panel_width"
-            android:background="@drawable/rounded_volume_background"
-            android:elevation="@dimen/volume_dialog_elevation">
-
-            <com.android.keyguard.AlphaOptimizedImageButton
-                android:id="@+id/ringer_icon"
-                style="@style/VolumeButtons"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:padding="17dp"
-                android:tint="?android:attr/colorAccent" />
-
-            <include
-                layout="@layout/volume_dnd_icon"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="start"
-                android:layout_marginStart="6dp"
-                android:layout_marginTop="6dp" />
-        </FrameLayout>
-    </LinearLayout>
-
-    <FrameLayout
-        android:layout_width="wrap_content"
-        android:layout_height="@dimen/volume_dialog_slider_height"
-        android:layout_marginTop="@dimen/volume_dialog_spacer"
-        android:clipChildren="false"
-        android:clipToPadding="false">
-
-        <LinearLayout
-            android:id="@+id/volume_dialog_rows"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:clipChildren="false"
-            android:clipToPadding="false"
-            android:gravity="center"
-            android:minWidth="@dimen/volume_dialog_panel_width"
-            android:orientation="horizontal">
-            <!-- volume rows added and removed here! :-) -->
-        </LinearLayout>
-
-        <LinearLayout
-            android:id="@+id/media_output_scroller"
-            android:layout_width="182dp"
-            android:layout_height="match_parent"
-            android:background="@drawable/rounded_volume_background"
-            android:clickable="false"
-            android:clipChildren="false"
-            android:clipToPadding="false"
-            android:elevation="@dimen/volume_dialog_elevation"
-            android:orientation="vertical"
-            android:visibility="gone">
-
-            <com.android.systemui.statusbar.AlphaOptimizedTextView
-                android:id="@+id/media_output_title"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_gravity="end"
-                android:clickable="false"
-                android:ellipsize="marquee"
-                android:focusable="true"
-                android:marqueeRepeatLimit="marquee_forever"
-                android:paddingBottom="5dp"
-                android:paddingLeft="8dp"
-                android:paddingRight="6dp"
-                android:paddingTop="5dp"
-                android:singleLine="true"
-                android:text="@string/media_output_title"
-                android:textColor="?android:attr/colorControlNormal"
-                android:textSize="15sp"
-                android:textStyle="bold" />
-
-            <View
-                android:layout_width="match_parent"
-                android:layout_height="2dp"
-                android:background="@color/divider_stroke_color" />
-
-            <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="0dp"
-                android:layout_weight="1"
-                android:orientation="horizontal">
-
-                <ScrollView
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:fillViewport="true"
-                    android:scrollbars="none">
-
-                    <LinearLayout
-                        android:id="@+id/media_output_container"
-                        android:layout_width="match_parent"
-                        android:layout_height="match_parent"
-                        android:layout_gravity="top"
-                        android:gravity="top"
-                        android:layoutDirection="rtl"
-                        android:orientation="vertical">
-                        <!-- media output devices added and removed here -->
-                    </LinearLayout>
-                </ScrollView>
-            </LinearLayout>
-        </LinearLayout>
-    </FrameLayout>
-
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:clipChildren="false"
-        android:layout_marginTop="@dimen/volume_dialog_spacer"
-        android:minWidth="@dimen/volume_dialog_panel_width"
-        android:orientation="horizontal">
-
-        <LinearLayout
-            android:id="@+id/expandable_indicator_container"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="@dimen/volume_dialog_spacer"
-            android:background="@drawable/rounded_volume_background"
-            android:elevation="@dimen/volume_dialog_elevation"
-            android:orientation="vertical">
-
-            <com.android.systemui.statusbar.phone.ExpandableIndicator
-                android:id="@+id/expandable_indicator"
-                style="@style/VolumeButtons"
-                android:layout_width="@dimen/volume_dialog_panel_width"
-                android:layout_height="@dimen/volume_dialog_button_height"
-                android:background="@drawable/ripple_drawable_20dp"
-                android:rotation="90" />
-        </LinearLayout>
-
-        <LinearLayout
-            android:id="@+id/media_button_view"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginEnd="@dimen/volume_dialog_spacer"
-            android:background="@drawable/rounded_volume_background"
-            android:elevation="@dimen/volume_dialog_elevation"
-            android:orientation="vertical"
-            android:visibility="gone">
-
-            <com.android.keyguard.AlphaOptimizedImageButton
-                android:id="@+id/media_button"
-                style="@style/VolumeButtons"
-                android:layout_width="@dimen/volume_dialog_panel_width"
-                android:layout_height="@dimen/volume_dialog_button_height"
-                android:background="@drawable/ripple_drawable_20dp"
-                android:padding="11dp"
-                android:src="@drawable/ic_speaker_bluetooth" />
-        </LinearLayout>
-
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:gravity="start"
-            android:orientation="vertical">
-
-            <LinearLayout
-                android:id="@+id/odi_captions"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:background="@drawable/rounded_volume_background"
-                android:elevation="@dimen/volume_dialog_elevation"
-                android:orientation="vertical"
-                android:visibility="gone">
-
-                <co.potatoproject.plugin.volume.CaptionsToggleImageButton
-                    android:id="@+id/odi_captions_icon"
-                    style="@style/VolumeButtons"
-                    android:layout_width="@dimen/volume_dialog_panel_width"
-                    android:layout_height="@dimen/volume_dialog_button_height"
-                    android:background="@drawable/ripple_drawable_20dp"
-                    android:src="@drawable/ic_volume_odi_captions_disabled"
-                    sysui:optedOut="false" />
-            </LinearLayout>
-
-            <ViewStub
-                android:id="@+id/odi_captions_tooltip_stub"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="@dimen/volume_dialog_spacer"
-                android:inflatedId="@+id/odi_captions_tooltip_view"
-                android:layout="@layout/volume_tool_tip_view" />
-        </LinearLayout>
-    </LinearLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/volume_dialog_aospa_row.xml b/res/layout/volume_dialog_aospa_row.xml
deleted file mode 100644
index 2cc3550..0000000
--- a/res/layout/volume_dialog_aospa_row.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<!--
-     Copyright (C) 2015 The Android Open Source Project
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-          http://www.apache.org/licenses/LICENSE-2.0
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:layout_marginEnd="@dimen/volume_dialog_row_spacer"
-    android:background="@drawable/rounded_volume_background"
-    android:elevation="@dimen/volume_dialog_elevation"
-    android:tag="row"
-    android:theme="@style/qs_theme">
-
-    <FrameLayout
-        android:id="@+id/volume_row_slider_frame"
-        android:layout_width="@dimen/volume_dialog_panel_width"
-        android:layout_height="@dimen/volume_dialog_slider_height">
-
-        <SeekBar
-            android:id="@+id/volume_row_slider"
-            android:layout_width="@dimen/volume_dialog_slider_height"
-            android:layout_height="@dimen/volume_dialog_panel_width"
-            android:layout_gravity="center"
-            android:background="@null"
-            android:clickable="true"
-            android:layoutDirection="rtl"
-            android:paddingBottom="0dp"
-            android:paddingEnd="0dp"
-            android:paddingStart="0dp"
-            android:paddingTop="0dp"
-            android:progressDrawable="@drawable/volume_dialog_seekbar"
-            android:rotation="-90"
-            android:thumb="@android:color/transparent" />
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_gravity="bottom|center_horizontal"
-            android:orientation="vertical">
-
-            <com.android.systemui.statusbar.AlphaOptimizedImageView
-                android:id="@+id/volume_row_icon"
-                android:layout_width="@dimen/volume_dialog_row_icon_size"
-                android:layout_height="@dimen/volume_dialog_tap_target_size"
-                android:layout_gravity="center_horizontal"
-                android:layout_marginBottom="-12dp"
-                android:clickable="false"
-                android:layoutDirection="ltr"
-                android:scaleType="fitCenter"
-                android:soundEffectsEnabled="false"
-                android:tint="?android:attr/colorAccent" />
-
-            <com.android.systemui.statusbar.AlphaOptimizedTextView
-                android:id="@+id/volume_row_header"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_gravity="bottom|center_horizontal"
-                android:layout_marginBottom="10dp"
-                android:ellipsize="end"
-                android:gravity="bottom|center_horizontal"
-                android:layoutDirection="ltr"
-                android:maxLength="10"
-                android:maxLines="1"
-                android:textAppearance="@style/TextAppearance.Volume.Header"
-                android:textColor="?android:attr/colorAccent"
-                android:textStyle="bold" />
-        </LinearLayout>
-    </FrameLayout>
-
-    <include
-        layout="@layout/volume_dnd_icon"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_gravity="start"
-        android:layout_marginStart="6dp"
-        android:layout_marginTop="6dp" />
-</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/volume_dialog_media_output.xml b/res/layout/volume_dialog_media_output.xml
deleted file mode 100644
index a28bac0..0000000
--- a/res/layout/volume_dialog_media_output.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<!--
-     Copyright (C) 2020 The AOSPA-Extended 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:padding="4dp"
-    android:layout_gravity="end|top"
-    android:gravity="end"
-    android:background="@drawable/rounded_ripple"
-    android:clickable="true"
-    android:orientation="horizontal"
-    android:theme="@style/qs_theme">
-
-    <com.android.systemui.statusbar.AlphaOptimizedImageView
-        android:id="@+id/media_output_selected"
-        android:layout_width="30dp"
-        android:layout_height="30dp"
-        android:layout_gravity="start|center_vertical"
-        android:gravity="center"
-        android:src="@drawable/ic_tick_mark_media"
-        android:padding="6dp"
-        android:scaleType="fitCenter"
-        android:clickable="false"
-        android:tint="?android:attr/colorControlNormal"
-        android:soundEffectsEnabled="false" />
-
-    <LinearLayout
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_gravity="end|center_vertical"
-        android:layout_weight="1"
-        android:gravity="end"
-        android:paddingLeft="4dp"
-        android:paddingRight="4dp"
-        android:clickable="false"
-        android:orientation="vertical">
-        <com.android.systemui.statusbar.AlphaOptimizedTextView
-            android:id="@+id/media_output_text"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="end"
-            android:gravity="left"
-            android:clickable="false"
-            android:ellipsize="marquee"
-            android:marqueeRepeatLimit="marquee_forever"
-            android:focusable="true"
-            android:singleLine="true"
-            android:textSize="14sp"
-            android:textStyle="bold"
-            android:textColor="?android:attr/colorControlNormal" />
-        <com.android.systemui.statusbar.AlphaOptimizedTextView
-            android:id="@+id/media_output_summary"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="end"
-            android:gravity="left"
-            android:ellipsize="marquee"
-            android:clickable="false"
-            android:marqueeRepeatLimit="marquee_forever"
-            android:focusable="true"
-            android:layout_marginTop="-2dp"
-            android:singleLine="true"
-            android:textSize="11sp"
-            android:textStyle="italic"
-            android:textColor="?android:attr/colorControlNormal" />
-    </LinearLayout>
-
-    <com.android.systemui.statusbar.AlphaOptimizedImageView
-        android:id="@+id/media_output_icon"
-        android:layout_width="32dp"
-        android:layout_height="32dp"
-        android:layout_gravity="end|center_vertical"
-        android:gravity="left"
-        android:padding="2dp"
-        android:clickable="false"
-        android:scaleType="fitCenter"
-        android:soundEffectsEnabled="false"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
deleted file mode 100644
index 9aacd7f..0000000
--- a/res/values-night/colors.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<resources>
-    <color name="volume_background_tint">#141414</color>
-    <color name="divider_stroke_color">#434343</color>
-</resources>
\ No newline at end of file
diff --git a/res/values/colors.xml b/res/values/colors.xml
deleted file mode 100644
index 646ab5e..0000000
--- a/res/values/colors.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<resources>
-    <color name="volume_background_tint">#f2f2f2</color>
-    <color name="divider_stroke_color">#E0E0E0</color>
-</resources>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 3ab8534..e3315b9 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -13,21 +13,4 @@
     <dimen name="volume_dialog_fancy_slider_margin_bottom">4dp</dimen>
 
     <dimen name="volume_dialog_fancy_elevation">6dp</dimen>
-
-    <!-- AOSPA -->
-    <dimen name="volume_dialog_panel_transparent_padding_left_right">8dp</dimen>
-
-    <dimen name="volume_dialog_panel_width">58dp</dimen>
-    <dimen name="volume_dialog_slider_height">210dp</dimen>
-    <dimen name="volume_dialog_icon_padding">14dp</dimen>
-    <dimen name="volume_dialog_tap_target_size">@dimen/volume_dialog_panel_width</dimen>
-
-    <dimen name="volume_dialog_button_height">45dp</dimen>
-    <dimen name="volume_dialog_row_icon_size">24dp</dimen>
-    <dimen name="volume_dialog_row_spacer">@dimen/volume_dialog_spacer</dimen>
-
-    <dimen name="volume_tool_tip_arrow_height">8dp</dimen>
-    <dimen name="volume_tool_tip_arrow_width">10dp</dimen>
-    <dimen name="volume_tool_tip_arrow_margin_container">-2dp</dimen>
-    <dimen name="volume_tool_tip_arrow_margin_start">24dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
deleted file mode 100644
index e99e02c..0000000
--- a/res/values/strings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<resources>
-    <!-- Title for media output settings -->
-    <string name="media_output_title">Play media to</string>
-</resources>
\ No newline at end of file
diff --git a/res/values/styles.xml b/res/values/styles.xml
deleted file mode 100644
index eb18d11..0000000
--- a/res/values/styles.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2006 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.
--->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-    <style name="VolumeButtons" parent="@android:style/Widget.Material.Button.Borderless">
-        <item name="android:layout_gravity">center</item>
-        <item name="android:background">@drawable/rounded_ripple</item>
-        <item name="android:clickable">true</item>
-        <item name="android:focusable">true</item>
-        <item name="android:padding">@dimen/volume_dialog_icon_padding</item>
-        <item name="android:scaleType">fitCenter</item>
-        <item name="android:soundEffectsEnabled">false</item>
-        <item name="android:tint">?android:attr/colorControlNormal</item>
-    </style>
-</resources>
\ No newline at end of file
diff --git a/src/co/potatoproject/plugin/volume/aospa/VolumeDialogImpl.java b/src/co/potatoproject/plugin/volume/aospa/VolumeDialogImpl.java
deleted file mode 100644
index 59890a2..0000000
--- a/src/co/potatoproject/plugin/volume/aospa/VolumeDialogImpl.java
+++ /dev/null
@@ -1,1984 +0,0 @@
-/*
- * Copyright (C) 2015 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 co.potatoproject.plugin.volume.aospa;
-
-import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
-import static android.media.AudioManager.RINGER_MODE_NORMAL;
-import static android.media.AudioManager.RINGER_MODE_SILENT;
-import static android.media.AudioManager.RINGER_MODE_VIBRATE;
-import static android.media.AudioManager.STREAM_ACCESSIBILITY;
-import static android.media.AudioManager.STREAM_ALARM;
-import static android.media.AudioManager.STREAM_MUSIC;
-import static android.media.AudioManager.STREAM_RING;
-import static android.media.AudioManager.STREAM_VOICE_CALL;
-import static android.view.View.ACCESSIBILITY_LIVE_REGION_POLITE;
-import static android.view.View.GONE;
-import static android.view.View.VISIBLE;
-import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
-
-import static com.android.systemui.volume.Events.DISMISS_REASON_SETTINGS_CLICKED;
-
-import android.animation.Animator;
-import android.animation.ObjectAnimator;
-import android.annotation.SuppressLint;
-import android.app.ActivityManager;
-import android.app.Dialog;
-import android.app.KeyguardManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.res.ColorStateList;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Color;
-import android.graphics.PixelFormat;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
-import android.media.AudioSystem;
-import android.os.Debug;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.SystemClock;
-import android.os.VibrationEffect;
-import android.provider.Settings;
-import android.provider.Settings.Global;
-import android.text.InputFilter;
-import android.util.Log;
-import android.util.Slog;
-import android.util.SparseBooleanArray;
-import android.view.ContextThemeWrapper;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.AccessibilityDelegate;
-import android.view.ViewAnimationUtils;
-import android.view.ViewGroup;
-import android.view.ViewPropertyAnimator;
-import android.view.ViewStub;
-import android.view.Window;
-import android.view.WindowManager;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityNodeInfo;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.FrameLayout;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.settingslib.Utils;
-import com.android.settingslib.media.LocalMediaManager;
-import com.android.settingslib.media.MediaDevice;
-import com.android.systemui.Dependency;
-import com.android.systemui.Prefs;
-import com.android.systemui.R;
-import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.plugins.PluginDependency;
-import com.android.systemui.plugins.VolumeDialog;
-import com.android.systemui.plugins.VolumeDialogController;
-import com.android.systemui.plugins.VolumeDialogController.State;
-import com.android.systemui.plugins.VolumeDialogController.StreamState;
-import com.android.systemui.plugins.annotations.Requires;
-import com.android.systemui.statusbar.phone.ExpandableIndicator;
-import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
-import com.android.systemui.statusbar.policy.ConfigurationController;
-import com.android.systemui.statusbar.policy.DeviceProvisionedController;
-import co.potatoproject.plugin.volume.CaptionsToggleImageButton;
-import co.potatoproject.plugin.volume.ConfigurableTexts;
-import co.potatoproject.plugin.volume.D;
-import co.potatoproject.plugin.volume.Events;
-import co.potatoproject.plugin.volume.SafetyWarningDialog;
-import co.potatoproject.plugin.volume.SystemUIInterpolators;
-import co.potatoproject.plugin.volume.Util;
-import co.potatoproject.plugin.volume.VolumePrefs;
-import co.potatoproject.plugin.volume.VolumeToolTipView;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Visual presentation of the volume dialog.
- *
- * A client of VolumeDialogControllerImpl and its state model.
- *
- * Methods ending in "H" must be called on the (ui) handler.
- */
-@Requires(target = VolumeDialog.class, version = VolumeDialog.VERSION)
-@Requires(target = VolumeDialog.Callback.class, version = VolumeDialog.Callback.VERSION)
-@Requires(target = VolumeDialogController.class, version = VolumeDialogController.VERSION)
-@Requires(target = ActivityStarter.class, version = ActivityStarter.VERSION)
-public class VolumeDialogImpl implements VolumeDialog,
-        ConfigurationController.ConfigurationListener, LocalMediaManager.DeviceCallback {
-    private static final String TAG = Util.logTag(VolumeDialogImpl.class);
-
-    private static final long USER_ATTEMPT_GRACE_PERIOD = 1000;
-    private static final int UPDATE_ANIMATION_DURATION = 80;
-
-    static final int DIALOG_TIMEOUT_MILLIS = 3000;
-    static final int DIALOG_SAFETYWARNING_TIMEOUT_MILLIS = 5000;
-    static final int DIALOG_ODI_CAPTIONS_TOOLTIP_TIMEOUT_MILLIS = 5000;
-    static final int DIALOG_HOVERING_TIMEOUT_MILLIS = 16000;
-    static final int DIALOG_SHOW_ANIMATION_DURATION = 300;
-    static final int DIALOG_HIDE_ANIMATION_DURATION = 250;
-
-    private static final int SLIDER_PROGRESS_ALPHA_ACTIVE = 100;
-    private static final int SLIDER_PROGRESS_ALPHA_ACTIVE_DARK = 60;
-    private static final int SLIDER_PROGRESS_ALPHA = 50;
-    private static final int SLIDER_PROGRESS_ALPHA_DARK = 40;
-
-    private Context mContext;
-    private final H mHandler = new H();
-    private VolumeDialogController mController;
-
-    private Window mWindow;
-    private CustomDialog mDialog;
-    private LinearLayout mDialogView;
-    private ViewGroup mDialogRowsView;
-    private ViewGroup mRinger;
-    private ViewGroup mMediaOutputView;
-    private ViewGroup mMediaOutputScrollView;
-    private ViewGroup mMediaButtonView;
-    private TextView mMediaTitleText;
-    private ImageButton mMediaButton;
-    private ImageButton mRingerIcon;
-    private ViewGroup mODICaptionsView;
-    private CaptionsToggleImageButton mODICaptionsIcon;
-    private View mExpandRowsView;
-    private ExpandableIndicator mExpandRows;
-    private FrameLayout mZenIcon;
-    private final List<VolumeRow> mRows = new ArrayList<>();
-    private ConfigurableTexts mConfigurableTexts;
-    private final SparseBooleanArray mDynamic = new SparseBooleanArray();
-    private KeyguardManager mKeyguard;
-    private ActivityManager mActivityManager;
-    private AccessibilityManager mAccessibilityMgr;
-    private final Object mSafetyWarningLock = new Object();
-    private final Accessibility mAccessibility = new Accessibility();
-
-    private boolean mShowing;
-    private boolean mShowA11yStream;
-
-    private int mActiveStream;
-    private int mPrevActiveStream;
-    private boolean mAutomute = VolumePrefs.DEFAULT_ENABLE_AUTOMUTE;
-    private boolean mSilentMode = VolumePrefs.DEFAULT_ENABLE_SILENT_MODE;
-    private State mState;
-    private SafetyWarningDialog mSafetyWarning;
-    private boolean mHovering = false;
-    private boolean mShowActiveStreamOnly;
-    private boolean mConfigChanged = false;
-    private boolean mODIServiceComponentEnabled;
-    private boolean mPendingOdiCaptionsTooltip;
-    private boolean mHasSeenODICaptionsTooltip;
-    private ViewStub mODICaptionsTooltipViewStub;
-    private View mODICaptionsTooltipView = null;
-    private LocalMediaManager mLocalMediaManager;
-    private Animator mCurrAnimator;
-
-    private boolean mLeftVolumeRocker;
-
-    private boolean mHasAlertSlider;
-    private boolean mDarkMode;
-    private boolean mVibrateOnSlider;
-
-    private boolean mExpanded;
-    private boolean mShowingMediaDevices;
-
-    private float mElevation;
-    private float mHeight, mWidth, mSpacer;
-
-    private final List<MediaOutputRow> mMediaOutputRows = new ArrayList<>();
-    private final List<MediaDevice> mMediaDevices = new ArrayList<>();
-
-    public VolumeDialogImpl() {}
-
-    @Override
-    public void onCreate(Context sysuiContext, Context pluginContext) {
-        mContext =
-                new ContextThemeWrapper(pluginContext, R.style.qs_theme);
-        mController = PluginDependency.get(this, VolumeDialogController.class);
-        mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
-        mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
-        mAccessibilityMgr = mContext.getSystemService(AccessibilityManager.class);
-        mShowActiveStreamOnly = showActiveStreamOnly();
-        mHasSeenODICaptionsTooltip =
-                Prefs.getBoolean(sysuiContext, Prefs.Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, false);
-        mLeftVolumeRocker = sysuiContext.getResources().getBoolean(R.bool.config_audioPanelOnLeftSide);
-        mHasAlertSlider = false;
-        mVibrateOnSlider = sysuiContext.getResources().getBoolean(R.bool.config_vibrateOnIconAnimation);
-        mElevation = sysuiContext.getResources().getDimension(R.dimen.volume_dialog_elevation);
-        mSpacer = pluginContext.getResources().getDimension(R.dimen.volume_dialog_row_spacer);
-
-        /*mHandler.postDelayed(() -> {
-            if (mLocalMediaManager == null) {
-                //mLocalMediaManager = new LocalMediaManager(sysuiContext, TAG, null);
-                //mLocalMediaManager.registerCallback(VolumeDialogImpl.this);
-            }
-        }, 3000);*/
-    }
-
-    private void updateUI() {
-        mContext.getTheme().applyStyle(mContext.getThemeResId(), true);
-        removeAllMediaOutputRows();
-        setDarkMode();
-    }
-
-    private void setDarkMode() {
-        final int nightModeFlags = mContext.getResources().getConfiguration().uiMode &
-                Configuration.UI_MODE_NIGHT_MASK;
-
-        switch (nightModeFlags) {
-            case Configuration.UI_MODE_NIGHT_YES:
-                mDarkMode = true;
-                break;
-            case Configuration.UI_MODE_NIGHT_NO:
-            case Configuration.UI_MODE_NIGHT_UNDEFINED:
-                mDarkMode = false;
-                break;
-        }
-    }
-
-    @Override
-    public void init(int windowType, Callback callback) {
-        initDialog();
-
-        mAccessibility.init();
-
-        mController.addCallback(mControllerCallbackH, mHandler);
-        mController.getState();
-    }
-
-    @Override
-    public void destroy() {
-        mController.removeCallback(mControllerCallbackH);
-        mHandler.removeCallbacksAndMessages(null);
-        //mLocalMediaManager.unregisterCallback(this);
-    }
-
-    private void initDialog() {
-        mDialog = new CustomDialog(mContext);
-
-        mConfigurableTexts = new ConfigurableTexts(mContext);
-        mHovering = false;
-        mShowing = false;
-        mExpanded = false;
-        mWindow = mDialog.getWindow();
-        mWindow.requestFeature(Window.FEATURE_NO_TITLE);
-        mWindow.getDecorView();
-        mWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
-        mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND
-                | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
-        mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
-                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
-                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
-                | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
-                | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
-        mWindow.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
-        mWindow.setWindowAnimations(com.android.internal.R.style.Animation_Toast);
-        WindowManager.LayoutParams lp = mWindow.getAttributes();
-        lp.width = MATCH_PARENT;
-        lp.height = WRAP_CONTENT;
-        lp.format = PixelFormat.TRANSLUCENT;
-        lp.setTitle(VolumeDialogImpl.class.getSimpleName());
-        lp.windowAnimations = -1;
-        if(!isAudioPanelOnLeftSide()){
-            lp.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL;
-        } else {
-            lp.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
-        }
-        mWindow.setAttributes(lp);
-
-        mDialog.setContentView(R.layout.volume_dialog_aospa);
-        mDialogView = (LinearLayout) mDialog.findViewById(R.id.volume_dialog);
-        //FrameLayout.LayoutParams dialogLP = (FrameLayout.LayoutParams) mDialogView.getLayoutParams();
-        mDialogView.setLayoutDirection(
-                isAudioPanelOnLeftSide() ? View.LAYOUT_DIRECTION_LTR : View.LAYOUT_DIRECTION_RTL);
-        mDialogView.setAlpha(0);
-        /*if(!isAudioPanelOnLeftSide()){
-            dialogLP.gravity = Gravity.RIGHT;
-        } else {
-            dialogLP.gravity = Gravity.LEFT;
-        }
-        mDialogView.setLayoutParams(dialogLP);*/
-        mDialog.setCanceledOnTouchOutside(true);
-        mDialog.setOnShowListener(dialog -> {
-            if (!isLandscape()) {
-                mDialogView.setTranslationX(
-                        (mDialogView.getWidth() / 2.0f) * (!isAudioPanelOnLeftSide() ? 1 : -1));
-            }
-            mDialogView.setAlpha(0);
-            mDialogView.animate()
-                    .alpha(1)
-                    .translationX(0)
-                    .setDuration(DIALOG_SHOW_ANIMATION_DURATION)
-                    .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator())
-                    .withEndAction(() -> {
-                        if (!Prefs.getBoolean(mContext, Prefs.Key.TOUCHED_RINGER_TOGGLE, false)) {
-                            if (mRingerIcon != null) {
-                                mRingerIcon.postOnAnimationDelayed(
-                                        getSinglePressFor(mRingerIcon), 1500);
-                            }
-                        }
-                    })
-                    .start();
-            /*if (mLocalMediaManager != null) {
-                mLocalMediaManager.startScan();
-            }*/
-        });
-
-        mDialogView.setOnHoverListener((v, event) -> {
-            int action = event.getActionMasked();
-            mHovering = (action == MotionEvent.ACTION_HOVER_ENTER)
-                    || (action == MotionEvent.ACTION_HOVER_MOVE);
-            rescheduleTimeoutH();
-            return true;
-        });
-
-        mDialogRowsView = mDialog.findViewById(R.id.volume_dialog_rows);
-        mRinger = mDialog.findViewById(R.id.ringer);
-        if (mRinger != null) {
-            mRingerIcon = mRinger.findViewById(R.id.ringer_icon);
-            mZenIcon = mRinger.findViewById(R.id.dnd_icon);
-            Util.setVisOrGone(mRinger, !mHasAlertSlider);
-        }
-
-        mODICaptionsView = mDialog.findViewById(R.id.odi_captions);
-        if (mODICaptionsView != null) {
-            mODICaptionsIcon = mODICaptionsView.findViewById(R.id.odi_captions_icon);
-        }
-        mODICaptionsTooltipViewStub = mDialog.findViewById(R.id.odi_captions_tooltip_stub);
-        if (mHasSeenODICaptionsTooltip && mODICaptionsTooltipViewStub != null) {
-            mDialogView.removeView(mODICaptionsTooltipViewStub);
-            mODICaptionsTooltipViewStub = null;
-        }
-
-        mExpandRowsView = mDialog.findViewById(R.id.expandable_indicator_container);
-        mExpandRows = mExpandRowsView.findViewById(R.id.expandable_indicator);
-        mExpandRows.setScaleY(isAudioPanelOnLeftSide() ? -1f : 1f);
-
-        mMediaOutputView = mDialog.findViewById(R.id.media_output_container);
-        mMediaOutputScrollView = mDialog.findViewById(R.id.media_output_scroller);
-        mMediaButtonView = mDialog.findViewById(R.id.media_button_view);
-        mMediaButton = mDialog.findViewById(R.id.media_button);
-        mMediaTitleText = mDialog.findViewById(R.id.media_output_title);
-
-        if (mRows.isEmpty()) {
-            if (!AudioSystem.isSingleVolume(mContext)) {
-                addRow(STREAM_ACCESSIBILITY, R.drawable.ic_volume_accessibility,
-                        R.drawable.ic_volume_accessibility, true, false);
-            }
-            addRow(AudioManager.STREAM_MUSIC,
-                    R.drawable.ic_volume_media, R.drawable.ic_volume_media_mute, true, true);
-            if (!AudioSystem.isSingleVolume(mContext)) {
-                addRow(AudioManager.STREAM_RING,
-                        R.drawable.ic_volume_ringer, R.drawable.ic_volume_ringer_mute, true, false);
-                addRow(STREAM_ALARM,
-                        R.drawable.ic_alarm, R.drawable.ic_volume_alarm_mute, true, false);
-                addRow(AudioManager.STREAM_VOICE_CALL,
-                        com.android.internal.R.drawable.ic_phone,
-                        com.android.internal.R.drawable.ic_phone, false, false);
-                addRow(AudioManager.STREAM_BLUETOOTH_SCO,
-                        R.drawable.ic_volume_bt_sco, R.drawable.ic_volume_bt_sco, false, false);
-                addRow(AudioManager.STREAM_SYSTEM, R.drawable.ic_volume_system,
-                        R.drawable.ic_volume_system_mute, false, false);
-            }
-        } else {
-            addExistingRows();
-        }
-
-        updateUI();
-
-        updateRowsH(getActiveRow());
-        initRingerH();
-        initSettingsH();
-        initODICaptionsH();
-    }
-
-    protected ViewGroup getDialogView() {
-        return mDialogView;
-    }
-
-    private int getAlphaAttr(int attr) {
-        TypedArray ta = mContext.obtainStyledAttributes(new int[]{attr});
-        float alpha = ta.getFloat(0, 0);
-        ta.recycle();
-        return (int) (alpha * 255);
-    }
-
-    private boolean isLandscape() {
-        return mContext.getResources().getConfiguration().orientation ==
-                Configuration.ORIENTATION_LANDSCAPE;
-    }
-
-    public void setStreamImportant(int stream, boolean important) {
-        mHandler.obtainMessage(H.SET_STREAM_IMPORTANT, stream, important ? 1 : 0).sendToTarget();
-    }
-
-    public void setAutomute(boolean automute) {
-        if (mAutomute == automute) return;
-        mAutomute = automute;
-        mHandler.sendEmptyMessage(H.RECHECK_ALL);
-    }
-
-    public void setSilentMode(boolean silentMode) {
-        if (mSilentMode == silentMode) return;
-        mSilentMode = silentMode;
-        mHandler.sendEmptyMessage(H.RECHECK_ALL);
-    }
-
-    private void addRow(int stream, int iconRes, int iconMuteRes, boolean important,
-            boolean defaultStream) {
-        addRow(stream, iconRes, iconMuteRes, important, defaultStream, false);
-    }
-
-    private void addRow(int stream, int iconRes, int iconMuteRes, boolean important,
-            boolean defaultStream, boolean dynamic) {
-        if (D.BUG) Slog.d(TAG, "Adding row for stream " + stream);
-        VolumeRow row = new VolumeRow();
-        initRow(row, stream, iconRes, iconMuteRes, important, defaultStream);
-        mDialogRowsView.addView(row.view, 0);
-        mRows.add(row);
-    }
-
-    private void addExistingRows() {
-        for (VolumeRow row : mRows) {
-            initRow(row, row.stream, row.iconRes, row.iconMuteRes, row.important,
-                    row.defaultStream);
-            mDialogRowsView.addView(row.view, 0);
-            updateVolumeRowH(row);
-        }
-    }
-
-    private void cleanExpandedRows() {
-        VolumeRow ring = findRow(STREAM_RING);
-        VolumeRow alarm = findRow(STREAM_ALARM);
-        VolumeRow media = findRow(STREAM_MUSIC);
-        VolumeRow active = getActiveRow();
-
-        float width = mContext.getResources().getDimension(
-                R.dimen.volume_dialog_panel_width) + mSpacer;
-        float z = mElevation;
-
-        boolean isMediaButtonVisible = mMediaButtonView.getVisibility() == VISIBLE;
-
-        if (isMediaButtonVisible && !mODIServiceComponentEnabled) {
-            animateViewOut(mMediaButtonView, false, width, z);
-        } else if (mODIServiceComponentEnabled) {
-            float widthMedia = width;
-            if (isMediaButtonVisible) {
-                animateViewOut(mMediaButtonView, false, widthMedia, z/2);
-                widthMedia += widthMedia;
-            }
-            animateViewOut(mODICaptionsView, false, widthMedia, z);
-            hideCaptionsTooltip();
-        }
-
-        if (alarm != null) {
-            final boolean isAlarmVisible = active == alarm;
-            animateViewOut(alarm.view, isAlarmVisible, 0, z);
-            z /= 2;
-            width = isAlarmVisible ? width / 2 : width;
-        }
-        if (ring != null) {
-            final boolean isRingVisible = active == ring;
-            animateViewOut(ring.view, isRingVisible, width, z);
-            z /= 2;
-            width = isRingVisible ? width : width * 2;
-        }
-        if (media != null) {
-            animateViewOut(media.view, true, width, z);
-        }
-        if (mShowingMediaDevices) {
-            mDialogRowsView.setAlpha(1f);
-            final ColorStateList tint = Utils.getColorAttr(mContext,
-                android.R.attr.colorControlNormal);
-            mMediaButton.setImageTintList(tint);
-            mMediaTitleText.setSelected(false);
-            mShowingMediaDevices = false;
-            if (mExpanded) {
-                if (mCurrAnimator != null && mCurrAnimator.isRunning()) {
-                    mCurrAnimator.cancel();
-                }
-                int x = (int) (isAudioPanelOnLeftSide() ? 0 : (3 * mWidth + 2 * mSpacer));
-                int endRadius = (int) Math.hypot(3 * mWidth + 2 * mSpacer, mHeight);
-                mCurrAnimator = circularExit(mMediaOutputScrollView, x, endRadius);
-                mCurrAnimator.start();
-            } else {
-                Util.setVisOrGone(mMediaOutputScrollView, false);
-                Util.setVisOrGone(mDialogRowsView, true);
-            }
-        }
-    }
-
-    private VolumeRow getActiveRow() {
-        for (VolumeRow row : mRows) {
-            if (row.stream == mActiveStream) {
-                return row;
-            }
-        }
-        for (VolumeRow row : mRows) {
-            if (row.stream == STREAM_MUSIC) {
-                return row;
-            }
-        }
-        return mRows.get(0);
-    }
-
-    private VolumeRow findRow(int stream) {
-        for (VolumeRow row : mRows) {
-            if (row.stream == stream) return row;
-        }
-        return null;
-    }
-
-    public void dump(PrintWriter writer) {
-        writer.println(VolumeDialogImpl.class.getSimpleName() + " state:");
-        writer.print("  mShowing: "); writer.println(mShowing);
-        writer.print("  mActiveStream: "); writer.println(mActiveStream);
-        writer.print("  mDynamic: "); writer.println(mDynamic);
-        writer.print("  mAutomute: "); writer.println(mAutomute);
-        writer.print("  mSilentMode: "); writer.println(mSilentMode);
-    }
-
-    private static int getImpliedLevel(SeekBar seekBar, int progress) {
-        final int m = seekBar.getMax();
-        final int n = m / 100 - 1;
-        final int level = progress == 0 ? 0
-                : progress == m ? (m / 100) : (1 + (int)((progress / (float) m) * n));
-        return level;
-    }
-
-    @SuppressLint("InflateParams")
-    private void initRow(final VolumeRow row, final int stream, int iconRes, int iconMuteRes,
-            boolean important, boolean defaultStream) {
-        row.stream = stream;
-        row.iconRes = iconRes;
-        row.iconMuteRes = iconMuteRes;
-        row.important = important;
-        row.defaultStream = defaultStream;
-        row.view = mDialog.getLayoutInflater().inflate(R.layout.volume_dialog_aospa_row,
-                mDialogRowsView, false);
-        row.view.setId(row.stream);
-        row.view.setTag(row);
-        row.header = row.view.findViewById(R.id.volume_row_header);
-        row.header.setId(20 * row.stream);
-        if (stream == STREAM_ACCESSIBILITY) {
-            row.header.setFilters(new InputFilter[] {new InputFilter.LengthFilter(13)});
-        }
-        row.dndIcon = row.view.findViewById(R.id.dnd_icon);
-        row.slider = row.view.findViewById(R.id.volume_row_slider);
-        row.slider.setOnSeekBarChangeListener(new VolumeSeekBarChangeListener(row));
-
-        row.anim = null;
-
-        row.icon = row.view.findViewById(R.id.volume_row_icon);
-        row.icon.setImageResource(iconRes);
-        row.icon.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
-    }
-
-    public void initSettingsH() {
-        if (mExpandRowsView != null) {
-            mExpandRowsView.setVisibility(
-                    mActivityManager.getLockTaskModeState() == LOCK_TASK_MODE_NONE ?
-                            VISIBLE : GONE);
-        }
-        if (mExpandRows != null) {
-            mMediaButton.setOnClickListener(v -> {
-                if (mHeight == 0 || mWidth == 0) {
-                    VolumeRow activeRow = getActiveRow();
-                    mHeight = (float) activeRow.view.getHeight();
-                    mWidth = (float) activeRow.view.getWidth();
-                }
-                int x = (int) (isLandscape() ? (isAudioPanelOnLeftSide() ? (
-                        (mWidth + mSpacer) * (mHasAlertSlider ? 1 : 2) + mWidth / 2)
-                        : (mHasAlertSlider ? mWidth * 1.5 + mSpacer : mWidth / 2))
-                        : (1.5 * mWidth + mSpacer));
-                int endRadius = (int) Math.hypot((isLandscape() ? 2.2 : 1.1) * (1.5 * mWidth +
-                        mSpacer), mHeight);
-                if (mShowingMediaDevices) {
-                    mShowingMediaDevices = false;
-                    if (mCurrAnimator != null && mCurrAnimator.isRunning()) {
-                        mCurrAnimator.cancel();
-                    }
-                    mCurrAnimator = circularExit(mMediaOutputScrollView, x, endRadius);
-                } else {
-                    mShowingMediaDevices = true;
-                    if (mCurrAnimator != null && mCurrAnimator.isRunning()) {
-                        mCurrAnimator.cancel();
-                    }
-                    mCurrAnimator = circularReveal(mMediaOutputScrollView, x, endRadius);
-                }
-                mCurrAnimator.start();
-                final ColorStateList tint = mShowingMediaDevices
-                    ? Utils.getColorAccent(mContext)
-                    : Utils.getColorAttr(mContext, android.R.attr.colorControlNormal);
-                mMediaButton.setImageTintList(tint);
-
-                provideTouchHapticH(VibrationEffect.get(VibrationEffect.EFFECT_TICK));
-            });
-            mExpandRows.setOnLongClickListener(v -> {
-                Events.writeEvent(mContext, Events.EVENT_SETTINGS_CLICK);
-                Intent intent = new Intent(Settings.Panel.ACTION_VOLUME);
-                dismissH(DISMISS_REASON_SETTINGS_CLICKED);
-                PluginDependency.get(this, ActivityStarter.class).startActivity(intent,
-                        true /* dismissShade */);
-                return true;
-            });
-            mExpandRows.setOnClickListener(v -> {
-                if (!mExpanded) {
-                    VolumeRow ring = findRow(STREAM_RING);
-                    VolumeRow alarm = findRow(STREAM_ALARM);
-                    VolumeRow media = findRow(STREAM_MUSIC);
-                    VolumeRow active = getActiveRow();
-
-                    float width = mContext.getResources().getDimension(
-                            R.dimen.volume_dialog_panel_width) + mSpacer;
-                    float z = mElevation;
-
-                    boolean showMediaOutput = !Utils.isAudioModeOngoingCall(mContext) &&
-                            mMediaOutputView.getChildCount() > 0;
-
-                    if (showMediaOutput && !mODIServiceComponentEnabled) {
-                        animateViewIn(mMediaButtonView, false, width, z);
-                    } else if (mODIServiceComponentEnabled) {
-                        float widthMedia = width;
-                        if (showMediaOutput) {
-                            animateViewIn(mMediaButtonView, false, widthMedia, z / 2);
-                            widthMedia += widthMedia;
-                        }
-                        animateViewIn(mODICaptionsView, false, widthMedia, z);
-                        if (mPendingOdiCaptionsTooltip && mODICaptionsView != null) {
-                            showCaptionsTooltip();
-                            mPendingOdiCaptionsTooltip = false;
-                        }
-                    }
-
-                    if (alarm != null) {
-                        final boolean isAlarmVisible = active == alarm;
-                        animateViewIn(alarm.view, isAlarmVisible, 0, z);
-                        z /= 2;
-                        width = isAlarmVisible ? width/2 : width;
-                    }
-                    if (ring != null) {
-                        final boolean isRingVisible = active == ring;
-                        animateViewIn(ring.view, isRingVisible, width, z);
-                        z /= 2;
-                        width = isRingVisible ? width : width * 2;
-                    }
-                    if (media != null) {
-                        animateViewIn(media.view, true, width, z);
-                    }
-
-                    provideTouchHapticH(VibrationEffect.get(VibrationEffect.EFFECT_TICK));
-                    mExpanded = true;
-                } else {
-                    cleanExpandedRows();
-                    provideTouchHapticH(VibrationEffect.get(VibrationEffect.EFFECT_TICK));
-                    mExpanded = false;
-                }
-                mExpandRows.setExpanded(mExpanded);
-            });
-        }
-    }
-
-    private Animator circularReveal(View view, int x, int endRadius) {
-        if (view == null) return null;
-
-        Animator anim = ViewAnimationUtils.createCircularReveal(view, x,
-            isLandscape() ? 0 : (int) mHeight, 0, endRadius);
-
-        anim.setDuration(DIALOG_SHOW_ANIMATION_DURATION);
-        anim.setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator());
-        anim.addListener(new Animator.AnimatorListener() {
-            private boolean mIsCancelled;
-            private ViewPropertyAnimator mRowsAnimator;
-
-            @Override
-            public void onAnimationStart(Animator animation) {
-                mIsCancelled = false;
-                Util.setVisOrGone(view, true);
-                mRowsAnimator = mDialogRowsView.animate()
-                    .alpha(0f)
-                    .setDuration(DIALOG_SHOW_ANIMATION_DURATION)
-                    .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator());
-                mRowsAnimator.start();
-            }
-
-            @Override
-            public void onAnimationEnd (Animator animation) {
-                Util.setVisOrGone(mDialogRowsView, mIsCancelled);
-                mHandler.postDelayed(() -> mMediaTitleText.setSelected(true), 100);
-            }
-
-            @Override
-            public void onAnimationRepeat (Animator animation) { }
-
-            @Override
-            public void onAnimationCancel (Animator animation) {
-                mIsCancelled = true;
-                mRowsAnimator.cancel();
-            }
-        });
-        return anim;
-    }
-
-    private Animator circularExit(View view, int x, int endRadius) {
-        if (view == null) return null;
-
-        Animator anim = ViewAnimationUtils.createCircularReveal(view, x,
-            isLandscape() ? 0 : (int) mHeight, endRadius, 0);
-
-        anim.setDuration(DIALOG_SHOW_ANIMATION_DURATION);
-        anim.setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator());
-        anim.addListener(new Animator.AnimatorListener() {
-            private boolean mIsCancelled;
-
-            @Override
-            public void onAnimationStart(Animator animation) {
-                mIsCancelled = false;
-                Util.setVisOrGone(mDialogRowsView, true);
-                mDialogRowsView.setAlpha(1f);
-            }
-
-            @Override
-            public void onAnimationEnd (Animator animation) {
-                Util.setVisOrGone(view, mIsCancelled);
-                mMediaTitleText.setSelected(false);
-            }
-
-            @Override
-            public void onAnimationRepeat (Animator animation) { }
-
-            @Override
-            public void onAnimationCancel (Animator animation) {
-                mIsCancelled = true;
-            }
-        });
-        return anim;
-    }
-
-    private void animateViewIn(View view, boolean wasVisible, float startX, float startZ) {
-        if (view == null) return;
-
-        float startAlpha = 0f;
-        if (wasVisible) {
-            startZ = 0;
-            startAlpha = 1f;
-        } else {
-            startZ = -startZ;
-        }
-
-        view.setTranslationX(isAudioPanelOnLeftSide() ? -startX : startX);
-        view.setTranslationZ(startZ);
-        view.setAlpha(startAlpha);
-        Util.setVisOrGone(view, true);
-        view.animate()
-            .alpha(1f)
-            .translationX(0f)
-            .translationZ(0f)
-            .setDuration(DIALOG_SHOW_ANIMATION_DURATION)
-            .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator())
-            .withEndAction(() -> {
-                Util.setVisOrGone(view, true);
-                view.setTranslationX(0f);
-                view.setTranslationZ(0f);
-            })
-            .start();
-    }
-
-    private void animateViewOut(View view, boolean stayVisible, float endX, float endZ) {
-        if (view == null) return;
-
-        float endAlpha = 0f;
-        if (stayVisible) {
-            endZ = 0;
-            endAlpha = 1f;
-        } else {
-            endZ = -endZ;
-        }
-
-        view.animate()
-            .alpha(endAlpha)
-            .translationX(isAudioPanelOnLeftSide() ? -endX : endX)
-            .translationZ(endZ)
-            .setDuration(DIALOG_SHOW_ANIMATION_DURATION)
-            .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator())
-            .withEndAction(() -> {
-                Util.setVisOrGone(view, stayVisible);
-                view.setTranslationX(0);
-                view.setTranslationZ(0);
-                view.setAlpha(1);
-            })
-            .start();
-    }
-
-    @Override
-    public void onDeviceListUpdate(List<MediaDevice> devices) {
-        mMediaDevices.clear();
-        mMediaDevices.addAll(devices);
-        if (!mHandler.hasMessages(H.UPDATE_MEDIA_OUTPUT_VIEW)) {
-            mHandler.sendEmptyMessageDelayed(H.UPDATE_MEDIA_OUTPUT_VIEW, 30);
-        }
-    }
-
-    @Override
-    public void onSelectedDeviceStateChanged(MediaDevice device, int state) {
-        // Do nothing
-    }
-
-    private void updateMediaOutputViewH() {
-        // update/add/remove existing views
-        final String activeText = mContext
-            .getString(com.android.settingslib.R.string.bluetooth_active_no_battery_level);
-        for (MediaOutputRow row : mMediaOutputRows) {
-            if (mMediaDevices.contains(row.device)) {
-                if (row.device.isConnected()) {
-                    row.name.setText(row.device.getName());
-                    if (row.device.getSummary() != null) {
-                        Util.setVisOrGone(row.summary, !row.device.getSummary().equals(""));
-                        row.summary.setText(row.device.getSummary());
-                        Util.setVisOrGone(row.selected,
-                                row.device.getSummary().contains(activeText));
-                    } else {
-                        Util.setVisOrGone(row.summary, false);
-                        Util.setVisOrGone(row.selected, false);
-                    }
-                    if (!row.addedToGroup) {
-                        mMediaOutputView.addView(row.view);
-                        row.addedToGroup = true;
-                    }
-                } else {
-                    mMediaOutputView.removeView(row.view);
-                    row.addedToGroup = false;
-                }
-                // remove the device that has been handled
-                mMediaDevices.remove(row.device);
-            } else {
-                mMediaOutputView.removeView(row.view);
-                row.addedToGroup = false;
-            }
-        }
-
-
-        // handle the remaining devices
-        for (MediaDevice device : mMediaDevices) {
-            if (device.isConnected()) {
-                // This device does not have a corresponding row yet, make one.
-                MediaOutputRow row = new MediaOutputRow();
-                row.device = device;
-                row.view = mDialog.getLayoutInflater().inflate(R.layout.volume_dialog_media_output,
-                        mMediaOutputView, false);
-                row.view.setOnClickListener(v -> {
-                        provideTouchHapticH(VibrationEffect.get(VibrationEffect.EFFECT_CLICK));
-                        //mLocalMediaManager.connectDevice(device);
-                });
-                row.name = row.view.findViewById(R.id.media_output_text);
-                row.summary = row.view.findViewById(R.id.media_output_summary);
-                row.selected = row.view.findViewById(R.id.media_output_selected);
-                row.icon = row.view.findViewById(R.id.media_output_icon);
-                Drawable drawable = device.getIcon();
-                if (drawable == null) {
-                    drawable = mContext.getDrawable(
-                            com.android.internal.R.drawable.ic_bt_headphones_a2dp);
-                }
-                row.icon.setImageDrawable(drawable);
-
-                row.name.setText(device.getName());
-                if (device.getSummary() != null) {
-                    Util.setVisOrGone(row.summary, !device.getSummary().equals(""));
-                    row.summary.setText(device.getSummary());
-                    Util.setVisOrGone(row.selected, row.device.getSummary().contains(activeText));
-                } else {
-                    Util.setVisOrGone(row.summary, false);
-                    Util.setVisOrGone(row.selected, false);
-                }
-                row.name.setSelected(true);
-                row.summary.setSelected(true);
-
-                row.addedToGroup = true;
-                mMediaOutputView.addView(row.view);
-                mMediaOutputRows.add(row);
-            }
-        }
-        if (mMediaOutputView.getChildCount() == 1) {
-            // This means there are no external devices connected
-            removeAllMediaOutputRows();
-        }
-    }
-
-    private void removeAllMediaOutputRows() {
-        mMediaOutputView.removeAllViews();
-        mMediaOutputRows.clear();
-    }
-
-    public void initRingerH() {
-        if (mRingerIcon != null) {
-            mRingerIcon.setAccessibilityLiveRegion(ACCESSIBILITY_LIVE_REGION_POLITE);
-            mRingerIcon.setOnClickListener(v -> {
-                Prefs.putBoolean(mContext, Prefs.Key.TOUCHED_RINGER_TOGGLE, true);
-                final StreamState ss = mState.states.get(AudioManager.STREAM_RING);
-                if (ss == null) {
-                    return;
-                }
-                // normal -> vibrate -> silent -> normal (skip vibrate if device doesn't have
-                // a vibrator.
-                int newRingerMode;
-                final boolean hasVibrator = mController.hasVibrator();
-                if (mState.ringerModeInternal == AudioManager.RINGER_MODE_NORMAL) {
-                    if (hasVibrator) {
-                        newRingerMode = AudioManager.RINGER_MODE_VIBRATE;
-                    } else {
-                        newRingerMode = AudioManager.RINGER_MODE_SILENT;
-                    }
-                } else if (mState.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE) {
-                    newRingerMode = AudioManager.RINGER_MODE_SILENT;
-                } else {
-                    newRingerMode = AudioManager.RINGER_MODE_NORMAL;
-                    if (ss.level == 0) {
-                        mController.setStreamVolume(AudioManager.STREAM_RING, 1);
-                    }
-                }
-                Events.writeEvent(mContext, Events.EVENT_RINGER_TOGGLE, newRingerMode);
-                incrementManualToggleCount();
-                updateRingerH();
-                provideTouchFeedbackH(newRingerMode);
-                mController.setRingerMode(newRingerMode, false);
-                maybeShowToastH(newRingerMode);
-            });
-        }
-        updateRingerH();
-    }
-
-    private void initODICaptionsH() {
-        if (mODICaptionsIcon != null) {
-            mODICaptionsIcon.setOnConfirmedTapListener(() -> {
-                onCaptionIconClicked();
-                Events.writeEvent(mContext, Events.EVENT_ODI_CAPTIONS_CLICK);
-            }, mHandler);
-        }
-
-        mController.getCaptionsComponentState(false);
-    }
-
-    private void checkODICaptionsTooltip(boolean fromDismiss) {
-        if (!mHasSeenODICaptionsTooltip && !fromDismiss && mODICaptionsTooltipViewStub != null) {
-            mController.getCaptionsComponentState(true);
-        } else {
-            if (mHasSeenODICaptionsTooltip && fromDismiss && mODICaptionsTooltipView != null) {
-                hideCaptionsTooltip();
-            }
-        }
-    }
-
-    protected void showCaptionsTooltip() {
-        if (!mHasSeenODICaptionsTooltip && mODICaptionsTooltipViewStub != null) {
-            mODICaptionsTooltipView = mODICaptionsTooltipViewStub.inflate();
-            mODICaptionsTooltipView.findViewById(R.id.dismiss).setOnClickListener(v -> {
-                hideCaptionsTooltip();
-                Events.writeEvent(mContext, Events.EVENT_ODI_CAPTIONS_TOOLTIP_CLICK);
-            });
-            mODICaptionsTooltipViewStub = null;
-            rescheduleTimeoutH();
-        }
-
-        if (mODICaptionsTooltipView != null) {
-            mODICaptionsTooltipView.setAlpha(0.f);
-            mODICaptionsTooltipView.animate()
-                .alpha(1.f)
-                .setStartDelay(DIALOG_SHOW_ANIMATION_DURATION)
-                .withEndAction(() -> {
-                    if (D.BUG) Log.d(TAG, "tool:checkODICaptionsTooltip() putBoolean true");
-                    Prefs.putBoolean(mContext,
-                            Prefs.Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, true);
-                    mHasSeenODICaptionsTooltip = true;
-                    if (mODICaptionsIcon != null) {
-                        mODICaptionsIcon
-                                .postOnAnimation(getSinglePressFor(mODICaptionsIcon));
-                    }
-                })
-                .start();
-        }
-    }
-
-    private void hideCaptionsTooltip() {
-        if (mODICaptionsTooltipView != null && mODICaptionsTooltipView.getVisibility() == VISIBLE) {
-            mODICaptionsTooltipView.animate().cancel();
-            mODICaptionsTooltipView.setAlpha(1.f);
-            mODICaptionsTooltipView.animate()
-                    .alpha(0.f)
-                    .setStartDelay(0)
-                    .setDuration(DIALOG_HIDE_ANIMATION_DURATION)
-                    .withEndAction(() -> mODICaptionsTooltipView.setVisibility(GONE))
-                    .start();
-        }
-    }
-
-    protected void tryToRemoveCaptionsTooltip() {
-        if (mHasSeenODICaptionsTooltip && mODICaptionsTooltipView != null) {
-            mDialogView.removeView(mODICaptionsTooltipView);
-            mODICaptionsTooltipView = null;
-        }
-    }
-
-    private void updateODICaptionsH(boolean isServiceComponentEnabled, boolean fromTooltip) {
-        mODIServiceComponentEnabled = isServiceComponentEnabled;
-
-        if (!mODIServiceComponentEnabled) return;
-
-        updateCaptionsIcon();
-        if (fromTooltip) mPendingOdiCaptionsTooltip = true;
-    }
-
-    private void updateCaptionsIcon() {
-        boolean captionsEnabled = mController.areCaptionsEnabled();
-        if (mODICaptionsIcon.getCaptionsEnabled() != captionsEnabled) {
-            mHandler.post(mODICaptionsIcon.setCaptionsEnabled(captionsEnabled));
-        }
-
-        boolean isOptedOut = mController.isCaptionStreamOptedOut();
-        if (mODICaptionsIcon.getOptedOut() != isOptedOut) {
-            mHandler.post(() -> mODICaptionsIcon.setOptedOut(isOptedOut));
-        }
-    }
-
-    private void onCaptionIconClicked() {
-        boolean isEnabled = mController.areCaptionsEnabled();
-        mController.setCaptionsEnabled(!isEnabled);
-        updateCaptionsIcon();
-    }
-
-    private void incrementManualToggleCount() {
-        ContentResolver cr = mContext.getContentResolver();
-        int ringerCount = Settings.Secure.getInt(cr, Settings.Secure.MANUAL_RINGER_TOGGLE_COUNT, 0);
-        Settings.Secure.putInt(cr, Settings.Secure.MANUAL_RINGER_TOGGLE_COUNT, ringerCount + 1);
-    }
-
-    private void provideTouchFeedbackH(int newRingerMode) {
-        VibrationEffect effect = null;
-        switch (newRingerMode) {
-            case RINGER_MODE_NORMAL:
-                mController.scheduleTouchFeedback();
-                break;
-            case RINGER_MODE_SILENT:
-                effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
-                break;
-            case RINGER_MODE_VIBRATE:
-                effect = VibrationEffect.get(VibrationEffect.EFFECT_THUD);
-                break;
-            default:
-                effect = VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
-        }
-        if (effect != null) {
-            mController.vibrate(effect);
-        }
-    }
-
-    private void provideTouchHapticH(VibrationEffect effect) {
-        mController.vibrate(effect);
-    }
-
-    private void provideSliderHapticFeedbackH() {
-        VibrationEffect effect = VibrationEffect.get(VibrationEffect.EFFECT_TEXTURE_TICK);
-        mController.vibrate(effect);
-    }
-
-    private void maybeShowToastH(int newRingerMode) {
-        int seenToastCount = Prefs.getInt(mContext, Prefs.Key.SEEN_RINGER_GUIDANCE_COUNT, 0);
-
-        if (seenToastCount > VolumePrefs.SHOW_RINGER_TOAST_COUNT) {
-            return;
-        }
-        CharSequence toastText = null;
-        switch (newRingerMode) {
-            case RINGER_MODE_NORMAL:
-                final StreamState ss = mState.states.get(AudioManager.STREAM_RING);
-                if (ss != null) {
-                    toastText = mContext.getString(
-                            R.string.volume_dialog_ringer_guidance_ring,
-                            Utils.formatPercentage(ss.level, ss.levelMax));
-                }
-                break;
-            case RINGER_MODE_SILENT:
-                toastText = mContext.getString(
-                        com.android.internal.R.string.volume_dialog_ringer_guidance_silent);
-                break;
-            case RINGER_MODE_VIBRATE:
-            default:
-                toastText = mContext.getString(
-                        com.android.internal.R.string.volume_dialog_ringer_guidance_vibrate);
-        }
-
-        Toast.makeText(mContext, toastText, Toast.LENGTH_SHORT).show();
-        seenToastCount++;
-        Prefs.putInt(mContext, Prefs.Key.SEEN_RINGER_GUIDANCE_COUNT, seenToastCount);
-    }
-
-    public void show(int reason) {
-        mHandler.obtainMessage(H.SHOW, reason, 0).sendToTarget();
-    }
-
-    public void dismiss(int reason) {
-        mHandler.obtainMessage(H.DISMISS, reason, 0).sendToTarget();
-    }
-
-    private void showH(int reason) {
-        if (D.BUG) Log.d(TAG, "showH r=" + Events.SHOW_REASONS[reason]);
-        mHandler.removeMessages(H.SHOW);
-        mHandler.removeMessages(H.DISMISS);
-        rescheduleTimeoutH();
-
-        if (mConfigChanged) {
-            removeAllMediaOutputRows();
-            initDialog(); // resets mShowing to false
-            mConfigurableTexts.update();
-            mShowingMediaDevices = false;
-            mConfigChanged = false;
-        }
-        initSettingsH();
-        mShowing = true;
-        mDialog.show();
-        Events.writeEvent(mContext, Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked());
-        mController.notifyVisible(true);
-        mController.getCaptionsComponentState(false);
-        checkODICaptionsTooltip(false);
-    }
-
-    protected void rescheduleTimeoutH() {
-        mHandler.removeMessages(H.DISMISS);
-        final int timeout = computeTimeoutH();
-        mHandler.sendMessageDelayed(mHandler
-                .obtainMessage(H.DISMISS, Events.DISMISS_REASON_TIMEOUT, 0), timeout);
-        if (D.BUG) Log.d(TAG, "rescheduleTimeout " + timeout + " " + Debug.getCaller());
-        mController.userActivity();
-    }
-
-    private int computeTimeoutH() {
-        if (mHovering) {
-            return mAccessibilityMgr.getRecommendedTimeoutMillis(DIALOG_HOVERING_TIMEOUT_MILLIS,
-                    AccessibilityManager.FLAG_CONTENT_CONTROLS);
-        }
-        if (mSafetyWarning != null) {
-            return mAccessibilityMgr.getRecommendedTimeoutMillis(
-                    DIALOG_SAFETYWARNING_TIMEOUT_MILLIS,
-                    AccessibilityManager.FLAG_CONTENT_TEXT
-                            | AccessibilityManager.FLAG_CONTENT_CONTROLS);
-        }
-        if (!mHasSeenODICaptionsTooltip && mODICaptionsTooltipView != null) {
-            return mAccessibilityMgr.getRecommendedTimeoutMillis(
-                    DIALOG_ODI_CAPTIONS_TOOLTIP_TIMEOUT_MILLIS,
-                    AccessibilityManager.FLAG_CONTENT_TEXT
-                            | AccessibilityManager.FLAG_CONTENT_CONTROLS);
-        }
-        return mAccessibilityMgr.getRecommendedTimeoutMillis(DIALOG_TIMEOUT_MILLIS,
-                AccessibilityManager.FLAG_CONTENT_CONTROLS);
-    }
-
-    protected void dismissH(int reason) {
-        if (D.BUG) {
-            Log.d(TAG, "mDialog.dismiss() reason: " + Events.DISMISS_REASONS[reason]
-                    + " from: " + Debug.getCaller());
-        }
-        /*if (mLocalMediaManager != null) {
-            mLocalMediaManager.stopScan();
-        }*/
-        if (!mShowing) {
-            // This may happen when dismissing an expanded panel, don't animate again
-            return;
-        }
-        mHandler.removeMessages(H.DISMISS);
-        mHandler.removeMessages(H.SHOW);
-        mDialogView.animate().cancel();
-        if (mShowing) {
-            mShowing = false;
-            // Only logs when the volume dialog visibility is changed.
-            Events.writeEvent(mContext, Events.EVENT_DISMISS_DIALOG, reason);
-        }
-        mDialogView.setTranslationX(0);
-        mDialogView.setAlpha(1);
-        ViewPropertyAnimator animator = mDialogView.animate()
-                .alpha(0)
-                .setDuration(DIALOG_HIDE_ANIMATION_DURATION)
-                .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator())
-                .withEndAction(() -> mHandler.postDelayed(() -> {
-                    mDialog.dismiss();
-                    tryToRemoveCaptionsTooltip();
-                    mExpanded = false;
-                    cleanExpandedRows();
-                    mExpandRows.setExpanded(mExpanded);
-                }, 50));
-        if (!isLandscape()) {
-            animator.translationX(
-                    (mDialogView.getWidth() / 2.0f) * (!isAudioPanelOnLeftSide() ? 1 : -1));
-        }
-        animator.start();
-        checkODICaptionsTooltip(true);
-        mController.notifyVisible(false);
-        synchronized (mSafetyWarningLock) {
-            if (mSafetyWarning != null) {
-                if (D.BUG) Log.d(TAG, "SafetyWarning dismissed");
-                mSafetyWarning.dismiss();
-            }
-        }
-    }
-
-    private boolean showActiveStreamOnly() {
-        return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK)
-                || mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEVISION);
-    }
-
-    private boolean shouldBeVisibleH(VolumeRow row, VolumeRow activeRow) {
-        if (row.stream == activeRow.stream) {
-            return true;
-        }
-
-        if (!mShowActiveStreamOnly) {
-            if (row.stream == STREAM_ACCESSIBILITY) {
-                return mShowA11yStream;
-            }
-
-            if (row.stream == mPrevActiveStream) {
-                return true;
-            }
-
-            if (row.stream == STREAM_MUSIC) {
-                return true;
-            }
-
-            if (row.defaultStream) {
-                return activeRow.stream == STREAM_RING
-                        || activeRow.stream == STREAM_ALARM
-                        || activeRow.stream == STREAM_VOICE_CALL
-                        || activeRow.stream == STREAM_ACCESSIBILITY
-                        || mDynamic.get(activeRow.stream);
-            }
-        }
-
-        return false;
-    }
-
-    private void updateRowsH(final VolumeRow activeRow) {
-        if (D.BUG) Log.d(TAG, "updateRowsH");
-        if (!mShowing) {
-            trimObsoleteH();
-        }
-
-        // apply changes to all rows
-        for (final VolumeRow row : mRows) {
-            final boolean isActive = row == activeRow;
-            final boolean shouldBeVisible = shouldBeVisibleH(row, activeRow);
-            if(!mExpanded) {
-                Util.setVisOrGone(row.view, shouldBeVisible);
-            }
-            if (row.view.isShown()) {
-                updateVolumeRowTintH(row, isActive);
-            }
-        }
-    }
-
-    protected void updateRingerH() {
-        if (mState != null) {
-            final StreamState ss = mState.states.get(AudioManager.STREAM_RING);
-            final VolumeRow row = findRow(STREAM_RING);
-            if (ss == null) {
-                return;
-            }
-
-            boolean isZenMuted = mState.zenMode == Global.ZEN_MODE_ALARMS
-                    || mState.zenMode == Global.ZEN_MODE_NO_INTERRUPTIONS
-                    || (mState.zenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS
-                        && mState.disallowRinger);
-            enableRingerViewsH(!isZenMuted);
-            switch (mState.ringerModeInternal) {
-                case AudioManager.RINGER_MODE_VIBRATE:
-                    mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_vibrate);
-                    addAccessibilityDescription(mRingerIcon, RINGER_MODE_VIBRATE,
-                            mContext.getString(R.string.volume_ringer_hint_mute));
-                    mRingerIcon.setTag(Events.ICON_STATE_VIBRATE);
-                    if (mHasAlertSlider) {
-                        row.slider.setProgress(ss.levelMin * 100, true);
-                        Util.setText(row.header, Utils.formatPercentage(ss.levelMin, ss.levelMax));
-                    }
-                    break;
-                case AudioManager.RINGER_MODE_SILENT:
-                    mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute);
-                    mRingerIcon.setTag(Events.ICON_STATE_MUTE);
-                    addAccessibilityDescription(mRingerIcon, RINGER_MODE_SILENT,
-                            mContext.getString(R.string.volume_ringer_hint_unmute));
-                    if (mHasAlertSlider) {
-                        row.slider.setProgress(ss.levelMin * 100, true);
-                        Util.setText(row.header, Utils.formatPercentage(ss.levelMin, ss.levelMax));
-                    }
-                    break;
-                case AudioManager.RINGER_MODE_NORMAL:
-                default:
-                    boolean muted = (mAutomute && ss.level == 0) || ss.muted;
-                    if (!isZenMuted && muted) {
-                        mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute);
-                        addAccessibilityDescription(mRingerIcon, RINGER_MODE_NORMAL,
-                                mContext.getString(R.string.volume_ringer_hint_unmute));
-                        mRingerIcon.setTag(Events.ICON_STATE_MUTE);
-                    } else {
-                        mRingerIcon.setImageResource(R.drawable.ic_volume_ringer);
-                        if (mController.hasVibrator()) {
-                            addAccessibilityDescription(mRingerIcon, RINGER_MODE_NORMAL,
-                                    mContext.getString(R.string.volume_ringer_hint_vibrate));
-                        } else {
-                            addAccessibilityDescription(mRingerIcon, RINGER_MODE_NORMAL,
-                                    mContext.getString(R.string.volume_ringer_hint_mute));
-                        }
-                        mRingerIcon.setTag(Events.ICON_STATE_UNMUTE);
-                    }
-                    break;
-            }
-        }
-    }
-
-    private void addAccessibilityDescription(View view, int currState, String hintLabel) {
-        int currStateResId;
-        switch (currState) {
-            case RINGER_MODE_SILENT:
-                currStateResId = R.string.volume_ringer_status_silent;
-                break;
-            case RINGER_MODE_VIBRATE:
-                currStateResId = R.string.volume_ringer_status_vibrate;
-                break;
-            case RINGER_MODE_NORMAL:
-            default:
-                currStateResId = R.string.volume_ringer_status_normal;
-        }
-
-        view.setContentDescription(mContext.getString(currStateResId));
-        view.setAccessibilityDelegate(new AccessibilityDelegate() {
-            public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
-                super.onInitializeAccessibilityNodeInfo(host, info);
-                info.addAction(new AccessibilityNodeInfo.AccessibilityAction(
-                                AccessibilityNodeInfo.ACTION_CLICK, hintLabel));
-            }
-        });
-    }
-
-    /**
-     * Toggles enable state of views in a VolumeRow (not including seekbar or icon)
-     * Hides/shows zen icon
-     * @param enable whether to enable volume row views and hide dnd icon
-     */
-    private void enableVolumeRowViewsH(VolumeRow row, boolean enable) {
-        boolean showDndIcon = !enable;
-        row.dndIcon.setVisibility(showDndIcon ? VISIBLE : GONE);
-    }
-
-    /**
-     * Toggles enable state of footer/ringer views
-     * Hides/shows zen icon
-     * @param enable whether to enable ringer views and hide dnd icon
-     */
-    private void enableRingerViewsH(boolean enable) {
-        if (mRingerIcon != null) {
-            mRingerIcon.setEnabled(enable);
-        }
-        if (mZenIcon != null) {
-            mZenIcon.setVisibility(enable ? GONE : VISIBLE);
-        }
-    }
-
-    private void trimObsoleteH() {
-        if (D.BUG) Log.d(TAG, "trimObsoleteH");
-        for (int i = mRows.size() - 1; i >= 0; i--) {
-            final VolumeRow row = mRows.get(i);
-            if (row.ss == null || !row.ss.dynamic) continue;
-            if (!mDynamic.get(row.stream)) {
-                mRows.remove(i);
-                mDialogRowsView.removeView(row.view);
-            }
-        }
-    }
-
-    protected void onStateChangedH(State state) {
-        if (D.BUG) Log.d(TAG, "onStateChangedH() state: " + state.toString());
-        if (mState != null && state != null
-                && mState.ringerModeInternal != state.ringerModeInternal
-                && state.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE) {
-            mController.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_HEAVY_CLICK));
-        }
-
-        mState = state;
-        mDynamic.clear();
-        // add any new dynamic rows
-        for (int i = 0; i < state.states.size(); i++) {
-            final int stream = state.states.keyAt(i);
-            final StreamState ss = state.states.valueAt(i);
-            if (!ss.dynamic) continue;
-            mDynamic.put(stream, true);
-            if (findRow(stream) == null) {
-                addRow(stream, R.drawable.ic_volume_remote, R.drawable.ic_volume_remote_mute, true,
-                        false, true);
-            }
-        }
-
-        if (mActiveStream != state.activeStream) {
-            mPrevActiveStream = mActiveStream;
-            mActiveStream = state.activeStream;
-            VolumeRow activeRow = getActiveRow();
-            updateRowsH(activeRow);
-            if (mShowing) rescheduleTimeoutH();
-        }
-        for (VolumeRow row : mRows) {
-            updateVolumeRowH(row);
-        }
-        updateRingerH();
-        mWindow.setTitle(composeWindowTitle());
-    }
-
-    CharSequence composeWindowTitle() {
-        return mContext.getString(R.string.volume_dialog_title, getStreamLabelH(getActiveRow().ss));
-    }
-
-    private void updateVolumeRowH(VolumeRow row) {
-        if (D.BUG) Log.i(TAG, "updateVolumeRowH s=" + row.stream);
-        if (mState == null) return;
-        final StreamState ss = mState.states.get(row.stream);
-        if (ss == null) return;
-        row.ss = ss;
-        if (ss.level == row.requestedLevel) {
-            row.requestedLevel = -1;
-        }
-        final boolean isA11yStream = row.stream == STREAM_ACCESSIBILITY;
-        final boolean isRingStream = row.stream == AudioManager.STREAM_RING;
-        final boolean isSystemStream = row.stream == AudioManager.STREAM_SYSTEM;
-        final boolean isAlarmStream = row.stream == STREAM_ALARM;
-        final boolean isMusicStream = row.stream == AudioManager.STREAM_MUSIC;
-        final boolean isRingVibrate = isRingStream
-                && mState.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE;
-        final boolean isRingSilent = isRingStream
-                && mState.ringerModeInternal == AudioManager.RINGER_MODE_SILENT;
-        final boolean isZenPriorityOnly = mState.zenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
-        final boolean isZenAlarms = mState.zenMode == Global.ZEN_MODE_ALARMS;
-        final boolean isZenNone = mState.zenMode == Global.ZEN_MODE_NO_INTERRUPTIONS;
-        final boolean zenMuted = isZenAlarms ? (isRingStream || isSystemStream)
-                : isZenNone ? (isRingStream || isSystemStream || isAlarmStream || isMusicStream)
-                : isZenPriorityOnly ? ((isAlarmStream && mState.disallowAlarms) ||
-                        (isMusicStream && mState.disallowMedia) ||
-                        (isRingStream && mState.disallowRinger) ||
-                        (isSystemStream && mState.disallowSystem))
-                : false;
-
-        // update slider max
-        final int max = ss.levelMax * 100;
-        if (max != row.slider.getMax()) {
-            row.slider.setMax(max);
-        }
-        // update slider min
-        final int min = ss.levelMin * 100;
-        if (min != row.slider.getMin()) {
-            row.slider.setMin(min);
-        }
-
-        row.slider.setContentDescription(getStreamLabelH(ss));
-
-        // update icon
-        final boolean iconEnabled = (mAutomute || ss.muteSupported) && !zenMuted;
-        row.icon.setEnabled(iconEnabled);
-        final int iconRes =
-                isRingVibrate ? R.drawable.ic_volume_ringer_vibrate
-                : isRingSilent || zenMuted ? row.iconMuteRes
-                : ss.routedToBluetooth ?
-                        (ss.muted ? R.drawable.ic_volume_media_bt_mute
-                                : R.drawable.ic_volume_media_bt)
-                : mAutomute && ss.level == 0 ? row.iconMuteRes
-                : (ss.muted ? row.iconMuteRes : row.iconRes);
-        row.icon.setImageResource(iconRes);
-        if (iconEnabled) {
-            if (isRingStream) {
-                if (isRingVibrate) {
-                    row.icon.setContentDescription(mContext.getString(
-                            R.string.volume_stream_content_description_unmute,
-                            getStreamLabelH(ss)));
-                } else {
-                    if (mController.hasVibrator()) {
-                        row.icon.setContentDescription(mContext.getString(
-                                mShowA11yStream
-                                        ? R.string.volume_stream_content_description_vibrate_a11y
-                                        : R.string.volume_stream_content_description_vibrate,
-                                getStreamLabelH(ss)));
-                    } else {
-                        row.icon.setContentDescription(mContext.getString(
-                                mShowA11yStream
-                                        ? R.string.volume_stream_content_description_mute_a11y
-                                        : R.string.volume_stream_content_description_mute,
-                                getStreamLabelH(ss)));
-                    }
-                }
-            } else if (isA11yStream) {
-                row.icon.setContentDescription(getStreamLabelH(ss));
-            } else {
-                if (ss.muted || mAutomute && ss.level == 0) {
-                   row.icon.setContentDescription(mContext.getString(
-                           R.string.volume_stream_content_description_unmute,
-                           getStreamLabelH(ss)));
-                } else {
-                    row.icon.setContentDescription(mContext.getString(
-                            mShowA11yStream
-                                    ? R.string.volume_stream_content_description_mute_a11y
-                                    : R.string.volume_stream_content_description_mute,
-                            getStreamLabelH(ss)));
-                }
-            }
-        } else {
-            row.icon.setContentDescription(getStreamLabelH(ss));
-        }
-
-        // ensure tracking is disabled if zenMuted
-        if (zenMuted) {
-            row.tracking = false;
-        }
-        enableVolumeRowViewsH(row, !zenMuted);
-
-        // update slider
-        final boolean enableSlider = !zenMuted;
-        final int vlevel = row.ss.muted && (!isRingStream && !zenMuted) ? 0
-                : row.ss.level;
-        updateVolumeRowSliderH(row, enableSlider, vlevel);
-    }
-
-    private void updateVolumeRowTintH(VolumeRow row, boolean isActive) {
-        if (isActive) {
-            row.slider.requestFocus();
-        }
-        boolean useActiveColoring = isActive && row.slider.isEnabled();
-        final ColorStateList tint = useActiveColoring
-                ? Utils.getColorAccent(mContext).withAlpha(mDarkMode ?
-                        SLIDER_PROGRESS_ALPHA_ACTIVE_DARK : SLIDER_PROGRESS_ALPHA_ACTIVE)
-                : Utils.getColorAccent(mContext).withAlpha(mDarkMode ?
-                        SLIDER_PROGRESS_ALPHA_DARK : SLIDER_PROGRESS_ALPHA);
-        if (tint == row.cachedTint) return;
-        row.slider.setProgressTintList(tint);
-        row.cachedTint = tint;
-    }
-
-    private void updateVolumeRowSliderH(VolumeRow row, boolean enable, int vlevel) {
-        row.slider.setEnabled(enable);
-        updateVolumeRowTintH(row, row.stream == mActiveStream);
-        if (row.tracking) {
-            return;  // don't update if user is sliding
-        }
-        final int progress = row.slider.getProgress();
-        final int level = getImpliedLevel(row.slider, progress);
-        final boolean rowVisible = row.view.getVisibility() == VISIBLE;
-        final boolean inGracePeriod = (SystemClock.uptimeMillis() - row.userAttempt)
-                < USER_ATTEMPT_GRACE_PERIOD;
-        mHandler.removeMessages(H.RECHECK, row);
-        if (mShowing && rowVisible && inGracePeriod) {
-            if (D.BUG) Log.d(TAG, "inGracePeriod");
-            mHandler.sendMessageAtTime(mHandler.obtainMessage(H.RECHECK, row),
-                    row.userAttempt + USER_ATTEMPT_GRACE_PERIOD);
-            return;  // don't update if visible and in grace period
-        }
-        if (vlevel == level) {
-            if (mShowing && rowVisible) {
-                return;  // don't clamp if visible
-            }
-        }
-        final int newProgress = vlevel * 100;
-        if (progress != newProgress && !row.ss.muted) {
-            if (mShowing && rowVisible) {
-                // animate!
-                if (row.anim != null && row.anim.isRunning()
-                        && row.animTargetProgress == newProgress) {
-                    return;  // already animating to the target progress
-                }
-                // start/update animation
-                if (row.anim == null) {
-                    row.anim = ObjectAnimator.ofInt(row.slider, "progress", progress, newProgress);
-                    row.anim.setInterpolator(new DecelerateInterpolator());
-                } else {
-                    row.anim.cancel();
-                    row.anim.setIntValues(progress, newProgress);
-                }
-                row.animTargetProgress = newProgress;
-                row.anim.setDuration(UPDATE_ANIMATION_DURATION);
-                row.anim.start();
-            } else {
-                // update slider directly to clamped value
-                if (row.anim != null) {
-                    row.anim.cancel();
-                }
-                row.slider.setProgress(newProgress, true);
-            }
-        }
-
-        // update header text
-        Util.setText(row.header, Utils.formatPercentage((enable && !row.ss.muted)
-                        ? vlevel : 0, row.ss.levelMax));
-    }
-
-    private void recheckH(VolumeRow row) {
-        if (row == null) {
-            if (D.BUG) Log.d(TAG, "recheckH ALL");
-            trimObsoleteH();
-            for (VolumeRow r : mRows) {
-                updateVolumeRowH(r);
-            }
-        } else {
-            if (D.BUG) Log.d(TAG, "recheckH " + row.stream);
-            updateVolumeRowH(row);
-        }
-    }
-
-    private void setStreamImportantH(int stream, boolean important) {
-        for (VolumeRow row : mRows) {
-            if (row.stream == stream) {
-                row.important = important;
-                return;
-            }
-        }
-    }
-
-    private void showSafetyWarningH(int flags) {
-        if ((flags & (AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_SHOW_UI_WARNINGS)) != 0
-                || mShowing) {
-            synchronized (mSafetyWarningLock) {
-                if (mSafetyWarning != null) {
-                    return;
-                }
-                mSafetyWarning = new SafetyWarningDialog(mContext, mController.getAudioManager()) {
-                    @Override
-                    protected void cleanUp() {
-                        synchronized (mSafetyWarningLock) {
-                            mSafetyWarning = null;
-                        }
-                        recheckH(null);
-                    }
-                };
-                mSafetyWarning.show();
-            }
-            recheckH(null);
-        }
-        rescheduleTimeoutH();
-    }
-
-    private String getStreamLabelH(StreamState ss) {
-        if (ss == null) {
-            return "";
-        }
-        if (ss.remoteLabel != null) {
-            return ss.remoteLabel;
-        }
-        try {
-            return mContext.getResources().getString(ss.name);
-        } catch (Resources.NotFoundException e) {
-            Slog.e(TAG, "Can't find translation for stream " + ss);
-            return "";
-        }
-    }
-
-    private Runnable getSinglePressFor(ImageButton button) {
-        return () -> {
-            if (button != null) {
-                button.setPressed(true);
-                button.postOnAnimationDelayed(getSingleUnpressFor(button), 200);
-            }
-        };
-    }
-
-    private Runnable getSingleUnpressFor(ImageButton button) {
-        return () -> {
-            if (button != null) {
-                button.setPressed(false);
-            }
-        };
-    }
-
-    private final VolumeDialogController.Callbacks mControllerCallbackH
-            = new VolumeDialogController.Callbacks() {
-        @Override
-        public void onShowRequested(int reason) {
-            showH(reason);
-        }
-
-        @Override
-        public void onDismissRequested(int reason) {
-            dismissH(reason);
-        }
-
-        @Override
-        public void onScreenOff() {
-            dismissH(Events.DISMISS_REASON_SCREEN_OFF);
-        }
-
-        @Override
-        public void onStateChanged(State state) {
-            onStateChangedH(state);
-        }
-
-        @Override
-        public void onLayoutDirectionChanged(int layoutDirection) {
-            mDialogView.setLayoutDirection(layoutDirection);
-        }
-
-        @Override
-        public void onConfigurationChanged() {
-            mDialog.dismiss();
-            mConfigChanged = true;
-        }
-
-        @Override
-        public void onShowVibrateHint() {
-            if (mSilentMode) {
-                mController.setRingerMode(AudioManager.RINGER_MODE_SILENT, false);
-            }
-        }
-
-        @Override
-        public void onShowSilentHint() {
-            if (mSilentMode) {
-                mController.setRingerMode(AudioManager.RINGER_MODE_NORMAL, false);
-            }
-        }
-
-        @Override
-        public void onShowSafetyWarning(int flags) {
-            showSafetyWarningH(flags);
-        }
-
-        @Override
-        public void onAccessibilityModeChanged(Boolean showA11yStream) {
-            mShowA11yStream = showA11yStream == null ? false : showA11yStream;
-            VolumeRow activeRow = getActiveRow();
-            if (!mShowA11yStream && STREAM_ACCESSIBILITY == activeRow.stream) {
-                dismissH(Events.DISMISS_STREAM_GONE);
-            } else {
-                updateRowsH(activeRow);
-            }
-
-        }
-
-        @Override
-        public void onCaptionComponentStateChanged(
-                Boolean isComponentEnabled, Boolean fromTooltip) {
-            updateODICaptionsH(isComponentEnabled, fromTooltip);
-        }
-    };
-
-    private final class H extends Handler {
-        private static final int SHOW = 1;
-        private static final int DISMISS = 2;
-        private static final int RECHECK = 3;
-        private static final int RECHECK_ALL = 4;
-        private static final int SET_STREAM_IMPORTANT = 5;
-        private static final int RESCHEDULE_TIMEOUT = 6;
-        private static final int STATE_CHANGED = 7;
-        private static final int PERFORM_HAPTIC_FEEDBACK = 8;
-        private static final int UPDATE_MEDIA_OUTPUT_VIEW = 9;
-
-        public H(Looper l) {
-            super(l);
-        }
-
-        public H() {
-            super(Looper.getMainLooper());
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case SHOW: showH(msg.arg1); break;
-                case DISMISS: dismissH(msg.arg1); break;
-                case RECHECK: recheckH((VolumeRow) msg.obj); break;
-                case RECHECK_ALL: recheckH(null); break;
-                case SET_STREAM_IMPORTANT: setStreamImportantH(msg.arg1, msg.arg2 != 0); break;
-                case RESCHEDULE_TIMEOUT: rescheduleTimeoutH(); break;
-                case STATE_CHANGED: onStateChangedH(mState); break;
-                case PERFORM_HAPTIC_FEEDBACK: provideSliderHapticFeedbackH(); break;
-                case UPDATE_MEDIA_OUTPUT_VIEW: updateMediaOutputViewH(); break;
-            }
-        }
-    }
-
-    private final class CustomDialog extends Dialog implements DialogInterface {
-        public CustomDialog(Context context) {
-            super(context, R.style.qs_theme);
-        }
-
-        @Override
-        public boolean dispatchTouchEvent(MotionEvent ev) {
-            rescheduleTimeoutH();
-            return super.dispatchTouchEvent(ev);
-        }
-
-        @Override
-        protected void onStart() {
-            super.setCanceledOnTouchOutside(true);
-            super.onStart();
-        }
-
-        @Override
-        protected void onStop() {
-            super.onStop();
-            mHandler.sendEmptyMessage(H.RECHECK_ALL);
-        }
-
-        @Override
-        public boolean onTouchEvent(MotionEvent event) {
-            if (mShowing) {
-                dismissH(Events.DISMISS_REASON_TOUCH_OUTSIDE);
-                return true;
-            }
-            return false;
-        }
-    }
-
-    private final class VolumeSeekBarChangeListener implements OnSeekBarChangeListener {
-        private final VolumeRow mRow;
-
-        private VolumeSeekBarChangeListener(VolumeRow row) {
-            mRow = row;
-        }
-
-        @Override
-        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-            if (mRow.ss == null) return;
-            if (D.BUG) Log.d(TAG, AudioSystem.streamToString(mRow.stream)
-                    + " onProgressChanged " + progress + " fromUser=" + fromUser);
-            if (mRow.stream == STREAM_RING && mHasAlertSlider) {
-                if (mRow.ss.muted) {
-                    seekBar.setProgress(mRow.ss.levelMin * 100);
-                    return;
-                }
-            }
-            if (!fromUser) return;
-            if (mRow.ss.levelMin > 0) {
-                final int minProgress = mRow.ss.levelMin * 100;
-                if (progress < minProgress) {
-                    seekBar.setProgress(minProgress);
-                    progress = minProgress;
-                }
-            }
-            final int userLevel = getImpliedLevel(seekBar, progress);
-
-            if (mRow.stream == STREAM_RING && mHasAlertSlider) {
-                if (mRow.ss.level == (mRow.ss.levelMin + 1) && userLevel <= mRow.ss.level) {
-                    seekBar.setProgress((mRow.ss.levelMin + 1) * 100);
-                    Util.setText(mRow.header,
-                            Utils.formatPercentage(mRow.ss.levelMin + 1, mRow.ss.levelMax));
-                    return;
-                }
-            }
-
-            Util.setText(mRow.header, Utils.formatPercentage(userLevel, mRow.ss.levelMax));
-            if (mRow.ss.level != userLevel || mRow.ss.muted && userLevel > 0) {
-                mRow.userAttempt = SystemClock.uptimeMillis();
-                if (mRow.requestedLevel != userLevel) {
-                    mController.setActiveStream(mRow.stream);
-                    mController.setStreamVolume(mRow.stream, userLevel);
-                    mRow.requestedLevel = userLevel;
-                    Events.writeEvent(mContext, Events.EVENT_TOUCH_LEVEL_CHANGED, mRow.stream,
-                            userLevel);
-
-                    if (mVibrateOnSlider && !mHandler.hasMessages(H.PERFORM_HAPTIC_FEEDBACK)) {
-                        mHandler.sendEmptyMessageDelayed(H.PERFORM_HAPTIC_FEEDBACK, 20);
-                    }
-                }
-            }
-        }
-
-        @Override
-        public void onStartTrackingTouch(SeekBar seekBar) {
-            if (D.BUG) Log.d(TAG, "onStartTrackingTouch"+ " " + mRow.stream);
-            mController.setActiveStream(mRow.stream);
-            mRow.tracking = true;
-        }
-
-        @Override
-        public void onStopTrackingTouch(SeekBar seekBar) {
-            if (D.BUG) Log.d(TAG, "onStopTrackingTouch"+ " " + mRow.stream);
-            mRow.tracking = false;
-            mRow.userAttempt = SystemClock.uptimeMillis();
-            final int userLevel = getImpliedLevel(seekBar, seekBar.getProgress());
-            Events.writeEvent(mContext, Events.EVENT_TOUCH_LEVEL_DONE, mRow.stream, userLevel);
-            if (mRow.ss.level != userLevel) {
-                mHandler.sendMessageDelayed(mHandler.obtainMessage(H.RECHECK, mRow),
-                        USER_ATTEMPT_GRACE_PERIOD);
-            }
-        }
-    }
-
-    private final class Accessibility extends AccessibilityDelegate {
-        public void init() {
-            mDialogView.setAccessibilityDelegate(this);
-        }
-
-        @Override
-        public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
-            // Activities populate their title here. Follow that example.
-            event.getText().add(composeWindowTitle());
-            return true;
-        }
-
-        @Override
-        public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
-                AccessibilityEvent event) {
-            rescheduleTimeoutH();
-            return super.onRequestSendAccessibilityEvent(host, child, event);
-        }
-    }
-
-    private boolean isAudioPanelOnLeftSide() {
-        return mLeftVolumeRocker;
-    }
-
-    private static class VolumeRow {
-        private View view;
-        private TextView header;
-        private ImageView icon;
-        private SeekBar slider;
-        private int stream;
-        private StreamState ss;
-        private long userAttempt;  // last user-driven slider change
-        private boolean tracking;  // tracking slider touch
-        private int requestedLevel = -1;  // pending user-requested level via progress changed
-        private int iconRes;
-        private int iconMuteRes;
-        private boolean important;
-        private boolean defaultStream;
-        private ColorStateList cachedTint;
-        private ObjectAnimator anim;  // slider progress animation for non-touch-related updates
-        private int animTargetProgress;
-        private FrameLayout dndIcon;
-    }
-
-    private static class MediaOutputRow {
-        private View view;
-        private TextView name;
-        private TextView summary;
-        private ImageView icon;
-        private ImageView selected;
-        private MediaDevice device;
-        private boolean addedToGroup;
-    }
-}
\ No newline at end of file
