| <?xml version="1.0" encoding="utf-8"?> |
| <!-- |
| ~ Copyright (C) 2021 The Android Open Source Project |
| ~ |
| ~ Licensed under the Apache License, Version 2.0 (the "License"); |
| ~ you may not use this file except in compliance with the License. |
| ~ You may obtain a copy of the License at |
| ~ |
| ~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~ |
| ~ Unless required by applicable law or agreed to in writing, software |
| ~ distributed under the License is distributed on an "AS IS" BASIS, |
| ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ~ See the License for the specific language governing permissions and |
| ~ limitations under the License. |
| --> |
| |
| <!-- Layout for media session-based controls --> |
| <com.android.systemui.util.animation.TransitionLayout xmlns:android="http://schemas.android.com/apk/res/android" |
| xmlns:app="http://schemas.android.com/apk/res-auto" |
| android:id="@+id/qs_media_controls" |
| android:layout_width="match_parent" |
| android:layout_height="wrap_content" |
| android:clipChildren="true" |
| android:clipToPadding="true" |
| android:gravity="center_horizontal|fill_vertical" |
| android:forceHasOverlappingRendering="false" |
| android:background="@drawable/qs_media_outline_layout_bg" |
| android:clipToOutline="true" |
| android:theme="@style/MediaPlayer"> |
| |
| <ImageView |
| android:id="@+id/album_art" |
| android:layout_width="match_parent" |
| android:layout_height="@dimen/qs_media_session_height_expanded" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintBottom_toBottomOf="parent" |
| android:translationZ="0dp" |
| android:scaleType="centerCrop" |
| android:adjustViewBounds="true" |
| android:clipToOutline="true" |
| android:background="@drawable/qs_media_outline_album_bg" |
| /> |
| |
| <!-- Guideline for output switcher --> |
| <androidx.constraintlayout.widget.Guideline |
| android:id="@+id/center_vertical_guideline" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:orientation="vertical" |
| app:layout_constraintGuide_percent="0.6" /> |
| |
| <!-- Guideline for action buttons (collapsed view only) --> |
| <androidx.constraintlayout.widget.Guideline |
| android:id="@+id/action_button_guideline" |
| android:layout_width="0dp" |
| android:layout_height="0dp" |
| android:orientation="vertical" |
| app:layout_constraintGuide_end="@dimen/qs_media_session_collapsed_guideline" /> |
| |
| <!-- App icon --> |
| <com.android.internal.widget.CachingIconView |
| android:id="@+id/icon" |
| android:layout_width="@dimen/qs_media_app_icon_size" |
| android:layout_height="@dimen/qs_media_app_icon_size" |
| android:layout_marginStart="@dimen/qs_media_padding" |
| android:layout_marginTop="@dimen/qs_media_padding" |
| app:layout_constraintStart_toStartOf="parent" |
| app:layout_constraintTop_toTopOf="parent" /> |
| |
| <!-- Seamless Output Switcher --> |
| <LinearLayout |
| android:id="@+id/media_seamless" |
| android:orientation="horizontal" |
| android:gravity="top|end" |
| android:paddingTop="@dimen/qs_media_padding" |
| android:paddingEnd="@dimen/qs_media_padding" |
| android:background="@drawable/qs_media_light_source" |
| android:forceHasOverlappingRendering="false" |
| android:layout_width="wrap_content" |
| android:layout_height="@dimen/min_clickable_item_size" |
| android:layout_marginStart="@dimen/qs_center_guideline_padding" |
| app:layout_constraintEnd_toEndOf="parent" |
| app:layout_constraintTop_toTopOf="parent" |
| app:layout_constraintStart_toEndOf="@id/center_vertical_guideline" |
| app:layout_constraintHorizontal_bias="1" |
| app:layout_constrainedWidth="true" |
| app:layout_constraintWidth_min="@dimen/min_clickable_item_size" |
| app:layout_constraintHeight_min="@dimen/min_clickable_item_size"> |
| <LinearLayout |
| android:id="@+id/media_seamless_button" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:minHeight="@dimen/qs_seamless_height" |
| android:maxHeight="@dimen/min_clickable_item_size" |
| android:theme="@style/MediaPlayer.SolidButton" |
| android:background="@drawable/qs_media_seamless_background" |
| android:orientation="horizontal" |
| android:contentDescription="@string/quick_settings_media_device_label"> |
| <ImageView |
| android:id="@+id/media_seamless_image" |
| android:layout_width="@dimen/qs_seamless_icon_size" |
| android:layout_height="@dimen/qs_seamless_icon_size" |
| android:layout_gravity="center" |
| android:tint="?android:attr/textColorPrimary" |
| android:src="@*android:drawable/ic_media_seamless" /> |
| <TextView |
| android:id="@+id/media_seamless_text" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" |
| android:layout_gravity="center_vertical" |
| android:layout_marginStart="4dp" |
| android:fontFamily="@*android:string/config_headlineFontFamilyMedium" |
| android:singleLine="true" |
| android:text="@*android:string/ext_media_seamless_action" |
| android:textDirection="locale" |
| android:textSize="12sp" |
| android:lineHeight="16sp" /> |
| </LinearLayout> |
| </LinearLayout> |
| |
| <!-- Song name --> |
| <TextView |
| android:id="@+id/header_title" |
| android:fontFamily="@*android:string/config_headlineFontFamilyMedium" |
| android:singleLine="true" |
| android:textSize="16sp" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" /> |
| |
| <!-- Artist name --> |
| <TextView |
| android:id="@+id/header_artist" |
| android:fontFamily="@*android:string/config_headlineFontFamily" |
| android:singleLine="true" |
| style="@style/MediaPlayer.Subtitle" |
| android:textSize="14sp" |
| android:layout_width="wrap_content" |
| android:layout_height="wrap_content" /> |
| |
| <ImageButton |
| android:id="@+id/actionPlayPause" |
| style="@style/MediaPlayer.SessionAction.Primary" |
| android:layout_width="48dp" |
| android:layout_height="48dp" |
| android:layout_marginStart="@dimen/qs_media_padding" |
| android:layout_marginEnd="@dimen/qs_media_padding" /> |
| |
| <!-- See comment in media_session_collapsed.xml for how these barriers are used --> |
| <androidx.constraintlayout.widget.Barrier |
| android:id="@+id/media_action_barrier_start" |
| android:layout_width="0dp" |
| android:layout_height="0dp" |
| android:orientation="vertical" |
| app:layout_constraintTop_toBottomOf="@id/header_title" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:layout_constraintStart_toStartOf="parent" |
| app:barrierDirection="start" |
| app:constraint_referenced_ids="actionPrev,media_scrubbing_elapsed_time,media_progress_bar,actionNext,media_scrubbing_total_time,action0,action1,action2,action3,action4" |
| /> |
| <androidx.constraintlayout.widget.Barrier |
| android:id="@+id/media_action_barrier_end" |
| android:layout_width="0dp" |
| android:layout_height="0dp" |
| android:orientation="vertical" |
| app:layout_constraintTop_toBottomOf="@id/media_seamless" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:barrierDirection="end" |
| app:constraint_referenced_ids="actionPrev,media_scrubbing_elapsed_time,media_progress_bar,actionNext,media_scrubbing_total_time,action0,action1,action2,action3,action4" |
| app:layout_constraintStart_toStartOf="parent" |
| /> |
| |
| <!-- This barrier is used in expanded view to constrain the bottom row of actions --> |
| <androidx.constraintlayout.widget.Barrier |
| android:id="@+id/media_action_barrier_top" |
| android:layout_width="match_parent" |
| android:layout_height="0dp" |
| app:layout_constraintBottom_toBottomOf="parent" |
| app:barrierDirection="top" |
| app:constraint_referenced_ids="actionPrev,media_scrubbing_elapsed_time,media_progress_bar,actionNext,media_scrubbing_total_time,action0,action1,action2,action3,action4" |
| /> |
| |
| <!-- Button visibility will be controlled in code --> |
| <ImageButton |
| android:id="@+id/actionPrev" |
| style="@style/MediaPlayer.SessionAction.Secondary" |
| android:layout_width="48dp" |
| android:layout_height="48dp" |
| android:layout_marginStart="4dp" |
| android:layout_marginEnd="0dp" |
| android:layout_marginBottom="@dimen/qs_media_padding" |
| android:layout_marginTop="0dp" |
| /> |
| |
| <!-- Elapsed time, shown only when scrubbing --> |
| <!-- The space to the left of the progress bar will either be actionPrev or |
| media_scrubbing_elapsed_time, so they use the same layout constraints. Visibilities of |
| elements are controlled in code. --> |
| <TextView |
| android:id="@+id/media_scrubbing_elapsed_time" |
| style="@style/MediaPlayer.ScrubbingTime" |
| android:layout_width="48dp" |
| android:layout_height="48dp" |
| android:layout_marginStart="4dp" |
| android:layout_marginEnd="0dp" |
| android:layout_marginBottom="@dimen/qs_media_padding" |
| android:layout_marginTop="0dp" |
| android:visibility="gone" |
| /> |
| |
| <!-- Seek Bar --> |
| <!-- As per Material Design on Bidirectionality, this is forced to LTR in code --> |
| <SeekBar |
| android:id="@+id/media_progress_bar" |
| style="@style/MediaPlayer.ProgressBar" |
| android:layout_width="0dp" |
| android:layout_height="48dp" |
| android:paddingTop="@dimen/qs_media_session_enabled_seekbar_vertical_padding" |
| android:paddingBottom="12dp" |
| android:maxHeight="@dimen/qs_media_enabled_seekbar_height" |
| android:splitTrack="false" |
| android:layout_marginBottom="@dimen/qs_media_padding" |
| android:layout_marginTop="0dp" |
| android:layout_marginStart="0dp" |
| android:layout_marginEnd="0dp" /> |
| |
| <ImageButton |
| android:id="@+id/actionNext" |
| style="@style/MediaPlayer.SessionAction.Secondary" |
| android:layout_width="48dp" |
| android:layout_height="48dp" |
| android:layout_marginStart="0dp" |
| android:layout_marginEnd="@dimen/qs_media_action_spacing" |
| android:layout_marginBottom="@dimen/qs_media_padding" |
| android:layout_marginTop="0dp" /> |
| |
| <!-- Total time, shown only when scrubbing --> |
| <!-- The space to the right of the progress bar will either be actionNext or |
| media_scrubbing_total_time, so they use the same layout constraints. Visibilities of |
| elements are controlled in code. --> |
| <TextView |
| android:id="@+id/media_scrubbing_total_time" |
| style="@style/MediaPlayer.ScrubbingTime" |
| android:layout_width="48dp" |
| android:layout_height="48dp" |
| android:layout_marginStart="0dp" |
| android:layout_marginEnd="@dimen/qs_media_action_spacing" |
| android:layout_marginBottom="@dimen/qs_media_padding" |
| android:layout_marginTop="0dp" |
| android:visibility="gone" |
| /> |
| |
| <ImageButton |
| android:id="@+id/action0" |
| style="@style/MediaPlayer.SessionAction.Secondary" |
| android:layout_width="48dp" |
| android:layout_height="48dp" |
| android:layout_marginStart="@dimen/qs_media_action_spacing" |
| android:layout_marginEnd="@dimen/qs_media_action_spacing" |
| android:layout_marginBottom="@dimen/qs_media_padding" |
| android:layout_marginTop="0dp"/> |
| |
| <ImageButton |
| android:id="@+id/action1" |
| style="@style/MediaPlayer.SessionAction.Secondary" |
| android:layout_width="48dp" |
| android:layout_height="48dp" |
| android:layout_marginStart="@dimen/qs_media_action_spacing" |
| android:layout_marginEnd="4dp" |
| android:layout_marginBottom="@dimen/qs_media_padding" |
| android:layout_marginTop="0dp" /> |
| |
| <ImageButton |
| android:id="@+id/action2" |
| style="@style/MediaPlayer.SessionAction.Secondary" |
| android:layout_width="48dp" |
| android:layout_height="48dp" |
| android:layout_marginStart="@dimen/qs_media_action_spacing" |
| android:layout_marginEnd="4dp" |
| android:layout_marginBottom="@dimen/qs_media_padding" |
| android:layout_marginTop="0dp" /> |
| |
| <ImageButton |
| android:id="@+id/action3" |
| style="@style/MediaPlayer.SessionAction.Secondary" |
| android:layout_width="48dp" |
| android:layout_height="48dp" |
| android:layout_marginStart="@dimen/qs_media_action_spacing" |
| android:layout_marginEnd="4dp" |
| android:layout_marginBottom="@dimen/qs_media_padding" |
| android:layout_marginTop="0dp" /> |
| |
| <ImageButton |
| android:id="@+id/action4" |
| style="@style/MediaPlayer.SessionAction.Secondary" |
| android:layout_width="48dp" |
| android:layout_height="48dp" |
| android:layout_marginStart="@dimen/qs_media_action_spacing" |
| android:layout_marginEnd="4dp" |
| android:layout_marginBottom="@dimen/qs_media_padding" |
| android:layout_marginTop="0dp" /> |
| |
| <include |
| layout="@layout/media_long_press_menu" /> |
| |
| </com.android.systemui.util.animation.TransitionLayout> |