Merge "JAudioTrack: fix uninitialized mFlags"
diff --git a/media/libaaudio/Android.bp b/media/libaaudio/Android.bp
index f00f7a8..4857008 100644
--- a/media/libaaudio/Android.bp
+++ b/media/libaaudio/Android.bp
@@ -32,6 +32,7 @@
cc_library_headers {
name: "libaaudio_headers",
export_include_dirs: ["include"],
+ version_script: "libaaudio.map.txt",
}
subdirs = ["*"]
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
index fef9fae..5ea600f 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
@@ -1994,7 +1994,7 @@
sp<AMessage> videoFormat = mCurrentSourceInfo.mSource->getFormat(false /* audio */);
audio_stream_type_t streamType = mAudioSink->getAudioStreamType();
const bool hasVideo = (videoFormat != NULL);
- bool canOffload = canOffloadStream(
+ bool canOffload = JMediaPlayer2Utils::isOffloadedAudioPlaybackSupported(
audioMeta, hasVideo, mCurrentSourceInfo.mSource->isStreaming(), streamType)
&& (mPlaybackSettings.mSpeed == 1.f && mPlaybackSettings.mPitch == 1.f);
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_audiotrack_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_audiotrack_dark.png
deleted file mode 100644
index 17fd51f..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_audiotrack_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_audiotrack_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_audiotrack_light.png
deleted file mode 100644
index d7c8252..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_audiotrack_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_dialog_close_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_dialog_close_dark.png
deleted file mode 100644
index 928ddea..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_dialog_close_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_dialog_close_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_dialog_close_light.png
deleted file mode 100644
index 1a9cd75..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_dialog_close_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_pause_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_pause_dark.png
deleted file mode 100644
index 7192ad4..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_pause_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_pause_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_pause_light.png
deleted file mode 100644
index bb707ea..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_pause_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_play_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_play_dark.png
deleted file mode 100644
index 0c32d00..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_play_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_play_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_play_light.png
deleted file mode 100644
index 5345ee3..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_play_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_stop_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_stop_dark.png
deleted file mode 100644
index 801d341..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_stop_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_stop_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_stop_light.png
deleted file mode 100644
index 9d6b65d..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_stop_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_subtitle_disabled.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_subtitle_disabled.png
deleted file mode 100644
index 0354f61..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_subtitle_disabled.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_media_subtitle_enabled.png b/packages/MediaComponents/res/drawable-hdpi/ic_media_subtitle_enabled.png
deleted file mode 100644
index 5f8febe..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_media_subtitle_enabled.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disabled_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disabled_dark.png
deleted file mode 100644
index 8ad305d..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disabled_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disabled_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disabled_light.png
deleted file mode 100644
index 887fde4..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disabled_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disconnected_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disconnected_dark.png
deleted file mode 100644
index 5739df7..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disconnected_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disconnected_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disconnected_light.png
deleted file mode 100644
index 58c344a..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_disconnected_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_grey.png b/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_grey.png
deleted file mode 100644
index 1a03420..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_mr_button_grey.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_dark.png
deleted file mode 100755
index 723e455..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_group_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_group_dark.png
deleted file mode 100755
index 40c25a3..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_group_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_group_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_group_light.png
deleted file mode 100755
index afdb9c1..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_group_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_light.png
deleted file mode 100755
index 846c109..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_speaker_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_tv_dark.png b/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_tv_dark.png
deleted file mode 100755
index 33bf484..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_tv_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_tv_light.png b/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_tv_light.png
deleted file mode 100755
index c911b5c..0000000
--- a/packages/MediaComponents/res/drawable-hdpi/ic_vol_type_tv_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_audiotrack_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_audiotrack_dark.png
deleted file mode 100644
index e94ed50..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_audiotrack_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_audiotrack_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_audiotrack_light.png
deleted file mode 100644
index 2cf7e0c..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_audiotrack_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_dialog_close_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_dialog_close_dark.png
deleted file mode 100644
index 66558a8..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_dialog_close_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_dialog_close_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_dialog_close_light.png
deleted file mode 100644
index 40a1a84..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_dialog_close_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_pause_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_pause_dark.png
deleted file mode 100644
index f49aed7..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_pause_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_pause_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_pause_light.png
deleted file mode 100644
index 74068ea..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_pause_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_play_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_play_dark.png
deleted file mode 100644
index 9cc777c..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_play_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_play_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_play_light.png
deleted file mode 100644
index f208795..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_play_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_stop_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_stop_dark.png
deleted file mode 100644
index 3ad2c9c..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_stop_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_stop_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_stop_light.png
deleted file mode 100644
index b002ab7..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_stop_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_subtitle_disabled.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_subtitle_disabled.png
deleted file mode 100644
index 0354f61..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_subtitle_disabled.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_media_subtitle_enabled.png b/packages/MediaComponents/res/drawable-mdpi/ic_media_subtitle_enabled.png
deleted file mode 100644
index 5f8febe..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_media_subtitle_enabled.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disabled_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disabled_dark.png
deleted file mode 100644
index 4446ea4..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disabled_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disabled_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disabled_light.png
deleted file mode 100644
index 4d790c6..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disabled_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disconnected_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disconnected_dark.png
deleted file mode 100644
index c401dc0..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disconnected_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disconnected_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disconnected_light.png
deleted file mode 100644
index e24d586..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_disconnected_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_grey.png b/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_grey.png
deleted file mode 100644
index ccbb772..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_mr_button_grey.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_dark.png
deleted file mode 100755
index 7cc9845..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_group_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_group_dark.png
deleted file mode 100755
index 22617e1..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_group_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_group_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_group_light.png
deleted file mode 100755
index cefef3c..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_group_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_light.png
deleted file mode 100755
index 9a0047c..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_speaker_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_tv_dark.png b/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_tv_dark.png
deleted file mode 100755
index ca5d6a2..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_tv_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_tv_light.png b/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_tv_light.png
deleted file mode 100755
index 8134310..0000000
--- a/packages/MediaComponents/res/drawable-mdpi/ic_vol_type_tv_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_audiotrack_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_audiotrack_dark.png
deleted file mode 100644
index b5c899f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_audiotrack_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_audiotrack_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_audiotrack_light.png
deleted file mode 100644
index 4778e00..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_audiotrack_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_dialog_close_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_dialog_close_dark.png
deleted file mode 100644
index f992fc5..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_dialog_close_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_dialog_close_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_dialog_close_light.png
deleted file mode 100644
index d3884e6..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_dialog_close_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_media_pause_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_media_pause_dark.png
deleted file mode 100644
index 660ac65..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_media_pause_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_media_pause_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_media_pause_light.png
deleted file mode 100644
index 792104f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_media_pause_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_media_play_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_media_play_dark.png
deleted file mode 100644
index be5c062..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_media_play_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_media_play_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_media_play_light.png
deleted file mode 100644
index d12d495..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_media_play_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_media_stop_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_media_stop_dark.png
deleted file mode 100644
index 5239336..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_media_stop_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_media_stop_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_media_stop_light.png
deleted file mode 100644
index 5bc5a6c..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_media_stop_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_00_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_00_dark.png
deleted file mode 100644
index f6dd214..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_00_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_00_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_00_light.png
deleted file mode 100644
index 6b7bdcd..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_00_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_01_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_01_dark.png
deleted file mode 100644
index c7fe576..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_01_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_01_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_01_light.png
deleted file mode 100644
index 0a5d6aa..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_01_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_02_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_02_dark.png
deleted file mode 100644
index 0aadfa3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_02_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_02_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_02_light.png
deleted file mode 100644
index 125fe0b..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_02_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_03_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_03_dark.png
deleted file mode 100644
index 05c48a7..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_03_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_03_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_03_light.png
deleted file mode 100644
index 741e911..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_03_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_04_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_04_dark.png
deleted file mode 100644
index ae4218a..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_04_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_04_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_04_light.png
deleted file mode 100644
index 8b30fab..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_04_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_05_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_05_dark.png
deleted file mode 100644
index d7aa903..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_05_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_05_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_05_light.png
deleted file mode 100644
index f7e2f29..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_05_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_06_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_06_dark.png
deleted file mode 100644
index e7871e2..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_06_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_06_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_06_light.png
deleted file mode 100644
index 8c57f63..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_06_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_07_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_07_dark.png
deleted file mode 100644
index 0041b01..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_07_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_07_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_07_light.png
deleted file mode 100644
index 6dbb694..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_07_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_08_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_08_dark.png
deleted file mode 100644
index 08e1013..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_08_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_08_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_08_light.png
deleted file mode 100644
index 5c352c3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_08_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_09_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_09_dark.png
deleted file mode 100644
index 70532e9..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_09_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_09_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_09_light.png
deleted file mode 100644
index 9c6ba30..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_09_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_10_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_10_dark.png
deleted file mode 100644
index 9ba3b5f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_10_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_10_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_10_light.png
deleted file mode 100644
index bd4bb22..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_10_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_11_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_11_dark.png
deleted file mode 100644
index 2156127..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_11_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_11_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_11_light.png
deleted file mode 100644
index b417a9f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_11_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_12_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_12_dark.png
deleted file mode 100644
index 9bf633e..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_12_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_12_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_12_light.png
deleted file mode 100644
index ba51811..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_12_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_13_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_13_dark.png
deleted file mode 100644
index 756a53c..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_13_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_13_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_13_light.png
deleted file mode 100644
index 4705dca..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_13_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_14_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_14_dark.png
deleted file mode 100644
index 50e4ea3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_14_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_14_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_14_light.png
deleted file mode 100644
index bc6724f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_14_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_15_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_15_dark.png
deleted file mode 100644
index 9e3b410..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_15_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_15_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_15_light.png
deleted file mode 100644
index 2f18abd..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_15_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_16_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_16_dark.png
deleted file mode 100644
index de81133..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_16_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_16_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_16_light.png
deleted file mode 100644
index b80b191..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_16_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_17_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_17_dark.png
deleted file mode 100644
index 48aba3d..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_17_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_17_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_17_light.png
deleted file mode 100644
index ca34d5b..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_17_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_18_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_18_dark.png
deleted file mode 100644
index e9957b3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_18_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_18_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_18_light.png
deleted file mode 100644
index a5d384f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_18_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_19_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_19_dark.png
deleted file mode 100644
index ddc6297..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_19_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_19_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_19_light.png
deleted file mode 100644
index 28ab684..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_19_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_20_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_20_dark.png
deleted file mode 100644
index 51e7f75..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_20_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_20_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_20_light.png
deleted file mode 100644
index 4aa3ca3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_20_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_21_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_21_dark.png
deleted file mode 100644
index 9caecde..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_21_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_21_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_21_light.png
deleted file mode 100644
index 1b8d0b6..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_21_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_22_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_22_dark.png
deleted file mode 100644
index 400be3c..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_22_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_22_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_22_light.png
deleted file mode 100644
index c14f1bf..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_22_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_23_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_23_dark.png
deleted file mode 100644
index 4e18b46..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_23_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_23_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_23_light.png
deleted file mode 100644
index c4c2c00..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_23_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_24_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_24_dark.png
deleted file mode 100644
index 98fae44..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_24_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_24_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_24_light.png
deleted file mode 100644
index d64c289..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_24_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_25_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_25_dark.png
deleted file mode 100644
index 91f9327..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_25_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_25_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_25_light.png
deleted file mode 100644
index f5e1f69..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_25_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_26_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_26_dark.png
deleted file mode 100644
index 3e6fafd..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_26_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_26_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_26_light.png
deleted file mode 100644
index ae2bd87..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_26_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_27_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_27_dark.png
deleted file mode 100644
index f73a1f8..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_27_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_27_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_27_light.png
deleted file mode 100644
index 78c1069..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_27_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_28_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_28_dark.png
deleted file mode 100644
index 562b803..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_28_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_28_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_28_light.png
deleted file mode 100644
index ddfba02..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_28_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_29_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_29_dark.png
deleted file mode 100644
index 257f2d2..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_29_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_29_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_29_light.png
deleted file mode 100644
index 38f5478..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_29_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_30_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_30_dark.png
deleted file mode 100644
index f995af0..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_30_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_30_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_30_light.png
deleted file mode 100644
index c50b7f0..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connected_30_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_00_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_00_dark.png
deleted file mode 100644
index f6dd214..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_00_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_00_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_00_light.png
deleted file mode 100644
index 6b7bdcd..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_00_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_01_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_01_dark.png
deleted file mode 100644
index c7fe576..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_01_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_01_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_01_light.png
deleted file mode 100644
index 0a5d6aa..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_01_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_02_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_02_dark.png
deleted file mode 100644
index 0aadfa3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_02_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_02_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_02_light.png
deleted file mode 100644
index 125fe0b..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_02_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_03_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_03_dark.png
deleted file mode 100644
index 05c48a7..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_03_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_03_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_03_light.png
deleted file mode 100644
index 741e911..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_03_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_04_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_04_dark.png
deleted file mode 100644
index ae4218a..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_04_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_04_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_04_light.png
deleted file mode 100644
index 8b30fab..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_04_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_05_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_05_dark.png
deleted file mode 100644
index d7aa903..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_05_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_05_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_05_light.png
deleted file mode 100644
index f7e2f29..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_05_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_06_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_06_dark.png
deleted file mode 100644
index e7871e2..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_06_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_06_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_06_light.png
deleted file mode 100644
index 8c57f63..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_06_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_07_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_07_dark.png
deleted file mode 100644
index 0041b01..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_07_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_07_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_07_light.png
deleted file mode 100644
index 6dbb694..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_07_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_08_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_08_dark.png
deleted file mode 100644
index 08e1013..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_08_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_08_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_08_light.png
deleted file mode 100644
index 5c352c3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_08_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_09_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_09_dark.png
deleted file mode 100644
index 70532e9..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_09_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_09_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_09_light.png
deleted file mode 100644
index 9c6ba30..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_09_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_10_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_10_dark.png
deleted file mode 100644
index 9ba3b5f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_10_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_10_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_10_light.png
deleted file mode 100644
index bd4bb22..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_10_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_11_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_11_dark.png
deleted file mode 100644
index f3570f4..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_11_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_11_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_11_light.png
deleted file mode 100644
index 65a403e..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_11_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_12_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_12_dark.png
deleted file mode 100644
index f644bfd..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_12_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_12_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_12_light.png
deleted file mode 100644
index c7d6048..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_12_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_13_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_13_dark.png
deleted file mode 100644
index 6e0d558..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_13_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_13_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_13_light.png
deleted file mode 100644
index f3bc48d..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_13_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_14_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_14_dark.png
deleted file mode 100644
index 14d8f8e..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_14_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_14_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_14_light.png
deleted file mode 100644
index 98b90e5..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_14_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_15_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_15_dark.png
deleted file mode 100644
index 83234a7..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_15_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_15_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_15_light.png
deleted file mode 100644
index 47d452f..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_15_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_16_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_16_dark.png
deleted file mode 100644
index b81cf5a..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_16_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_16_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_16_light.png
deleted file mode 100644
index 20d08b4..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_16_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_17_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_17_dark.png
deleted file mode 100644
index 6feb3f1..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_17_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_17_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_17_light.png
deleted file mode 100644
index e6ae8b3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_17_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_18_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_18_dark.png
deleted file mode 100644
index 0b0fc08..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_18_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_18_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_18_light.png
deleted file mode 100644
index c2a16ac..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_18_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_19_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_19_dark.png
deleted file mode 100644
index a3598cc..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_19_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_19_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_19_light.png
deleted file mode 100644
index 846d16d..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_19_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_20_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_20_dark.png
deleted file mode 100644
index 2070455..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_20_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_20_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_20_light.png
deleted file mode 100644
index ae6db13..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_20_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_21_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_21_dark.png
deleted file mode 100644
index 7f3828a..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_21_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_21_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_21_light.png
deleted file mode 100644
index aaccc73..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_21_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_22_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_22_dark.png
deleted file mode 100644
index 5c8ced9..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_22_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_22_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_22_light.png
deleted file mode 100644
index ad01b9e..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_22_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_23_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_23_dark.png
deleted file mode 100644
index ce31dd3..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_23_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_23_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_23_light.png
deleted file mode 100644
index 9ef78e4..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_23_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_24_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_24_dark.png
deleted file mode 100644
index a7c2cdb..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_24_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_24_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_24_light.png
deleted file mode 100644
index e7c5bea..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_24_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_25_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_25_dark.png
deleted file mode 100644
index ecad0d4..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_25_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_25_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_25_light.png
deleted file mode 100644
index 5fa5923..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_25_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_26_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_26_dark.png
deleted file mode 100644
index f687e25..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_26_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_26_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_26_light.png
deleted file mode 100644
index 9c06db8..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_26_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_27_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_27_dark.png
deleted file mode 100644
index 90225ba..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_27_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_27_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_27_light.png
deleted file mode 100644
index 19697de..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_27_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_28_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_28_dark.png
deleted file mode 100644
index d37ec21..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_28_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_28_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_28_light.png
deleted file mode 100644
index 21840bf..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_28_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_29_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_29_dark.png
deleted file mode 100644
index 5445e3a..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_29_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_29_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_29_light.png
deleted file mode 100644
index 2337c65..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_29_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_30_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_30_dark.png
deleted file mode 100644
index f6dd214..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_30_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_30_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_30_light.png
deleted file mode 100644
index 6b7bdcd..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_connecting_30_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disabled_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disabled_dark.png
deleted file mode 100644
index c4dc132..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disabled_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disabled_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disabled_light.png
deleted file mode 100644
index b14617c..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disabled_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disconnected_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disconnected_dark.png
deleted file mode 100644
index bb30773..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disconnected_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disconnected_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disconnected_light.png
deleted file mode 100644
index a05d7d7..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_disconnected_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_grey.png b/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_grey.png
deleted file mode 100644
index 2238d58..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_mr_button_grey.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_dark.png
deleted file mode 100755
index e40349d..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_group_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_group_dark.png
deleted file mode 100755
index f67c463..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_group_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_group_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_group_light.png
deleted file mode 100755
index 7fcebf5..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_group_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_light.png
deleted file mode 100755
index ea32a7a..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_speaker_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_tv_dark.png b/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_tv_dark.png
deleted file mode 100755
index d62ca37..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_tv_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_tv_light.png b/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_tv_light.png
deleted file mode 100755
index 3131256..0000000
--- a/packages/MediaComponents/res/drawable-xhdpi/ic_vol_type_tv_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_audiotrack_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_audiotrack_dark.png
deleted file mode 100644
index f131e1b..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_audiotrack_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_audiotrack_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_audiotrack_light.png
deleted file mode 100644
index e5946a2..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_audiotrack_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_dialog_close_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_dialog_close_dark.png
deleted file mode 100644
index b85e87f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_dialog_close_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_dialog_close_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_dialog_close_light.png
deleted file mode 100644
index 51b4401..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_dialog_close_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_pause_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_media_pause_dark.png
deleted file mode 100644
index 3ea7e03..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_pause_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_pause_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_media_pause_light.png
deleted file mode 100644
index dc63538..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_pause_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_play_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_media_play_dark.png
deleted file mode 100644
index 2745c3a..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_play_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_play_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_media_play_light.png
deleted file mode 100644
index eda3ba5..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_play_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_stop_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_media_stop_dark.png
deleted file mode 100644
index 035ca18..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_stop_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_stop_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_media_stop_light.png
deleted file mode 100644
index eac183d..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_media_stop_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_00_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_00_dark.png
deleted file mode 100644
index 0db679e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_00_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_00_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_00_light.png
deleted file mode 100644
index 51c6051..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_00_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_01_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_01_dark.png
deleted file mode 100644
index c083914..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_01_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_01_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_01_light.png
deleted file mode 100644
index c3c3caf..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_01_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_02_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_02_dark.png
deleted file mode 100644
index fc444cf..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_02_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_02_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_02_light.png
deleted file mode 100644
index abd6377..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_02_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_03_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_03_dark.png
deleted file mode 100644
index 6dbd1da..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_03_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_03_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_03_light.png
deleted file mode 100644
index d2e7108..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_03_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_04_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_04_dark.png
deleted file mode 100644
index d9f596b..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_04_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_04_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_04_light.png
deleted file mode 100644
index 4f32e1a..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_04_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_05_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_05_dark.png
deleted file mode 100644
index c568e04..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_05_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_05_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_05_light.png
deleted file mode 100644
index ed20dd9..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_05_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_06_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_06_dark.png
deleted file mode 100644
index bbe39e7..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_06_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_06_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_06_light.png
deleted file mode 100644
index 1edc15f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_06_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_07_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_07_dark.png
deleted file mode 100644
index 78aebaf..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_07_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_07_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_07_light.png
deleted file mode 100644
index b5a6a4f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_07_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_08_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_08_dark.png
deleted file mode 100644
index 44b91ce..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_08_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_08_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_08_light.png
deleted file mode 100644
index 85f66f9..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_08_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_09_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_09_dark.png
deleted file mode 100644
index 51ea34b..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_09_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_09_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_09_light.png
deleted file mode 100644
index 952de04..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_09_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_10_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_10_dark.png
deleted file mode 100644
index 8b1aa21..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_10_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_10_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_10_light.png
deleted file mode 100644
index 534bcc0..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_10_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_11_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_11_dark.png
deleted file mode 100644
index f666b35..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_11_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_11_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_11_light.png
deleted file mode 100644
index 145a8fb..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_11_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_12_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_12_dark.png
deleted file mode 100644
index edeb132..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_12_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_12_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_12_light.png
deleted file mode 100644
index 9da2b60..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_12_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_13_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_13_dark.png
deleted file mode 100644
index ab80aa9..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_13_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_13_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_13_light.png
deleted file mode 100644
index 115efe4..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_13_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_14_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_14_dark.png
deleted file mode 100644
index 8c0cc31..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_14_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_14_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_14_light.png
deleted file mode 100644
index e6ae6fc..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_14_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_15_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_15_dark.png
deleted file mode 100644
index b8816c9..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_15_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_15_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_15_light.png
deleted file mode 100644
index bd42931..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_15_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_16_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_16_dark.png
deleted file mode 100644
index 10d5b7f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_16_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_16_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_16_light.png
deleted file mode 100644
index 303a0fe..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_16_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_17_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_17_dark.png
deleted file mode 100644
index 3c2a655..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_17_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_17_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_17_light.png
deleted file mode 100644
index 90debc2..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_17_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_18_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_18_dark.png
deleted file mode 100644
index d3e78a7..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_18_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_18_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_18_light.png
deleted file mode 100644
index 3a3f991..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_18_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_19_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_19_dark.png
deleted file mode 100644
index 63fad9e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_19_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_19_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_19_light.png
deleted file mode 100644
index d6dd8d4..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_19_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_20_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_20_dark.png
deleted file mode 100644
index 890fd5f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_20_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_20_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_20_light.png
deleted file mode 100644
index 6b0b5c1..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_20_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_21_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_21_dark.png
deleted file mode 100644
index 9ce1ef1..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_21_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_21_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_21_light.png
deleted file mode 100644
index 81710d4..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_21_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_22_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_22_dark.png
deleted file mode 100644
index 861c080..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_22_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_22_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_22_light.png
deleted file mode 100644
index 1c4aa21..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_22_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_23_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_23_dark.png
deleted file mode 100644
index 59a6b30..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_23_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_23_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_23_light.png
deleted file mode 100644
index c6e8fe0..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_23_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_24_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_24_dark.png
deleted file mode 100644
index 57b840e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_24_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_24_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_24_light.png
deleted file mode 100644
index bf24050..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_24_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_25_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_25_dark.png
deleted file mode 100644
index 01c18c1..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_25_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_25_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_25_light.png
deleted file mode 100644
index be9753e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_25_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_26_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_26_dark.png
deleted file mode 100644
index 3f291b1..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_26_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_26_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_26_light.png
deleted file mode 100644
index dc1c619..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_26_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_27_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_27_dark.png
deleted file mode 100644
index 6504a70..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_27_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_27_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_27_light.png
deleted file mode 100644
index a7e0a60..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_27_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_28_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_28_dark.png
deleted file mode 100644
index 57b1f3e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_28_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_28_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_28_light.png
deleted file mode 100644
index 5c551ec..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_28_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_29_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_29_dark.png
deleted file mode 100644
index 238667e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_29_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_29_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_29_light.png
deleted file mode 100644
index ffb8183..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_29_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_30_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_30_dark.png
deleted file mode 100644
index 4893f18..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_30_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_30_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_30_light.png
deleted file mode 100644
index ac5e156..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connected_30_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_00_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_00_dark.png
deleted file mode 100644
index 0db679e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_00_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_00_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_00_light.png
deleted file mode 100644
index 51c6051..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_00_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_01_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_01_dark.png
deleted file mode 100644
index c083914..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_01_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_01_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_01_light.png
deleted file mode 100644
index c3c3caf..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_01_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_02_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_02_dark.png
deleted file mode 100644
index fc444cf..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_02_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_02_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_02_light.png
deleted file mode 100644
index abd6377..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_02_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_03_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_03_dark.png
deleted file mode 100644
index 6dbd1da..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_03_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_03_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_03_light.png
deleted file mode 100644
index d2e7108..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_03_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_04_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_04_dark.png
deleted file mode 100644
index d9f596b..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_04_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_04_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_04_light.png
deleted file mode 100644
index 4f32e1a..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_04_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_05_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_05_dark.png
deleted file mode 100644
index c568e04..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_05_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_05_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_05_light.png
deleted file mode 100644
index ed20dd9..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_05_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_06_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_06_dark.png
deleted file mode 100644
index bbe39e7..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_06_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_06_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_06_light.png
deleted file mode 100644
index 1edc15f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_06_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_07_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_07_dark.png
deleted file mode 100644
index 78aebaf..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_07_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_07_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_07_light.png
deleted file mode 100644
index b5a6a4f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_07_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_08_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_08_dark.png
deleted file mode 100644
index 44b91ce..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_08_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_08_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_08_light.png
deleted file mode 100644
index 85f66f9..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_08_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_09_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_09_dark.png
deleted file mode 100644
index 51ea34b..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_09_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_09_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_09_light.png
deleted file mode 100644
index 952de04..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_09_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_10_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_10_dark.png
deleted file mode 100644
index 8b1aa21..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_10_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_10_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_10_light.png
deleted file mode 100644
index 534bcc0..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_10_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_11_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_11_dark.png
deleted file mode 100644
index 1fffa01..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_11_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_11_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_11_light.png
deleted file mode 100644
index 0ff7e57..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_11_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_12_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_12_dark.png
deleted file mode 100644
index 06ac4dc..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_12_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_12_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_12_light.png
deleted file mode 100644
index 42a86f5..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_12_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_13_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_13_dark.png
deleted file mode 100644
index 0301090..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_13_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_13_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_13_light.png
deleted file mode 100644
index 4396f0e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_13_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_14_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_14_dark.png
deleted file mode 100644
index e19001b..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_14_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_14_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_14_light.png
deleted file mode 100644
index 2271581..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_14_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_15_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_15_dark.png
deleted file mode 100644
index 5e96208..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_15_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_15_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_15_light.png
deleted file mode 100644
index 0f69500..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_15_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_16_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_16_dark.png
deleted file mode 100644
index 07e1bd6..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_16_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_16_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_16_light.png
deleted file mode 100644
index cde8f19..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_16_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_17_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_17_dark.png
deleted file mode 100644
index b632e95..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_17_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_17_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_17_light.png
deleted file mode 100644
index 11d5d2e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_17_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_18_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_18_dark.png
deleted file mode 100644
index 660d527..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_18_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_18_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_18_light.png
deleted file mode 100644
index 2761ae1..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_18_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_19_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_19_dark.png
deleted file mode 100644
index 0aa3f84..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_19_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_19_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_19_light.png
deleted file mode 100644
index 27d166f..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_19_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_20_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_20_dark.png
deleted file mode 100644
index ebe527e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_20_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_20_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_20_light.png
deleted file mode 100644
index aeb2a8e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_20_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_21_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_21_dark.png
deleted file mode 100644
index 7337af5..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_21_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_21_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_21_light.png
deleted file mode 100644
index f3f31ef..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_21_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_22_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_22_dark.png
deleted file mode 100644
index 20d9f57..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_22_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_22_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_22_light.png
deleted file mode 100644
index bf8eb77..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_22_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_23_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_23_dark.png
deleted file mode 100644
index 56a0e14..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_23_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_23_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_23_light.png
deleted file mode 100644
index 67425e1..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_23_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_24_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_24_dark.png
deleted file mode 100644
index 7c76e19..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_24_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_24_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_24_light.png
deleted file mode 100644
index e02f1ed..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_24_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_25_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_25_dark.png
deleted file mode 100644
index f5fdcdd..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_25_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_25_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_25_light.png
deleted file mode 100644
index 8ce9b819..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_25_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_26_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_26_dark.png
deleted file mode 100644
index a29e443..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_26_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_26_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_26_light.png
deleted file mode 100644
index 349ca89..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_26_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_27_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_27_dark.png
deleted file mode 100644
index 0fc75d5..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_27_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_27_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_27_light.png
deleted file mode 100644
index 5cbd27c..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_27_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_28_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_28_dark.png
deleted file mode 100644
index 0ebb0ac..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_28_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_28_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_28_light.png
deleted file mode 100644
index 5b514aa..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_28_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_29_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_29_dark.png
deleted file mode 100644
index 8e7fe5c..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_29_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_29_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_29_light.png
deleted file mode 100644
index efb2c10..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_29_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_30_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_30_dark.png
deleted file mode 100644
index 0db679e..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_30_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_30_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_30_light.png
deleted file mode 100644
index 51c6051..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_connecting_30_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disabled_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disabled_dark.png
deleted file mode 100644
index fdb2121..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disabled_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disabled_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disabled_light.png
deleted file mode 100644
index 9ce7e3a..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disabled_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disconnected_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disconnected_dark.png
deleted file mode 100644
index e8601ce..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disconnected_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disconnected_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disconnected_light.png
deleted file mode 100644
index 34928d7..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_disconnected_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_grey.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_grey.png
deleted file mode 100644
index 792fd77..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_mr_button_grey.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_dark.png
deleted file mode 100755
index f171a8c..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_group_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_group_dark.png
deleted file mode 100755
index c8cb6ca..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_group_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_group_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_group_light.png
deleted file mode 100755
index 9c8863d..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_group_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_light.png
deleted file mode 100755
index 9335038..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_speaker_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_tv_dark.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_tv_dark.png
deleted file mode 100755
index a6a4858..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_tv_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_tv_light.png b/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_tv_light.png
deleted file mode 100755
index 4ca6787..0000000
--- a/packages/MediaComponents/res/drawable-xxhdpi/ic_vol_type_tv_light.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_00.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_00.png
deleted file mode 100644
index b2305d2..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_00.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_01.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_01.png
deleted file mode 100644
index 59395d4..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_01.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_02.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_02.png
deleted file mode 100644
index 70a7282..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_02.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_03.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_03.png
deleted file mode 100644
index b3f0f53..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_03.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_04.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_04.png
deleted file mode 100644
index 66a80d9..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_04.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_05.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_05.png
deleted file mode 100644
index 8ec3939..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_05.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_06.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_06.png
deleted file mode 100644
index 0f02536..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_06.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_07.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_07.png
deleted file mode 100644
index ba228f4..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_07.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_08.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_08.png
deleted file mode 100644
index 304277e..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_08.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_09.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_09.png
deleted file mode 100644
index f865bfb..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_09.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_10.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_10.png
deleted file mode 100644
index 17c5d6b..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_10.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_11.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_11.png
deleted file mode 100644
index a2f4ad5..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_11.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_12.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_12.png
deleted file mode 100644
index c230648..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_12.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_13.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_13.png
deleted file mode 100644
index b99324e..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_13.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_14.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_14.png
deleted file mode 100644
index c8618f0..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_14.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_15.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_15.png
deleted file mode 100644
index 4a0d770..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_collapse_15.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_00.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_00.png
deleted file mode 100644
index 4a0d770..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_00.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_01.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_01.png
deleted file mode 100644
index 4db4e50..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_01.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_02.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_02.png
deleted file mode 100644
index 82b5f03..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_02.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_03.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_03.png
deleted file mode 100644
index b05c758..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_03.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_04.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_04.png
deleted file mode 100644
index fa5c7fa..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_04.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_05.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_05.png
deleted file mode 100644
index 2c287e4..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_05.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_06.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_06.png
deleted file mode 100644
index eb7d0cf..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_06.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_07.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_07.png
deleted file mode 100644
index 95fa72b..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_07.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_08.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_08.png
deleted file mode 100644
index 5650eea..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_08.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_09.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_09.png
deleted file mode 100644
index 6f44355..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_09.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_10.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_10.png
deleted file mode 100644
index 4e877c3..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_10.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_11.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_11.png
deleted file mode 100644
index 7927f0a..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_11.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_12.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_12.png
deleted file mode 100644
index 71b19bb..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_12.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_13.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_13.png
deleted file mode 100644
index bf5921e..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_13.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_14.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_14.png
deleted file mode 100644
index 14b76b1..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_14.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_15.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_15.png
deleted file mode 100644
index b2305d2..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_group_expand_15.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable-xxxhdpi/ic_mr_button_grey.png b/packages/MediaComponents/res/drawable-xxxhdpi/ic_mr_button_grey.png
deleted file mode 100644
index 04a9525..0000000
--- a/packages/MediaComponents/res/drawable-xxxhdpi/ic_mr_button_grey.png
+++ /dev/null
Binary files differ
diff --git a/packages/MediaComponents/res/drawable/custom_progress.xml b/packages/MediaComponents/res/drawable/custom_progress.xml
deleted file mode 100644
index 9731a6e..0000000
--- a/packages/MediaComponents/res/drawable/custom_progress.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:id="@android:id/background">
- <shape android:shape="rectangle" >
- <solid android:color="#26000000" />
- </shape>
- </item>
- <item android:id="@android:id/secondaryProgress">
- <clip>
- <shape android:shape="rectangle" >
- <solid android:color="#5Cffffff" />
- </shape>
- </clip>
- </item>
- <item android:id="@android:id/progress">
- <clip>
- <shape android:shape="rectangle" >
- <solid android:color="#ffffff" />
- </shape>
- </clip>
- </item>
-</layer-list>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/custom_progress_thumb.xml b/packages/MediaComponents/res/drawable/custom_progress_thumb.xml
deleted file mode 100644
index 1a35970..0000000
--- a/packages/MediaComponents/res/drawable/custom_progress_thumb.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="oval" >
- <solid android:color="#ffffff" />
- <size
- android:height="@dimen/mcv2_custom_progress_thumb_size"
- android:width="@dimen/mcv2_custom_progress_thumb_size" />
-</shape>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_arrow_back.xml b/packages/MediaComponents/res/drawable/ic_arrow_back.xml
deleted file mode 100644
index 2b5f71e..0000000
--- a/packages/MediaComponents/res/drawable/ic_arrow_back.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_aspect_ratio.xml b/packages/MediaComponents/res/drawable/ic_aspect_ratio.xml
deleted file mode 100644
index c6228e6..0000000
--- a/packages/MediaComponents/res/drawable/ic_aspect_ratio.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M19,12h-2v3h-3v2h5v-5zM7,9h3L10,7L5,7v5h2L7,9zM21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19.01L3,19.01L3,4.99h18v14.02z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_audiotrack.xml b/packages/MediaComponents/res/drawable/ic_audiotrack.xml
deleted file mode 100644
index 27c12b5..0000000
--- a/packages/MediaComponents/res/drawable/ic_audiotrack.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M12,3v9.28c-0.47,-0.17 -0.97,-0.28 -1.5,-0.28C8.01,12 6,14.01 6,16.5S8.01,21 10.5,21c2.31,0 4.2,-1.75 4.45,-4H15V6h4V3h-7z"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_check.xml b/packages/MediaComponents/res/drawable/ic_check.xml
deleted file mode 100644
index 32f720b..0000000
--- a/packages/MediaComponents/res/drawable/ic_check.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0 0h24v24H0z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_chevron_left.xml b/packages/MediaComponents/res/drawable/ic_chevron_left.xml
deleted file mode 100644
index 8336d17..0000000
--- a/packages/MediaComponents/res/drawable/ic_chevron_left.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_chevron_right.xml b/packages/MediaComponents/res/drawable/ic_chevron_right.xml
deleted file mode 100644
index fb2ce09..0000000
--- a/packages/MediaComponents/res/drawable/ic_chevron_right.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_default_album_image.xml b/packages/MediaComponents/res/drawable/ic_default_album_image.xml
deleted file mode 100644
index 1cee643..0000000
--- a/packages/MediaComponents/res/drawable/ic_default_album_image.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="512dp"
- android:height="512dp"
- android:viewportWidth="512"
- android:viewportHeight="512">
-
- <path
- android:fillColor="#616161"
- android:pathData="M 0 0 H 512 V 512 H 0 V 0 Z" />
- <path
- android:fillColor="#525252"
- android:pathData="M256,151v123.14c-6.88-4.02-14.82-6.48-23.33-6.48 c-25.78,0-46.67,20.88-46.67,46.67c0,25.78,20.88,46.67,46.67,46.67s46.67-20.88,46.67-46.67V197.67H326V151H256z" />
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_forward_30.xml b/packages/MediaComponents/res/drawable/ic_forward_30.xml
deleted file mode 100644
index 7efdf16..0000000
--- a/packages/MediaComponents/res/drawable/ic_forward_30.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <group>
- <clip-path android:pathData="M24,24H0V0h24v24z M 0,0" />
- <path
- android:pathData="M9.6 13.5h.4c.2 0 .4,-.1.5,-.2s.2,-.2.2,-.4v-.2s-.1,-.1,-.1,-.2,-.1,-.1,-.2,-.1h-.5s-.1.1,-.2.1,-.1.1,-.1.2v.2h-1c0,-.2 0,-.3.1,-.5s.2,-.3.3,-.4.3,-.2.4,-.2.4,-.1.5,-.1c.2 0 .4 0 .6.1s.3.1.5.2.2.2.3.4.1.3.1.5v.3s-.1.2,-.1.3,-.1.2,-.2.2,-.2.1,-.3.2c.2.1.4.2.5.4s.2.4.2.6c0 .2 0 .4,-.1.5s-.2.3,-.3.4,-.3.2,-.5.2,-.4.1,-.6.1c-.2 0,-.4 0,-.5,-.1s-.3,-.1,-.5,-.2,-.2,-.2,-.3,-.4,-.1,-.4,-.1,-.6h.8v.2s.1.1.1.2.1.1.2.1h.5s.1,-.1.2,-.1.1,-.1.1,-.2v-.5s-.1,-.1,-.1,-.2,-.1,-.1,-.2,-.1h-.6v-.7zm5.7.7c0 .3 0 .6,-.1.8l-.3.6s-.3.3,-.5.3,-.4.1,-.6.1,-.4 0,-.6,-.1,-.3,-.2,-.5,-.3,-.2,-.3,-.3,-.6,-.1,-.5,-.1,-.8v-.7c0,-.3 0,-.6.1,-.8l.3,-.6s.3,-.3.5,-.3.4,-.1.6,-.1.4 0 .6.1.3.2.5.3.2.3.3.6.1.5.1.8v.7zm-.9,-.8v-.5s-.1,-.2,-.1,-.3,-.1,-.1,-.2,-.2,-.2,-.1,-.3,-.1,-.2 0,-.3.1l-.2.2s-.1.2,-.1.3v2s.1.2.1.3.1.1.2.2.2.1.3.1.2 0 .3,-.1l.2,-.2s.1,-.2.1,-.3v-1.5zM4 13c0 4.4 3.6 8 8 8s8,-3.6 8,-8h-2c0 3.3,-2.7 6,-6 6s-6,-2.7,-6,-6 2.7,-6 6,-6v4l5,-5,-5,-5v4c-4.4 0,-8 3.6,-8 8z"
- android:fillColor="#FFFFFF"/>
- </group>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_fullscreen.xml b/packages/MediaComponents/res/drawable/ic_fullscreen.xml
deleted file mode 100644
index 4b4f6bc..0000000
--- a/packages/MediaComponents/res/drawable/ic_fullscreen.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M7,14L5,14v5h5v-2L7,17v-3zM5,10h2L7,7h3L10,5L5,5v5zM17,17h-3v2h5v-5h-2v3zM14,5v2h3v3h2L19,5h-5z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_fullscreen_exit.xml b/packages/MediaComponents/res/drawable/ic_fullscreen_exit.xml
deleted file mode 100644
index bc204e2..0000000
--- a/packages/MediaComponents/res/drawable/ic_fullscreen_exit.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M5,16h3v3h2v-5L5,14v2zM8,8L5,8v2h5L10,5L8,5v3zM14,19h2v-3h3v-2h-5v5zM16,8L16,5h-2v5h5L19,8h-3z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_help.xml b/packages/MediaComponents/res/drawable/ic_help.xml
deleted file mode 100644
index 4d1d75d..0000000
--- a/packages/MediaComponents/res/drawable/ic_help.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0 0h24v24H0z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1
-17h-2v-2h2v2zm2.07-7.75l-.9 .92 C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1 .45 -2.1
-1.17-2.83l1.24-1.26c.37-.36 .59 -.86 .59 -1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21
-1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_high_quality.xml b/packages/MediaComponents/res/drawable/ic_high_quality.xml
deleted file mode 100644
index f76e22f..0000000
--- a/packages/MediaComponents/res/drawable/ic_high_quality.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="34dp"
- android:height="34dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0 0h24v24H0z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M19 4H5c-1.11 0-2 0.9-2 2v12c0 1.1 0.89 2 2 2h14c1.1 0 2-0.9 2-2V6c0-1.1-0.9-2-2-2zm-8 11H9.5v-2h-2v2H6V9h1.5v2.5h2V9H11v6zm7-1c0 0.55-0.45 1-1 1h-0.75v1.5h-1.5V15H14c-0.55 0-1-0.45-1-1v-4c0-0.55 0.45 -1 1-1h3c0.55 0 1 0.45 1 1v4zm-3.5-0.5h2v-3h-2v3z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_launch.xml b/packages/MediaComponents/res/drawable/ic_launch.xml
deleted file mode 100644
index f7af6aa..0000000
--- a/packages/MediaComponents/res/drawable/ic_launch.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M19,19H5V5h7V3H5c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2v7zM14,3v2h3.59l-9.83,9.83 1.41,1.41L19,6.41V10h2V3h-7z"/>
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_mute.xml b/packages/MediaComponents/res/drawable/ic_mute.xml
deleted file mode 100644
index 560aaec..0000000
--- a/packages/MediaComponents/res/drawable/ic_mute.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v2.21l2.45,2.45c0.03,-0.2 0.05,-0.41 0.05,-0.63zM19,12c0,0.94 -0.2,1.82 -0.54,2.64l1.51,1.51C20.63,14.91 21,13.5 21,12c0,-4.28 -2.99,-7.86 -7,-8.77v2.06c2.89,0.86 5,3.54 5,6.71zM4.27,3L3,4.27 7.73,9L3,9v6h4l5,5v-6.73l4.25,4.25c-0.67,0.52 -1.42,0.93 -2.25,1.18v2.06c1.38,-0.31 2.63,-0.95 3.69,-1.81L19.73,21 21,19.73l-9,-9L4.27,3zM12,4L9.91,6.09 12,8.18L12,4z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_pause_circle_filled.xml b/packages/MediaComponents/res/drawable/ic_pause_circle_filled.xml
deleted file mode 100644
index 73be228..0000000
--- a/packages/MediaComponents/res/drawable/ic_pause_circle_filled.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM11,16L9,16L9,8h2v8zM15,16h-2L13,8h2v8z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_play_circle_filled.xml b/packages/MediaComponents/res/drawable/ic_play_circle_filled.xml
deleted file mode 100644
index 9d39def..0000000
--- a/packages/MediaComponents/res/drawable/ic_play_circle_filled.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,16.5v-9l6,4.5 -6,4.5z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_replay_circle_filled.xml b/packages/MediaComponents/res/drawable/ic_replay_circle_filled.xml
deleted file mode 100644
index a56d5d9..0000000
--- a/packages/MediaComponents/res/drawable/ic_replay_circle_filled.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0,0h24v24H0V0z" />
- <path
- android:fillColor="#FFFFFF"
- android:fillType="evenOdd"
- android:pathData="M12,2C6.48,2,2,6.48,2,12c0,5.52,4.48,10,10,10c5.52,0,10-4.48,10-10
-C22,6.48,17.52,2,12,2z
-M18,12c0,3.31-2.69,6-6,6c-3.31,0-6-2.69-6-6h2c0,2.21,1.79,4,4,4s4-1.79,4-4s-1.79-4-4-4v3L8,7l4-4v3
-C15.31,6,18,8.69,18,12z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_rewind_10.xml b/packages/MediaComponents/res/drawable/ic_rewind_10.xml
deleted file mode 100644
index ae586b4..0000000
--- a/packages/MediaComponents/res/drawable/ic_rewind_10.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <group>
- <clip-path android:pathData="M0,0h24v24H0V0z M 0,0" />
- <path
- android:pathData="M12 5V1L7 6l5 5V7c3.3 0 6 2.7 6 6s-2.7 6,-6 6,-6,-2.7,-6,-6H4c0 4.4 3.6 8 8 8s8,-3.6 8,-8,-3.6,-8,-8,-8zm-1.1 11H10v-3.3L9 13v-.7l1.8,-.6h.1V16zm4.3,-1.8c0 .3 0 .6,-.1.8l-.3.6s-.3.3,-.5.3,-.4.1,-.6.1,-.4 0,-.6,-.1,-.3,-.2,-.5,-.3,-.2,-.3,-.3,-.6,-.1,-.5,-.1,-.8v-.7c0,-.3 0,-.6.1,-.8l.3,-.6s.3,-.3.5,-.3.4,-.1.6,-.1.4 0 .6.1c.2.1.3.2.5.3s.2.3.3.6.1.5.1.8v.7zm-.9,-.8v-.5s-.1,-.2,-.1,-.3,-.1,-.1,-.2,-.2,-.2,-.1,-.3,-.1,-.2 0,-.3.1l-.2.2s-.1.2,-.1.3v2s.1.2.1.3.1.1.2.2.2.1.3.1.2 0 .3,-.1l.2,-.2s.1,-.2.1,-.3v-1.5z"
- android:fillColor="#FFFFFF"/>
- </group>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_sd.xml b/packages/MediaComponents/res/drawable/ic_sd.xml
deleted file mode 100644
index decb6d2..0000000
--- a/packages/MediaComponents/res/drawable/ic_sd.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0,0h24v24H0V0z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M19,3H5C3.89,3,3,3.9,3,5v14c0,1.1,0.89,2,2,2h14c1.1,0,2-0.9,2-2V5C21,3.9,20.1,3,19,3z
-M13,9h4c0.55,0,1,0.45,1,1v4 c0,0.55-0.45,1-1,1h-4V9z
-M9.5,13.5v-1H7c-0.55,0-1-0.45-1-1V10c0-0.55,0.45-1,1-1h3c0.55,0,1,0.45,1,1v1H9.5v-0.5h-2v1H10
-c0.55,0,1,0.45,1,1V14c0,0.55-0.45,1-1,1H7c-0.55,0-1-0.45-1-1v-1h1.5v0.5H9.5z
-M14.5,13.5h2v-3h-2V13.5z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_settings.xml b/packages/MediaComponents/res/drawable/ic_settings.xml
deleted file mode 100644
index a59ecc1..0000000
--- a/packages/MediaComponents/res/drawable/ic_settings.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_skip_next.xml b/packages/MediaComponents/res/drawable/ic_skip_next.xml
deleted file mode 100644
index b1f2812..0000000
--- a/packages/MediaComponents/res/drawable/ic_skip_next.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_skip_previous.xml b/packages/MediaComponents/res/drawable/ic_skip_previous.xml
deleted file mode 100644
index 81da314..0000000
--- a/packages/MediaComponents/res/drawable/ic_skip_previous.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="40dp"
- android:height="40dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/ic_subtitle_off.xml b/packages/MediaComponents/res/drawable/ic_subtitle_off.xml
deleted file mode 100644
index c0a727a..0000000
--- a/packages/MediaComponents/res/drawable/ic_subtitle_off.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0,0h24v24H0V0z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M19.5,5.5v13h-15v-13H19.5z M19,4H5C3.89,4,3,4.9,3,6v12c0,1.1,0.89,2,2,2h14c1.1,0,2-0.9,2-2V6C21,4.9,20.1,4,19,4L19,4z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M11,11H9.5v-0.5h-2v3h2V13H11v1c0,0.55-0.45,1-1,1H7c-0.55,0-1-0.45-1-1v-4c0-0.55,0.45-1,1-1h3c0.55,0,1,0.45,1,1V11z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M18,11h-1.5v-0.5h-2v3h2V13H18v1c0,0.55-0.45,1-1,1h-3c-0.55,0-1-0.45-1-1v-4c0-0.55,0.45-1,1-1h3c0.55,0,1,0.45,1,1V11z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_subtitle_on.xml b/packages/MediaComponents/res/drawable/ic_subtitle_on.xml
deleted file mode 100644
index 7c91c06..0000000
--- a/packages/MediaComponents/res/drawable/ic_subtitle_on.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
-
- <path
- android:pathData="M0 0h24v24H0z" />
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M19 4H5c-1.11 0-2 0.9-2 2v12c0 1.1 0.89 2 2 2h14c1.1 0 2-0.9 2-2V6c0-1.1-0.9-2-2-2zm-8 7H9.5v-0.5h-2v3h2V13H11v1c0 0.55-0.45 1-1 1H7c-0.55 0-1-0.45-1-1v-4c0-0.55 0.45 -1 1-1h3c0.55 0 1 0.45 1 1v1zm7 0h-1.5v-0.5h-2v3h2V13H18v1c0 0.55-0.45 1-1 1h-3c-0.55 0-1-0.45-1-1v-4c0-0.55 0.45 -1 1-1h3c0.55 0 1 0.45 1 1v1z" />
-</vector>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/ic_unmute.xml b/packages/MediaComponents/res/drawable/ic_unmute.xml
deleted file mode 100644
index 9dfb2b9..0000000
--- a/packages/MediaComponents/res/drawable/ic_unmute.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z"
- android:fillColor="#FFFFFF"/>
-</vector>
diff --git a/packages/MediaComponents/res/drawable/mr_button_connected_dark.xml b/packages/MediaComponents/res/drawable/mr_button_connected_dark.xml
deleted file mode 100644
index 110ff13..0000000
--- a/packages/MediaComponents/res/drawable/mr_button_connected_dark.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="true">
- <item android:drawable="@drawable/ic_mr_button_connected_00_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_01_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_02_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_03_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_04_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_05_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_06_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_07_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_08_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_09_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_10_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_11_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_12_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_13_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_14_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_15_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_16_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_17_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_18_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_19_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_20_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_21_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_22_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_23_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_24_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_25_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_26_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_27_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_28_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_29_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_30_dark" android:duration="42" />
-</animation-list>
diff --git a/packages/MediaComponents/res/drawable/mr_button_connected_light.xml b/packages/MediaComponents/res/drawable/mr_button_connected_light.xml
deleted file mode 100644
index bcfc7fe..0000000
--- a/packages/MediaComponents/res/drawable/mr_button_connected_light.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="true">
- <item android:drawable="@drawable/ic_mr_button_connected_00_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_01_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_02_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_03_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_04_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_05_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_06_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_07_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_08_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_09_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_10_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_11_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_12_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_13_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_14_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_15_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_16_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_17_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_18_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_19_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_20_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_21_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_22_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_23_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_24_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_25_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_26_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_27_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_28_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_29_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connected_30_light" android:duration="42" />
-</animation-list>
diff --git a/packages/MediaComponents/res/drawable/mr_button_connecting_dark.xml b/packages/MediaComponents/res/drawable/mr_button_connecting_dark.xml
deleted file mode 100644
index 55af7b3..0000000
--- a/packages/MediaComponents/res/drawable/mr_button_connecting_dark.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:drawable="@drawable/ic_mr_button_connecting_00_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_01_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_02_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_03_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_04_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_05_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_06_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_07_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_08_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_09_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_10_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_11_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_12_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_13_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_14_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_15_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_16_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_17_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_18_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_19_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_20_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_21_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_22_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_23_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_24_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_25_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_26_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_27_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_28_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_29_dark" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_30_dark" android:duration="42" />
-</animation-list>
diff --git a/packages/MediaComponents/res/drawable/mr_button_connecting_light.xml b/packages/MediaComponents/res/drawable/mr_button_connecting_light.xml
deleted file mode 100644
index 93b4170..0000000
--- a/packages/MediaComponents/res/drawable/mr_button_connecting_light.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:drawable="@drawable/ic_mr_button_connecting_00_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_01_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_02_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_03_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_04_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_05_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_06_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_07_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_08_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_09_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_10_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_11_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_12_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_13_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_14_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_15_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_16_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_17_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_18_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_19_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_20_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_21_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_22_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_23_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_24_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_25_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_26_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_27_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_28_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_29_light" android:duration="42" />
- <item android:drawable="@drawable/ic_mr_button_connecting_30_light" android:duration="42" />
-</animation-list>
diff --git a/packages/MediaComponents/res/drawable/mr_button_dark.xml b/packages/MediaComponents/res/drawable/mr_button_dark.xml
deleted file mode 100644
index 8f1dfaa..0000000
--- a/packages/MediaComponents/res/drawable/mr_button_dark.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_checked="true" android:state_enabled="true"
- android:drawable="@drawable/mr_button_connected_dark" />
- <item android:state_checkable="true" android:state_enabled="true"
- android:drawable="@drawable/mr_button_connecting_dark" />
- <item android:state_enabled="true"
- android:drawable="@drawable/ic_mr_button_disconnected_dark" />
- <item android:drawable="@drawable/ic_mr_button_disabled_dark" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_button_light.xml b/packages/MediaComponents/res/drawable/mr_button_light.xml
deleted file mode 100644
index 1d3d84e..0000000
--- a/packages/MediaComponents/res/drawable/mr_button_light.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_checked="true" android:state_enabled="true"
- android:drawable="@drawable/mr_button_connected_light" />
- <item android:state_checkable="true" android:state_enabled="true"
- android:drawable="@drawable/mr_button_connecting_light" />
- <item android:state_enabled="true"
- android:drawable="@drawable/ic_mr_button_disconnected_light" />
- <item android:drawable="@drawable/ic_mr_button_disabled_light" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_dialog_close_dark.xml b/packages/MediaComponents/res/drawable/mr_dialog_close_dark.xml
deleted file mode 100644
index 288c8c7..0000000
--- a/packages/MediaComponents/res/drawable/mr_dialog_close_dark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_dialog_close_dark" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_dialog_close_light.xml b/packages/MediaComponents/res/drawable/mr_dialog_close_light.xml
deleted file mode 100644
index cd50e0f..0000000
--- a/packages/MediaComponents/res/drawable/mr_dialog_close_light.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <bitmap
- android:src="@drawable/ic_dialog_close_light"
- android:alpha="0.87" />
- </item>
-
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_dialog_material_background_dark.xml b/packages/MediaComponents/res/drawable/mr_dialog_material_background_dark.xml
deleted file mode 100644
index ebc7eca..0000000
--- a/packages/MediaComponents/res/drawable/mr_dialog_material_background_dark.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<!-- This is the copy of @drawable/abc_dialog_material_background_dark except for inset
- which includes unnecessary padding. -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <corners android:radius="2dp" />
- <solid android:color="@color/background_floating_material_dark" />
-</shape>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/mr_dialog_material_background_light.xml b/packages/MediaComponents/res/drawable/mr_dialog_material_background_light.xml
deleted file mode 100644
index c1b235a..0000000
--- a/packages/MediaComponents/res/drawable/mr_dialog_material_background_light.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<!-- This is the copy of @drawable/abc_dialog_material_background_light except for inset
- which includes unnecessary padding. -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <corners android:radius="2dp" />
- <solid android:color="@color/background_floating_material_light" />
-</shape>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/drawable/mr_group_collapse.xml b/packages/MediaComponents/res/drawable/mr_group_collapse.xml
deleted file mode 100644
index 8f72bc8..0000000
--- a/packages/MediaComponents/res/drawable/mr_group_collapse.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="true">
- <item android:drawable="@drawable/ic_group_collapse_00" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_01" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_02" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_03" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_04" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_05" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_06" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_07" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_08" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_09" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_10" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_11" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_12" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_13" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_14" android:duration="13" />
- <item android:drawable="@drawable/ic_group_collapse_15" android:duration="13" />
-</animation-list>
diff --git a/packages/MediaComponents/res/drawable/mr_group_expand.xml b/packages/MediaComponents/res/drawable/mr_group_expand.xml
deleted file mode 100644
index 6b3fdb6..0000000
--- a/packages/MediaComponents/res/drawable/mr_group_expand.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="true">
- <item android:drawable="@drawable/ic_group_expand_00" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_01" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_02" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_03" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_04" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_05" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_06" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_07" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_08" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_09" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_10" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_11" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_12" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_13" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_14" android:duration="13" />
- <item android:drawable="@drawable/ic_group_expand_15" android:duration="13" />
-</animation-list>
diff --git a/packages/MediaComponents/res/drawable/mr_media_pause_dark.xml b/packages/MediaComponents/res/drawable/mr_media_pause_dark.xml
deleted file mode 100644
index 86218a7..0000000
--- a/packages/MediaComponents/res/drawable/mr_media_pause_dark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_media_pause_dark" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_media_pause_light.xml b/packages/MediaComponents/res/drawable/mr_media_pause_light.xml
deleted file mode 100644
index 2dd1f02..0000000
--- a/packages/MediaComponents/res/drawable/mr_media_pause_light.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <bitmap
- android:src="@drawable/ic_media_pause_light"
- android:alpha="0.87" />
- </item>
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_media_play_dark.xml b/packages/MediaComponents/res/drawable/mr_media_play_dark.xml
deleted file mode 100644
index 9d45a33..0000000
--- a/packages/MediaComponents/res/drawable/mr_media_play_dark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_media_play_dark" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_media_play_light.xml b/packages/MediaComponents/res/drawable/mr_media_play_light.xml
deleted file mode 100644
index f1fb7a6..0000000
--- a/packages/MediaComponents/res/drawable/mr_media_play_light.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <bitmap
- android:src="@drawable/ic_media_play_light"
- android:alpha="0.87" />
- </item>
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_media_stop_dark.xml b/packages/MediaComponents/res/drawable/mr_media_stop_dark.xml
deleted file mode 100644
index 3e108a9..0000000
--- a/packages/MediaComponents/res/drawable/mr_media_stop_dark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_media_stop_dark" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_media_stop_light.xml b/packages/MediaComponents/res/drawable/mr_media_stop_light.xml
deleted file mode 100644
index b2c6ce8..0000000
--- a/packages/MediaComponents/res/drawable/mr_media_stop_light.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <bitmap
- android:src="@drawable/ic_media_stop_light"
- android:alpha="0.87" />
- </item>
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_vol_type_audiotrack_dark.xml b/packages/MediaComponents/res/drawable/mr_vol_type_audiotrack_dark.xml
deleted file mode 100644
index 44f4fd6..0000000
--- a/packages/MediaComponents/res/drawable/mr_vol_type_audiotrack_dark.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_audiotrack_dark" />
-</selector>
diff --git a/packages/MediaComponents/res/drawable/mr_vol_type_audiotrack_light.xml b/packages/MediaComponents/res/drawable/mr_vol_type_audiotrack_light.xml
deleted file mode 100644
index 5c9dbc0..0000000
--- a/packages/MediaComponents/res/drawable/mr_vol_type_audiotrack_light.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <bitmap
- android:src="@drawable/ic_audiotrack_light"
- android:alpha="0.87" />
- </item>
-</selector>
diff --git a/packages/MediaComponents/res/interpolator/mr_fast_out_slow_in.xml b/packages/MediaComponents/res/interpolator/mr_fast_out_slow_in.xml
deleted file mode 100644
index 6b6a171..0000000
--- a/packages/MediaComponents/res/interpolator/mr_fast_out_slow_in.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 2018 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
- -->
-
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:controlX1="0.4"
- android:controlY1="0"
- android:controlX2="0.2"
- android:controlY2="1"/>
diff --git a/packages/MediaComponents/res/interpolator/mr_linear_out_slow_in.xml b/packages/MediaComponents/res/interpolator/mr_linear_out_slow_in.xml
deleted file mode 100644
index 20bf298..0000000
--- a/packages/MediaComponents/res/interpolator/mr_linear_out_slow_in.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright 2018 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
- -->
-
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:controlX1="0"
- android:controlY1="0"
- android:controlX2="0.2"
- android:controlY2="1"/>
diff --git a/packages/MediaComponents/res/layout/embedded_music.xml b/packages/MediaComponents/res/layout/embedded_music.xml
deleted file mode 100644
index 3e4d365..0000000
--- a/packages/MediaComponents/res/layout/embedded_music.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <View
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="0.25"/>
-
- <ImageView
- android:id="@+id/album"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="0.5"
- android:scaleType="fitCenter"
- android:src="@drawable/ic_default_album_image" />
-
- <View
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="0.25"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/embedded_settings_list_item.xml b/packages/MediaComponents/res/layout/embedded_settings_list_item.xml
deleted file mode 100644
index 1156dca..0000000
--- a/packages/MediaComponents/res/layout/embedded_settings_list_item.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:orientation="horizontal"
- android:background="@color/black_opacity_70">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:gravity="center"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/icon"
- android:layout_width="@dimen/mcv2_embedded_settings_icon_size"
- android:layout_height="@dimen/mcv2_embedded_settings_icon_size"
- android:layout_margin="8dp"
- android:gravity="center" />
- </LinearLayout>
-
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:gravity="center"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/main_text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_text_height"
- android:gravity="center"
- android:paddingLeft="2dp"
- android:textColor="@color/white"
- android:textSize="@dimen/mcv2_embedded_settings_main_text_size"/>
-
- <TextView
- android:id="@+id/sub_text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_text_height"
- android:layout_below="@id/main_text"
- android:gravity="center"
- android:paddingLeft="2dp"
- android:textColor="@color/white_opacity_70"
- android:textSize="@dimen/mcv2_embedded_settings_sub_text_size"/>
- </RelativeLayout>
-</LinearLayout>
-
diff --git a/packages/MediaComponents/res/layout/embedded_sub_settings_list_item.xml b/packages/MediaComponents/res/layout/embedded_sub_settings_list_item.xml
deleted file mode 100644
index 5947a72..0000000
--- a/packages/MediaComponents/res/layout/embedded_sub_settings_list_item.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:orientation="horizontal"
- android:background="@color/black_opacity_70">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:gravity="center"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/check"
- android:layout_width="@dimen/mcv2_embedded_settings_icon_size"
- android:layout_height="@dimen/mcv2_embedded_settings_icon_size"
- android:layout_margin="8dp"
- android:gravity="center"
- android:src="@drawable/ic_check"/>
- </LinearLayout>
-
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:gravity="center"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_embedded_settings_text_height"
- android:gravity="center"
- android:paddingLeft="2dp"
- android:textColor="@color/white"
- android:textSize="@dimen/mcv2_embedded_settings_main_text_size"/>
- </RelativeLayout>
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/embedded_transport_controls.xml b/packages/MediaComponents/res/layout/embedded_transport_controls.xml
deleted file mode 100644
index a3a5957..0000000
--- a/packages/MediaComponents/res/layout/embedded_transport_controls.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:orientation="horizontal"
- android:paddingLeft="@dimen/mcv2_transport_controls_padding"
- android:paddingRight="@dimen/mcv2_transport_controls_padding"
- android:visibility="visible">
-
- <ImageButton android:id="@+id/prev" style="@style/EmbeddedTransportControlsButton.Previous" />
- <ImageButton android:id="@+id/rew" style="@style/EmbeddedTransportControlsButton.Rew" />
- <ImageButton android:id="@+id/pause" style="@style/EmbeddedTransportControlsButton.Pause" />
- <ImageButton android:id="@+id/ffwd" style="@style/EmbeddedTransportControlsButton.Ffwd" />
- <ImageButton android:id="@+id/next" style="@style/EmbeddedTransportControlsButton.Next" />
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/full_landscape_music.xml b/packages/MediaComponents/res/layout/full_landscape_music.xml
deleted file mode 100644
index 8ce7058..0000000
--- a/packages/MediaComponents/res/layout/full_landscape_music.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#B300FF00"
- android:orientation="horizontal">
-
- <LinearLayout
- android:id="@+id/music_image"
- style="@style/FullMusicLandscape.Image">
-
- <ImageView
- android:id="@+id/album"
- android:layout_width="@dimen/mcv2_full_album_image_landscape_size"
- android:layout_height="@dimen/mcv2_full_album_image_landscape_size"
- android:src="@drawable/ic_default_album_image"/>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/music_text"
- style="@style/FullMusicLandscape.Text">
-
- <TextView
- android:id="@+id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/mcv2_music_title_unknown_text"
- android:textSize="20sp"
- android:textStyle="bold"
- android:textColor="#FFFFFF" />
- <TextView
- android:id="@+id/artist"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/mcv2_music_artist_unknown_text"
- android:textSize="16sp"
- android:textColor="#BBBBBB" />
- </LinearLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/full_portrait_music.xml b/packages/MediaComponents/res/layout/full_portrait_music.xml
deleted file mode 100644
index 75f1bb3..0000000
--- a/packages/MediaComponents/res/layout/full_portrait_music.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <LinearLayout
- android:id="@+id/music_image"
- style="@style/FullMusicPortrait.Image">
-
- <ImageView
- android:id="@+id/album"
- android:layout_width="@dimen/mcv2_full_album_image_portrait_size"
- android:layout_height="@dimen/mcv2_full_album_image_portrait_size"
- android:src="@drawable/ic_default_album_image"/>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/music_text"
- style="@style/FullMusicPortrait.Text">
-
- <TextView
- android:id="@+id/title"
- android:layout_width="@dimen/mcv2_full_album_image_portrait_size"
- android:layout_height="wrap_content"
- android:text="@string/mcv2_music_title_unknown_text"
- android:textSize="20sp"
- android:textStyle="bold"
- android:textColor="#FFFFFF" />
- <TextView
- android:id="@+id/artist"
- android:layout_width="@dimen/mcv2_full_album_image_portrait_size"
- android:layout_height="wrap_content"
- android:text="@string/mcv2_music_artist_unknown_text"
- android:textSize="16sp"
- android:textColor="#BBBBBB" />
- </LinearLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/full_settings_list_item.xml b/packages/MediaComponents/res/layout/full_settings_list_item.xml
deleted file mode 100644
index f92ea5e..0000000
--- a/packages/MediaComponents/res/layout/full_settings_list_item.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_height"
- android:orientation="horizontal"
- android:background="@color/black_opacity_70">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_height"
- android:gravity="center"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/icon"
- android:layout_width="@dimen/mcv2_full_settings_icon_size"
- android:layout_height="@dimen/mcv2_full_settings_icon_size"
- android:layout_margin="8dp"
- android:gravity="center"/>
- </LinearLayout>
-
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_height"
- android:gravity="center"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/main_text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_text_height"
- android:paddingLeft="2dp"
- android:gravity="center"
- android:textColor="@color/white"
- android:textSize="@dimen/mcv2_full_settings_main_text_size"/>
-
- <TextView
- android:id="@+id/sub_text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_text_height"
- android:layout_below="@id/main_text"
- android:gravity="center"
- android:paddingLeft="2dp"
- android:textColor="@color/white_opacity_70"
- android:textSize="@dimen/mcv2_full_settings_sub_text_size"/>
- </RelativeLayout>
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/full_sub_settings_list_item.xml b/packages/MediaComponents/res/layout/full_sub_settings_list_item.xml
deleted file mode 100644
index 49128d0..0000000
--- a/packages/MediaComponents/res/layout/full_sub_settings_list_item.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_height"
- android:orientation="horizontal"
- android:background="@color/black_opacity_70">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_height"
- android:gravity="center"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@+id/check"
- android:layout_width="@dimen/mcv2_full_settings_icon_size"
- android:layout_height="@dimen/mcv2_full_settings_icon_size"
- android:layout_margin="8dp"
- android:gravity="center"
- android:src="@drawable/ic_check"/>
- </LinearLayout>
-
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_height"
- android:gravity="center"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/text"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/mcv2_full_settings_text_height"
- android:gravity="center"
- android:paddingLeft="2dp"
- android:textColor="@color/white"
- android:textSize="@dimen/mcv2_full_settings_main_text_size"/>
- </RelativeLayout>
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/full_transport_controls.xml b/packages/MediaComponents/res/layout/full_transport_controls.xml
deleted file mode 100644
index 0914785..0000000
--- a/packages/MediaComponents/res/layout/full_transport_controls.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:orientation="horizontal"
- android:paddingLeft="@dimen/mcv2_transport_controls_padding"
- android:paddingRight="@dimen/mcv2_transport_controls_padding"
- android:visibility="visible">
-
- <ImageButton android:id="@+id/prev" style="@style/FullTransportControlsButton.Previous" />
- <ImageButton android:id="@+id/rew" style="@style/FullTransportControlsButton.Rew" />
- <ImageButton android:id="@+id/pause" style="@style/FullTransportControlsButton.Pause" />
- <ImageButton android:id="@+id/ffwd" style="@style/FullTransportControlsButton.Ffwd" />
- <ImageButton android:id="@+id/next" style="@style/FullTransportControlsButton.Next" />
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/media_controller.xml b/packages/MediaComponents/res/layout/media_controller.xml
deleted file mode 100644
index 4658f04..0000000
--- a/packages/MediaComponents/res/layout/media_controller.xml
+++ /dev/null
@@ -1,265 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 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"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:layoutDirection="ltr">
-
- <RelativeLayout
- android:id="@+id/title_bar"
- android:background="@layout/title_bar_gradient"
- style="@style/TitleBar">
-
- <LinearLayout
- android:id="@+id/title_bar_left"
- android:gravity="center"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:orientation="horizontal">
-
- <ImageButton
- android:id="@+id/back"
- android:clickable="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentStart="true"
- android:layout_centerVertical="true"
- android:paddingLeft="5dip"
- android:visibility="visible"
- style="@style/TitleBarButton.Back"/>
-
- <TextView
- android:id="@+id/title_text"
- android:ellipsize="end"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/back"
- android:layout_centerVertical="true"
- android:maxLines="1"
- android:paddingLeft="5dip"
- android:paddingRight="5dip"
- android:textSize="15sp"
- android:textColor="#FFFFFFFF"/>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/title_bar_right"
- android:gravity="center"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:orientation="horizontal">
-
- <LinearLayout
- android:id="@+id/ad_external_link"
- android:clickable="true"
- android:gravity="center"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:paddingLeft="5dip"
- android:paddingRight="10dip"
- android:orientation="horizontal"
- android:visibility="gone">
-
- <TextView
- android:id="@+id/ad_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:paddingRight="5dip"
- android:text="@string/MediaControlView2_ad_text"
- android:textSize="10sp"
- android:textColor="#FFFFFFFF" />
-
- <ImageButton
- android:id="@+id/ad_launch"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- style="@style/TitleBarButton.Launch" />
- </LinearLayout>
-
- <view class="com.android.support.mediarouter.app.MediaRouteButton"
- android:id="@+id/cast"
- android:layout_centerVertical="true"
- android:visibility="gone"
- android:contentDescription="@string/mr_button_content_description"
- style="@style/TitleBarButton" />
- </LinearLayout>
-
- </RelativeLayout>
-
- <LinearLayout
- android:id="@+id/center_view"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:gravity="center"
- android:orientation="vertical">
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/minimal_extra_view"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="right">
-
- <ImageButton
- android:id="@+id/fullscreen"
- android:gravity="right"
- style="@style/BottomBarButton.FullScreen" />
- </LinearLayout>
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="@dimen/mcv2_custom_progress_thumb_size">
-
- <SeekBar
- android:id="@+id/progress"
- android:layout_width="match_parent"
- android:layout_height="@dimen/mcv2_custom_progress_thumb_size"
- android:contentDescription="@string/mcv2_seek_bar_desc"
- android:padding="0dp"
- android:maxHeight="@dimen/mcv2_custom_progress_max_size"
- android:minHeight="@dimen/mcv2_custom_progress_max_size"
- android:elevation="10dp"/>
-
- <View
- android:id="@+id/progress_buffer"
- android:layout_width="match_parent"
- android:layout_height="@dimen/mcv2_buffer_view_height"
- android:layout_alignParentBottom="true"
- android:background="@color/bottom_bar_background"
- android:elevation="0dp"/>
- </RelativeLayout>
-
- <RelativeLayout
- android:id="@+id/bottom_bar"
- android:layout_width="match_parent"
- android:layout_height="44dp"
- android:orientation="horizontal"
- android:background="@color/bottom_bar_background">
-
- <LinearLayout
- android:id="@+id/bottom_bar_left"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_alignParentStart="true"
- android:layout_centerVertical="true">
-
- <TextView
- android:id="@+id/ad_skip_time"
- android:gravity="center"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_marginLeft="4dp"
- android:textSize="12sp"
- android:textColor="#FFFFFF"
- android:visibility="gone" />
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/time"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_toRightOf="@id/bottom_bar_left"
- android:paddingLeft="10dp"
- android:paddingRight="10dp"
- android:gravity="center" >
-
- <TextView
- android:id="@+id/time_current"
- style="@style/TimeText.Current"/>
- <TextView
- android:id="@+id/time_interpunct"
- style="@style/TimeText.Interpunct"/>
- <TextView
- android:id="@+id/time_end"
- style="@style/TimeText.End"/>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/bottom_bar_right"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentEnd="true"
- android:gravity="right">
-
- <LinearLayout
- android:id="@+id/basic_controls"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:orientation="horizontal" >
-
- <TextView
- android:id="@+id/ad_remaining"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:textSize="12sp"
- android:textColor="#FFFFFF"
- android:visibility="gone" />
-
- <ImageButton
- android:id="@+id/mute"
- style="@style/BottomBarButton.Mute" />
- <ImageButton
- android:id="@+id/subtitle"
- android:scaleType="fitCenter"
- android:visibility="gone"
- style="@style/BottomBarButton.CC" />
- <ImageButton
- android:id="@+id/fullscreen"
- style="@style/BottomBarButton.FullScreen"/>
- <ImageButton
- android:id="@+id/overflow_right"
- style="@style/BottomBarButton.OverflowRight"/>
- </LinearLayout>
-
- <LinearLayout
- android:id="@+id/extra_controls"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:visibility="gone"
- android:orientation="horizontal"
- android:gravity="center_vertical">
-
- <LinearLayout
- android:id="@+id/custom_buttons"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-
- <ImageButton
- android:id="@+id/video_quality"
- style="@style/BottomBarButton.VideoQuality" />
- <ImageButton
- android:id="@+id/settings"
- style="@style/BottomBarButton.Settings" />
- <ImageButton
- android:id="@+id/overflow_left"
- style="@style/BottomBarButton.OverflowLeft"/>
- </LinearLayout>
- </LinearLayout>
- </RelativeLayout>
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/minimal_transport_controls.xml b/packages/MediaComponents/res/layout/minimal_transport_controls.xml
deleted file mode 100644
index 800c80b..0000000
--- a/packages/MediaComponents/res/layout/minimal_transport_controls.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:orientation="horizontal">
-
- <ImageButton android:id="@+id/pause" style="@style/MinimalTransportControlsButton" />
-</LinearLayout>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/mr_chooser_dialog.xml b/packages/MediaComponents/res/layout/mr_chooser_dialog.xml
deleted file mode 100644
index ee89e16..0000000
--- a/packages/MediaComponents/res/layout/mr_chooser_dialog.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
- <TextView android:id="@+id/mr_chooser_title"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="24dp"
- android:paddingRight="24dp"
- android:paddingTop="24dp"
- android:text="@string/mr_chooser_title"
- android:singleLine="true"
- android:ellipsize="end"
- android:textAppearance="@style/TextAppearance.MediaRouter.Title" />
- <ListView android:id="@+id/mr_chooser_list"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:divider="@android:color/transparent"
- android:dividerHeight="0dp" />
- <LinearLayout android:id="@android:id/empty"
- android:layout_width="fill_parent"
- android:layout_height="240dp"
- android:orientation="vertical"
- android:paddingTop="90dp"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:visibility="gone">
- <TextView android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:text="@string/mr_chooser_searching"
- android:textAppearance="@style/TextAppearance.MediaRouter.SecondaryText" />
- <ProgressBar android:layout_width="150dp"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:indeterminate="true"
- style="?android:attr/progressBarStyleHorizontal" />
- </LinearLayout>
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/mr_chooser_list_item.xml b/packages/MediaComponents/res/layout/mr_chooser_list_item.xml
deleted file mode 100644
index 958879b..0000000
--- a/packages/MediaComponents/res/layout/mr_chooser_list_item.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:minHeight="56dp"
- android:paddingLeft="24dp"
- android:paddingRight="24dp"
- android:orientation="horizontal"
- android:gravity="center_vertical" >
-
- <ImageView android:id="@+id/mr_chooser_route_icon"
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:layout_marginRight="24dp" />
-
- <LinearLayout android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="1dp"
- android:orientation="vertical" >
-
- <TextView android:id="@+id/mr_chooser_route_name"
- android:layout_width="fill_parent"
- android:layout_height="32dp"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="@style/TextAppearance.MediaRouter.PrimaryText" />
-
- <TextView android:id="@+id/mr_chooser_route_desc"
- android:layout_width="fill_parent"
- android:layout_height="24dp"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="@style/TextAppearance.MediaRouter.SecondaryText" />
- </LinearLayout>
-
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/mr_controller_material_dialog_b.xml b/packages/MediaComponents/res/layout/mr_controller_material_dialog_b.xml
deleted file mode 100644
index f6f7be5..0000000
--- a/packages/MediaComponents/res/layout/mr_controller_material_dialog_b.xml
+++ /dev/null
@@ -1,206 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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:id="@+id/mr_expandable_area"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <LinearLayout android:id="@+id/mr_dialog_area"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:orientation="vertical"
- android:background="?android:attr/colorBackgroundFloating">
- <LinearLayout android:id="@+id/mr_title_bar"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="24dp"
- android:paddingRight="12dp"
- android:orientation="horizontal" >
- <TextView android:id="@+id/mr_name"
- android:layout_width="0dp"
- android:layout_height="72dp"
- android:layout_weight="1"
- android:gravity="center_vertical"
- android:singleLine="true"
- android:ellipsize="end"
- android:textAppearance="@style/TextAppearance.MediaRouter.Title" />
- <ImageButton android:id="@+id/mr_close"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_gravity="center_vertical"
- android:contentDescription="@string/mr_controller_close_description"
- android:src="?attr/mediaRouteCloseDrawable"
- android:background="?android:attr/selectableItemBackgroundBorderless" />
- </LinearLayout>
- <FrameLayout android:id="@+id/mr_custom_control"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:visibility="gone" />
- <FrameLayout android:id="@+id/mr_default_control"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <ImageView android:id="@+id/mr_art"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:adjustViewBounds="true"
- android:scaleType="fitXY"
- android:background="?android:attr/colorPrimary"
- android:layout_gravity="top"
- android:contentDescription="@string/mr_controller_album_art"
- android:visibility="gone" />
- <LinearLayout android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_gravity="bottom"
- android:splitMotionEvents="false">
- <LinearLayout android:id="@+id/mr_media_main_control"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="16dp"
- android:paddingBottom="16dp"
- android:layout_gravity="bottom"
- android:theme="?attr/mediaRouteControlPanelThemeOverlay">
- <RelativeLayout
- android:id="@+id/mr_playback_control"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:paddingLeft="24dp"
- android:paddingRight="12dp" >
- <ImageButton android:id="@+id/mr_control_playback_ctrl"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="12dp"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:contentDescription="@string/mr_controller_play"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:visibility="gone" />
- <LinearLayout android:id="@+id/mr_control_title_container"
- android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toLeftOf="@id/mr_control_playback_ctrl"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true">
- <TextView android:id="@+id/mr_control_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="@style/TextAppearance.MediaRouter.PrimaryText"
- android:singleLine="true" />
- <TextView android:id="@+id/mr_control_subtitle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="@style/TextAppearance.MediaRouter.SecondaryText"
- android:singleLine="true" />
- </LinearLayout>
- </RelativeLayout>
- <View android:id="@+id/mr_control_divider"
- android:layout_width="fill_parent"
- android:layout_height="8dp"
- android:visibility="gone" />
- <LinearLayout
- android:id="@+id/mr_volume_control"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:minHeight="48dp"
- android:gravity="center_vertical"
- android:paddingLeft="24dp"
- android:paddingRight="12dp"
- android:splitMotionEvents="false">
- <ImageView
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:src="?attr/mediaRouteAudioTrackDrawable"
- android:gravity="center"
- android:scaleType="center"/>
- <!-- Since dialog's top layout mr_expandable_area is clickable, it propagates pressed state
- to its non-clickable children. Specify android:clickable="true" to prevent volume slider
- from having false pressed state. -->
- <com.android.support.mediarouter.app.MediaRouteVolumeSlider
- android:id="@+id/mr_volume_slider"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:minHeight="48dp"
- android:maxHeight="48dp"
- android:layout_weight="1"
- android:clickable="true"
- android:contentDescription="@string/mr_controller_volume_slider" />
- <com.android.support.mediarouter.app.MediaRouteExpandCollapseButton
- android:id="@+id/mr_group_expand_collapse"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:padding="12dp"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:visibility="gone"/>
- </LinearLayout>
- </LinearLayout>
- <com.android.support.mediarouter.app.OverlayListView
- android:id="@+id/mr_volume_group_list"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:paddingTop="@dimen/mr_controller_volume_group_list_padding_top"
- android:scrollbarStyle="outsideOverlay"
- android:clipToPadding="false"
- android:visibility="gone"
- android:splitMotionEvents="false"
- android:theme="?attr/mediaRouteControlPanelThemeOverlay" />
- </LinearLayout>
- </FrameLayout>
- <ScrollView
- android:id="@+id/buttonPanel"
- style="?attr/buttonBarStyle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:fillViewport="true"
- android:scrollIndicators="top|bottom">
- <androidx.appcompat.widget.ButtonBarLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="bottom"
- android:layoutDirection="locale"
- android:orientation="horizontal"
- android:paddingBottom="4dp"
- android:paddingLeft="12dp"
- android:paddingRight="12dp"
- android:paddingTop="4dp">
- <Button
- android:id="@android:id/button3"
- style="?android:attr/buttonBarNeutralButtonStyle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <androidx.legacy.widget.Space
- android:id="@+id/spacer"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:visibility="invisible"/>
- <Button
- android:id="@android:id/button2"
- style="?android:attr/buttonBarNegativeButtonStyle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <Button
- android:id="@android:id/button1"
- style="?android:attr/buttonBarPositiveButtonStyle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </androidx.appcompat.widget.ButtonBarLayout>
- </ScrollView>
- </LinearLayout>
-</FrameLayout>
diff --git a/packages/MediaComponents/res/layout/mr_controller_volume_item.xml b/packages/MediaComponents/res/layout/mr_controller_volume_item.xml
deleted file mode 100644
index 12d85ae..0000000
--- a/packages/MediaComponents/res/layout/mr_controller_volume_item.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <LinearLayout android:id="@+id/volume_item_container"
- android:layout_width="fill_parent"
- android:layout_height="@dimen/mr_controller_volume_group_list_item_height"
- android:paddingLeft="24dp"
- android:paddingRight="60dp"
- android:paddingBottom="8dp"
- android:orientation="vertical" >
- <TextView android:id="@+id/mr_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="@style/TextAppearance.MediaRouter.SecondaryText"
- android:singleLine="true" />
- <LinearLayout android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:gravity="center_vertical">
- <ImageView android:id="@+id/mr_volume_item_icon"
- android:layout_width="@dimen/mr_controller_volume_group_list_item_icon_size"
- android:layout_height="@dimen/mr_controller_volume_group_list_item_icon_size"
- android:layout_marginTop="8dp"
- android:layout_marginBottom="8dp"
- android:scaleType="fitCenter"
- android:src="?attr/mediaRouteAudioTrackDrawable" />
- <androidx.mediarouter.app.MediaRouteVolumeSlider
- android:id="@+id/mr_volume_slider"
- android:layout_width="fill_parent"
- android:layout_height="40dp"
- android:minHeight="40dp"
- android:maxHeight="40dp"
- android:contentDescription="@string/mr_controller_volume_slider" />
- </LinearLayout>
- </LinearLayout>
-</LinearLayout>
diff --git a/packages/MediaComponents/res/layout/settings_list.xml b/packages/MediaComponents/res/layout/settings_list.xml
deleted file mode 100644
index ea30538..0000000
--- a/packages/MediaComponents/res/layout/settings_list.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="@dimen/mcv2_embedded_settings_width"
- android:layout_height="@dimen/mcv2_embedded_settings_height"
- android:divider="@null"
- android:dividerHeight="0dp">
-</ListView>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/layout/title_bar_gradient.xml b/packages/MediaComponents/res/layout/title_bar_gradient.xml
deleted file mode 100644
index ab1fc6e..0000000
--- a/packages/MediaComponents/res/layout/title_bar_gradient.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <gradient
- android:startColor="@color/title_bar_gradient_start"
- android:endColor="@color/title_bar_gradient_end"
- android:angle="-270" />
-</shape>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/values-af/strings.xml b/packages/MediaComponents/res/values-af/strings.xml
deleted file mode 100644
index 47230ad..0000000
--- a/packages/MediaComponents/res/values-af/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Stelsel"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Toestelle"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knoppie"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Uitsaai-knoppie. Ontkoppel"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Uitsaai-knoppie. Koppel tans"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Uitsaai-knoppie. Gekoppel"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Saai uit na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Vind tans toestelle"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ontkoppel"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Hou op uitsaai"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Maak toe"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Speel"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Laat wag"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Vou uit"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Vou in"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumkunswerk"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volumeglyer"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Geen media is gekies nie"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Geen inligting beskikbaar nie"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Saai tans skerm uit"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-am/strings.xml b/packages/MediaComponents/res/values-am/strings.xml
deleted file mode 100644
index 39a1903..0000000
--- a/packages/MediaComponents/res/values-am/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"ስርዓት"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"መሣሪያዎች"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"የCast አዝራር"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast አዝራር። ግንኙነት ተቋርጧል"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast አዝራር በማገናኘት ላይ"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast አዝራር። ተገናኝቷል"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast አድርግ ወደ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"መሣሪያዎችን በማግኘት ላይ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ግንኙነት አቋርጥ"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Cast ማድረግ አቁም"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ዝጋ"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"አጫውት"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ለአፍታ አቁም"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"አቁም"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"አስፋ"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ሰብስብ"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"የአልበም ስነ-ጥበብ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ተንሸራታች የድምፅ መቆጣጠሪያ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ምንም ማህደረመረጃ አልተመረጠም"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ምንም መረጃ አይገኝም"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ማያ ገጽን በመውሰድ ላይ"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ar/strings.xml b/packages/MediaComponents/res/values-ar/strings.xml
deleted file mode 100644
index f8fb97d..0000000
--- a/packages/MediaComponents/res/values-ar/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"النظام"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"الأجهزة"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"زر الإرسال"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"زر الإرسال. تم قطع الاتصال"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"زر الإرسال. جارٍ الاتصال"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"زر الإرسال. تم الاتصال"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"إرسال إلى"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"جارٍ البحث عن أجهزة"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"قطع الاتصال"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"إيقاف الإرسال"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"إغلاق"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"تشغيل"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"إيقاف مؤقت"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"إيقاف"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"توسيع"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"تصغير"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"صورة الألبوم"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"شريط تمرير مستوى الصوت"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"لم يتم اختيار أي وسائط"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"لا تتوفر أي معلومات"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"جارٍ إرسال الشاشة"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-az/strings.xml b/packages/MediaComponents/res/values-az/strings.xml
deleted file mode 100644
index a3c60ab..0000000
--- a/packages/MediaComponents/res/values-az/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Cihazlar"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Yayım düyməsi"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Yayım düyməsi. Bağlantı kəsildi"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Yayım düyməsi. Qoşulur"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Yayım düyməsi. Qoşuldu"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Bura yayımlayın"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Cihazlar axtarılır"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Bağlantını kəsin"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Yayımı dayandırın"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Qapadın"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Oynadın"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Durdurun"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Dayandırın"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Genişləndirin"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yığcamlaşdırın"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albom incəsənəti"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Səs hərmi diyircəyi"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Heç bir media seçilməyib"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Əlçatan məlumat yoxdur"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekran yayımlanır"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-b+sr+Latn/strings.xml b/packages/MediaComponents/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index e25bd6e..0000000
--- a/packages/MediaComponents/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Dugme Prebaci"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Dugme Prebaci. Veza je prekinuta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Dugme Prebaci. Povezuje se"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Dugme Prebaci. Povezan je"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Prebacuj na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Pronalaženje uređaja"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zaustavi prebacivanje"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zatvori"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Pusti"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziraj"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Zaustavi"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširi"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skupi"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Omot albuma"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Klizač za jačinu zvuka"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nema izabranih medija"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nisu dostupne nikakve informacije"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prebacuje se ekran"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-be/strings.xml b/packages/MediaComponents/res/values-be/strings.xml
deleted file mode 100644
index ac391c1..0000000
--- a/packages/MediaComponents/res/values-be/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Сістэма"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Прылады"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляцыі"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Кнопка трансляцыі. Адключана"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Кнопка трансляцыі. Ідзе падключэнне"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Кнопка трансляцыі. Падключана"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Трансліраваць на"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук прылад"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Адлучыць"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Спыніць трансляцыю"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрыць"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Прайграць"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Прыпыніць"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Спыніць"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Разгарнуць"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Згарнуць"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Вокладка альбома"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Паўзунок гучнасці"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медыяфайл не выбраны"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Інфармацыя адсутнічае"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Экран трансляцыі"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-bg/strings.xml b/packages/MediaComponents/res/values-bg/strings.xml
deleted file mode 100644
index 76712d4..0000000
--- a/packages/MediaComponents/res/values-bg/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Устройства"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Бутон за предаване"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Бутон за предаване. Връзката е прекратена"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Бутон за предаване. Свързва се"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Бутон за предаване. Установена е връзка"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Предаване към"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Търсят се устройства"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Прекратяване на връзката"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Спиране на предаването"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Затваряне"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Пускане"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Поставяне на пауза"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Спиране"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Разгъване"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Свиване"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Обложка на албума"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Плъзгач за силата на звука"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Няма избрана мултимедия"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Няма налична информация"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Екранът се предава"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-bn/strings.xml b/packages/MediaComponents/res/values-bn/strings.xml
deleted file mode 100644
index 1bf5932..0000000
--- a/packages/MediaComponents/res/values-bn/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"সিস্টেম"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ডিভাইসগুলি"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"কাস্ট করার বোতাম"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"কাস্ট করার বোতাম৷ সংযোগ বিচ্ছিন্ন হয়েছে"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"কাস্ট করার বোতাম৷ সংযোগ করা হচ্ছে"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"কাস্ট করার বোতাম৷ সংযুক্ত হয়েছে"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"এতে কাস্ট করুন"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ডিভাইসগুলিকে খোঁজা হচ্ছে"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"সংযোগ বিচ্ছিন্ন করুন"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"কাস্ট করা বন্ধ করুন"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"বন্ধ করুন"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"চালান"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"বিরাম দিন"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"থামান"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"বড় করুন"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"সঙ্কুচিত করুন"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"অ্যালবাম শৈলি"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ভলিউম স্লাইডার"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"কোনো মিডিয়া নির্বাচন করা হয়নি"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"কোনো তথ্য উপলব্ধ নেই"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"স্ক্রীন কাস্ট করা হচ্ছে"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-bs/strings.xml b/packages/MediaComponents/res/values-bs/strings.xml
deleted file mode 100644
index 711c742..0000000
--- a/packages/MediaComponents/res/values-bs/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Dugme za emitiranje"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Dugme za emitiranje. Veza je prekinuta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Dugme za emitiranje. Povezivanje"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Dugme za emitiranje. Povezano"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Emitiranje na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zaustavi prebacivanje"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zatvori"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduciraj"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziraj"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Zaustavi"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširi"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skupi"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Omot albuma"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Klizač za jačinu zvuka"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nijedan medij nije odabran"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nema dostupnih informacija"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prebacuje se ekran"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ca/strings.xml b/packages/MediaComponents/res/values-ca/strings.xml
deleted file mode 100644
index bf85acf..0000000
--- a/packages/MediaComponents/res/values-ca/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositius"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botó d\'emetre"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botó Emet. Desconnectat."</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botó Emet. S\'està connectant."</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botó Emet. Connectat."</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Emet a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"S\'estan cercant dispositius"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconnecta"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Atura l\'emissió"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Tanca"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reprodueix"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Posa en pausa"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Atura"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Desplega"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Replega"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Imatge de l\'àlbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control lliscant de volum"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No s\'ha seleccionat cap fitxer multimèdia"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hi ha informació disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emissió de pantalla"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-cs/strings.xml b/packages/MediaComponents/res/values-cs/strings.xml
deleted file mode 100644
index 09a8920..0000000
--- a/packages/MediaComponents/res/values-cs/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Systém"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Zařízení"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Tlačítko odesílání"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tlačítko odesílání. Odpojeno"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tlačítko odesílání. Připojování"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tlačítko odesílání. Připojeno"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Odesílat do"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Hledání zařízení"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojit"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zastavit odesílání"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zavřít"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Přehrát"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pozastavit"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Zastavit"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozbalit"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sbalit"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Obal alba"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Posuvník hlasitosti"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nebyla vybrána žádná média"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nejsou k dispozici žádné informace"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Odesílání obsahu obrazovky"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-da/strings.xml b/packages/MediaComponents/res/values-da/strings.xml
deleted file mode 100644
index 8e7a790..0000000
--- a/packages/MediaComponents/res/values-da/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheder"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knap"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-knap. Forbindelsen er afbrudt"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-knap. Opretter forbindelse"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-knap. Tilsluttet"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finder enheder"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Afbryd"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stop med at caste"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Luk"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Afspil"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Sæt på pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Udvid"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumgrafik"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Lydstyrkeskyder"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ingen medier er markeret"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Der er ingen tilgængelige oplysninger"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skærmen castes"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-de/strings.xml b/packages/MediaComponents/res/values-de/strings.xml
deleted file mode 100644
index 26bf57c..0000000
--- a/packages/MediaComponents/res/values-de/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Geräte"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-Symbol"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Streaming-Schaltfläche. Nicht verbunden"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Streaming-Schaltfläche. Verbindung wird hergestellt"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Streaming-Schaltfläche. Verbunden"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Streamen auf"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Geräte werden gesucht."</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Verbindung trennen"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Streaming beenden"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Schließen"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Wiedergeben"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausieren"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Beenden"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Maximieren"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Minimieren"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumcover"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Schieberegler für die Lautstärke"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Keine Medien ausgewählt"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Keine Informationen verfügbar"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Bildschirm wird gestreamt."</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-el/strings.xml b/packages/MediaComponents/res/values-el/strings.xml
deleted file mode 100644
index d82f69b..0000000
--- a/packages/MediaComponents/res/values-el/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Σύστημα"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Συσκευές"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Κουμπί Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Κουμπί μετάδοσης. Αποσυνδέθηκε"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Κουμπί μετάδοση. Σύνδεση σε εξέλιξη"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Κουμπί μετάδοσης. Συνδέθηκε"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Μετάδοση σε"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Εύρεση συσκευών"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Αποσύνδεση"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Διακοπή μετάδοσης"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Κλείσιμο"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Αναπαραγωγή"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Παύση"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Διακοπή"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ανάπτυξη"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Σύμπτυξη"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Εξώφυλλο άλμπουμ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Ρυθμιστικό έντασης ήχου"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Δεν έχουν επιλεγεί μέσα"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Δεν υπάρχουν διαθέσιμες πληροφορίες"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Μετάδοση οθόνης"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-en-rAU/strings.xml b/packages/MediaComponents/res/values-en-rAU/strings.xml
deleted file mode 100644
index dd3f219..0000000
--- a/packages/MediaComponents/res/values-en-rAU/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-en-rCA/strings.xml b/packages/MediaComponents/res/values-en-rCA/strings.xml
deleted file mode 100644
index dd3f219..0000000
--- a/packages/MediaComponents/res/values-en-rCA/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-en-rGB/strings.xml b/packages/MediaComponents/res/values-en-rGB/strings.xml
deleted file mode 100644
index dd3f219..0000000
--- a/packages/MediaComponents/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-en-rIN/strings.xml b/packages/MediaComponents/res/values-en-rIN/strings.xml
deleted file mode 100644
index dd3f219..0000000
--- a/packages/MediaComponents/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-en-rXC/strings.xml b/packages/MediaComponents/res/values-en-rXC/strings.xml
deleted file mode 100644
index a87007e..0000000
--- a/packages/MediaComponents/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast button. Disconnected"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast button. Connecting"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast button. Connected"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stop"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volume slider"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-es-rUS/strings.xml b/packages/MediaComponents/res/values-es-rUS/strings.xml
deleted file mode 100644
index 441ead1..0000000
--- a/packages/MediaComponents/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botón para transmitir"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botón para transmitir (desconectado)"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botón para transmitir (conectando)"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botón para transmitir (conectado)"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Detener la transmisión"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Cerrar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproducir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Detener"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mostrar"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ocultar"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Imagen del álbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control deslizante del volumen"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No se seleccionó ningún contenido multimedia"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Sin información disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitiendo pantalla"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-es/strings.xml b/packages/MediaComponents/res/values-es/strings.xml
deleted file mode 100644
index ff43008..0000000
--- a/packages/MediaComponents/res/values-es/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botón de enviar"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botón de enviar. Desconectado"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botón de enviar. Conectando"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botón de enviar. Conectado"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Enviar a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Detener envío de contenido"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Cerrar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproducir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Detener"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mostrar"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ocultar"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Portada del álbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control deslizante de volumen"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No se ha seleccionado ningún medio"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hay información disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Enviando pantalla"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-et/strings.xml b/packages/MediaComponents/res/values-et/strings.xml
deleted file mode 100644
index 453235b..0000000
--- a/packages/MediaComponents/res/values-et/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Süsteem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Seadmed"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Ülekandenupp"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Ülekandenupp. Ühendus on katkestatud"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Ülekandenupp. Ühendamine"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Ülekandenupp. Ühendatud"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Ülekandmine seadmesse"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Seadmete otsimine"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Katkesta ühendus"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Peata ülekandmine"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Sulgemine"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Esitamine"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Peatamine"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Peata"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Laiendamine"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ahendamine"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumi kujundus"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Helitugevuse liugur"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Meediat pole valitud"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Teave puudub"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekraanikuva ülekandmine"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-eu/strings.xml b/packages/MediaComponents/res/values-eu/strings.xml
deleted file mode 100644
index dba19e4..0000000
--- a/packages/MediaComponents/res/values-eu/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Gailuak"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Igorri botoia"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Igortzeko botoia. Deskonektatuta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Igortzeko botoia. Konektatzen"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Igortzeko botoia. Konektatuta"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Igorri hona:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Gailuak bilatzen"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Deskonektatu"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Utzi igortzeari"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Itxi"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Erreproduzitu"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausatu"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Gelditu"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Zabaldu"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Tolestu"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumaren azala"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Bolumenaren graduatzailea"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ez da hautatu multimedia-edukirik"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Ez dago informaziorik"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Pantaila igortzen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-fa/strings.xml b/packages/MediaComponents/res/values-fa/strings.xml
deleted file mode 100644
index 4c6c779..0000000
--- a/packages/MediaComponents/res/values-fa/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"سیستم"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"دستگاهها"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"دکمه ارسال محتوا"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"دکمه فرستادن. ارتباط قطع شد"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"دکمه فرستادن. درحال مرتبطسازی"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"دکمه فرستادن. مرتبط شد"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ارسال محتوا به"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"پیدا کردن دستگاهها"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"قطع ارتباط"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"توقف ارسال محتوا"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"بستن"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"پخش"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"مکث"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"توقف"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"بزرگ کردن"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"کوچک کردن"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"عکس روی جلد آلبوم"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"لغزنده میزان صدا"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"رسانه انتخاب نشده است"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"اطلاعات در دسترس نیست"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"درحال فرستادن صفحه"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-fi/strings.xml b/packages/MediaComponents/res/values-fi/strings.xml
deleted file mode 100644
index d683435..0000000
--- a/packages/MediaComponents/res/values-fi/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Järjestelmä"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Laitteet"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-painike"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-painike. Yhteys katkaistu"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-painike. Yhdistetään"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-painike. Yhdistetty"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Suoratoiston kohde"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Etsitään laitteita"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Katkaise yhteys"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Lopeta suoratoisto"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Sulje"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Toista"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Keskeytä"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Pysäytä"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Laajenna"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Tiivistä"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumin kansikuva"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Äänenvoimakkuuden liukusäädin"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ei valittua mediaa."</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Tietoja ei ole saatavilla"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Suoratoistetaan näyttöä"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-fr-rCA/strings.xml b/packages/MediaComponents/res/values-fr-rCA/strings.xml
deleted file mode 100644
index c4f984b..0000000
--- a/packages/MediaComponents/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Système"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Appareils"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Bouton Diffuser"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Bouton Diffuser. Déconnecté"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Bouton Diffuser. Connexion en cours…"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Bouton Diffuser. Connecté"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Diffuser sur"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Se déconnecter"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Arrêter la diffusion"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fermer"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Lire"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Interrompre"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Arrêter"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Développer"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Réduire"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Image de l\'album"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Curseur de réglage du volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Aucun média sélectionné"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Aucune information disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Diffusion de l\'écran en cours"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-fr/strings.xml b/packages/MediaComponents/res/values-fr/strings.xml
deleted file mode 100644
index 12c312f..0000000
--- a/packages/MediaComponents/res/values-fr/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Système"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Appareils"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Icône Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Icône Cast. Déconnecté"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Icône Cast. Connexion…"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Icône Cast. Connecté"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Caster sur"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils…"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Déconnecter"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Arrêter la diffusion"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fermer"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Lecture"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Arrêter"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Développer"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Réduire"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Image de l\'album"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Curseur de volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Aucun média sélectionné"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Aucune information disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Diffusion de l\'écran en cours…"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-gl/strings.xml b/packages/MediaComponents/res/values-gl/strings.xml
deleted file mode 100644
index 1b2c354..0000000
--- a/packages/MediaComponents/res/values-gl/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botón de emitir"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botón de emitir. Desconectado"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botón de emitir. Conectando"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botón de emitir. Conectado"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Emitir a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Deter emisión"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Pechar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduce"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Deter"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ampliar"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Contraer"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Portada do álbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Control desprazable do volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Non se seleccionaron recursos"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Non hai información dispoñible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emisión de pantalla"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-gu/strings.xml b/packages/MediaComponents/res/values-gu/strings.xml
deleted file mode 100644
index 2cd5f3f..0000000
--- a/packages/MediaComponents/res/values-gu/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"સિસ્ટમ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ઉપકરણો"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"કાસ્ટ કરો બટન"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"કાસ્ટ કરો બટન. ડિસ્કનેક્ટ કર્યું"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"કાસ્ટ કરો બટન. કનેક્ટ થઈ રહ્યું છે"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"કાસ્ટ કરો બટન. કનેક્ટ થયું"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"આના પર કાસ્ટ કરો"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ઉપકરણો શોધી રહ્યાં છીએ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ડિસ્કનેક્ટ કરો"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"કાસ્ટ કરવાનું રોકો"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"બંધ કરો"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ચલાવો"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"થોભાવો"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"રોકો"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"વિસ્તૃત કરો"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"સંકુચિત કરો"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"આલ્બમ કલા"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"વૉલ્યુમ સ્લાઇડર"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"કોઈ મીડિયા પસંદ કરેલ નથી"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"કોઈ માહિતી ઉપલબ્ધ નથી"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"સ્ક્રીનને કાસ્ટ કરી રહ્યાં છે"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-hi/strings.xml b/packages/MediaComponents/res/values-hi/strings.xml
deleted file mode 100644
index 9552a59..0000000
--- a/packages/MediaComponents/res/values-hi/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"सिस्टम"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"डिवाइस"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"कास्ट करें बटन"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"कास्ट करें बटन. डिसकनेक्ट है"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"कास्ट करें बटन. कनेक्ट हो रहा है"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"कास्ट करें बटन. कनेक्ट है"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"इस पर कास्ट करें"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"डिवाइस ढूंढ रहा है"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"डिसकनेक्ट करें"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"कास्ट करना बंद करें"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"बंद करें"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"चलाएं"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"रोकें"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"बंद करें"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तार करें"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"छोटा करें"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"एल्बम आर्ट"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"वॉल्यूम स्लाइडर"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"कोई मीडिया चयनित नहीं है"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोई जानकारी मौजूद नहीं है"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्ट हो रही है"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-hr/strings.xml b/packages/MediaComponents/res/values-hr/strings.xml
deleted file mode 100644
index 3c43ee7..0000000
--- a/packages/MediaComponents/res/values-hr/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sustav"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Gumb za emitiranje"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Gumb za emitiranje. Veza prekinuta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Gumb za emitiranje. Povezivanje"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Gumb za emitiranje. Povezan"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Emitiranje na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zaustavi emitiranje"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zatvaranje"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reprodukcija"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziranje"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Zaustavi"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširivanje"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sažimanje"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Naslovnica albuma"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Klizač za glasnoću"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nije odabran nijedan medij"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Informacije nisu dostupne"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emitiranje zaslona"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-hu/strings.xml b/packages/MediaComponents/res/values-hu/strings.xml
deleted file mode 100644
index a36bdfe..0000000
--- a/packages/MediaComponents/res/values-hu/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Rendszer"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Eszközök"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Átküldés gomb"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Átküldés gomb. Kapcsolat bontva"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Átküldés gomb. Csatlakozás"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Átküldés gomb. Csatlakoztatva"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Átküldés ide"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Eszközök keresése"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Leválasztás"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Átküldés leállítása"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Bezárás"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Lejátszás"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Szüneteltetés"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Leállítás"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Kibontás"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Összecsukás"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Lemezborító"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Hangerőszabályzó"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nincs média kiválasztva"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nincs információ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Képernyőtartalom átküldése"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-hy/strings.xml b/packages/MediaComponents/res/values-hy/strings.xml
deleted file mode 100644
index 8ec82b7..0000000
--- a/packages/MediaComponents/res/values-hy/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Համակարգ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Սարքեր"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Հեռարձակման կոճակ"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Հեռարձակման կոճակ: Սարքն անջատված է"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Հեռարձակման կոճակ: Սարքը կապակցվում է"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Հեռարձակման կոճակ: Սարքը կապակցված է"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Ընտրեք սարքը"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Սարքերի որոնում"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Անջատել"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Դադարեցնել հեռարձակումը"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Փակել"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Նվագարկել"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Դադար"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Դադարեցնել"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ընդարձակել"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Կոծկել"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Ալբոմի շապիկ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Ձայնի ուժգնության կարգավորիչ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Մեդիա ֆայլեր չեն ընտրվել"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Տեղեկությունները հասանելի չեն"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Էկրանը հեռարձակվում է"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-in/strings.xml b/packages/MediaComponents/res/values-in/strings.xml
deleted file mode 100644
index 6b2752e..0000000
--- a/packages/MediaComponents/res/values-in/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Perangkat"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Tombol Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tombol Cast. Terputus"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tombol Cast. Menghubungkan"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tombol Cast. Terhubung"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmisikan ke"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari perangkat"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Hentikan cast"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Tutup"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Putar"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Berhenti"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Luaskan"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ciutkan"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Sampul album"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Bilah geser volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Tidak ada media yang dipilih"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Tidak ada info yang tersedia"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmisi layar"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-is/strings.xml b/packages/MediaComponents/res/values-is/strings.xml
deleted file mode 100644
index 6a35ea6..0000000
--- a/packages/MediaComponents/res/values-is/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Kerfi"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Tæki"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Útsendingarhnappur"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Útsendingarhnappur. Aftengt"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Útsendingarhnappur. Tengist"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Útsendingarhnappur. Tengt"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Senda út í"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Leitað að tækjum"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Aftengjast"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stöðva útsendingu"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Loka"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Spila"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Hlé"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stöðva"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Stækka"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Minnka"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Plötuumslag"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Hljóðstyrkssleði"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Enginn miðill valinn"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Engar upplýsingar í boði"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skjár sendur út"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-it/strings.xml b/packages/MediaComponents/res/values-it/strings.xml
deleted file mode 100644
index 716e3ac..0000000
--- a/packages/MediaComponents/res/values-it/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivi"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Pulsante Trasmetti"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Pulsante Trasmetti. Disconnesso"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Pulsante Trasmetti. Connessione in corso"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Pulsante Trasmetti. Connesso"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Trasmetti a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Ricerca di dispositivi in corso"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Scollega"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Interrompi trasmissione"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Chiudi"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Riproduci"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Interrompi"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Espandi"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Comprimi"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Copertina"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Dispositivo di scorrimento del volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nessun contenuto multimediale selezionato"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nessuna informazione disponibile"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Trasmissione dello schermo in corso"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-iw/strings.xml b/packages/MediaComponents/res/values-iw/strings.xml
deleted file mode 100644
index 252b0ce..0000000
--- a/packages/MediaComponents/res/values-iw/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"מערכת"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"מכשירים"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"לחצן הפעלת Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"לחצן הפעלת Cast. מנותק"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"לחצן הפעלת Cast. מתחבר"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"לחצן הפעלת Cast. מחובר"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"העברה אל"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"מחפש מכשירים"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"נתק"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"הפסק את ההעברה"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"סגור"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"הפעל"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"השהה"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"הפסק"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"הרחב"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"כווץ"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"עטיפת אלבום"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"מחוון עוצמה"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"לא נבחרה מדיה"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"אין מידע זמין"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"העברת מסך מתבצעת"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ja/strings.xml b/packages/MediaComponents/res/values-ja/strings.xml
deleted file mode 100644
index a149727..0000000
--- a/packages/MediaComponents/res/values-ja/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"システム"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"端末"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"キャストアイコン"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"キャスト アイコン。接続解除済み"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"キャスト アイコン。接続中"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"キャスト アイコン。接続済み"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"キャストするデバイス"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"端末を検索しています"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"接続を解除"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"キャストを停止"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"閉じる"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"再生"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"一時停止"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"停止"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"折りたたむ"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"アルバムアート"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"音量スライダー"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"メディアが選択されていません"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"情報がありません"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"画面をキャストしています"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ka/strings.xml b/packages/MediaComponents/res/values-ka/strings.xml
deleted file mode 100644
index 3da081a..0000000
--- a/packages/MediaComponents/res/values-ka/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"სისტემა"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"მოწყობილობები"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ტრანსლირების ღილაკი"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ტრანსლირების ღილაკი. გათიშული"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ტრანსლირების ღილაკი. მიმდინარეობს დაკავშირება"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ტრანსლირების ღილაკი. დაკავშირებული"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ტრანსლირება:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"მოწყობილობების მოძიება..."</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"კავშირის გაწყვეტა"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ტრანსლირების შეწყვეტა"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"დახურვა"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"დაკვრა"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"პაუზა"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"შეწყვეტა"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"გაშლა"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ჩაკეცვა"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ალბომის გარეკანი"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ხმის სლაიდერი"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"მედია არჩეული არ არის"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ინფორმაცია არ არის ხელმისაწვდომი"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"მიმდინარეობს ეკრანის გადაცემა"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-kk/strings.xml b/packages/MediaComponents/res/values-kk/strings.xml
deleted file mode 100644
index 94dcbb3..0000000
--- a/packages/MediaComponents/res/values-kk/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Жүйе"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Құрылғылар"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Трансляциялау түймесі"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"\"Трансляциялау\" түймесі. Ажыратулы"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"\"Трансляциялау\" түймесі. Қосылуда"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"\"Трансляциялау\" түймесі. Қосылды"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Келесіге трансляциялау"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Құрылғыларды табу"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ажырату"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Трансляциялауды тоқтату"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Жабу"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Ойнату"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Кідірту"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Тоқтату"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Жаю"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Жию"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Альбом шебері"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Дыбыс деңгейінің жүгірткісі"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ешбір тасушы таңдалмаған"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Қол жетімді ақпарат жоқ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Экранды трансляциялау"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-km/strings.xml b/packages/MediaComponents/res/values-km/strings.xml
deleted file mode 100644
index e44780e..0000000
--- a/packages/MediaComponents/res/values-km/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"ប្រព័ន្ធ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ឧបករណ៍"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ប៊ូតុងខាស"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ខាសប៊ូតុង៖ បានកាត់ផ្តាច់"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ខាសប៊ូតុង៖ កំពុងភ្ជាប់"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ខាសប៊ូតុង៖ បានភ្ជាប់ហើយ"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"បញ្ជូនទៅ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"កំពុងស្វែងរកឧបករណ៍"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ផ្ដាច់"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ឈប់ភ្ជាប់"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"បិទ"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ចាក់"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ផ្អាក"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"ឈប់"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ពង្រីក"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"បង្រួម"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ស្នាដៃសិល្បៈអាល់ប៊ុម"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"របារកម្រិតសំឡេង"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"គ្មានការជ្រើសមេឌៀទេ"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"មិនមានព័ត៌មានទេ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"កំពុងខាសអេក្រង់"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-kn/strings.xml b/packages/MediaComponents/res/values-kn/strings.xml
deleted file mode 100644
index 4237fdd..0000000
--- a/packages/MediaComponents/res/values-kn/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"ಸಿಸ್ಟಂ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ಸಾಧನಗಳು"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ಬಿತ್ತರಿಸು ಬಟನ್"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ಬಿತ್ತರಿಸು ಬಟನ್. ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ಬಿತ್ತರಿಸು ಬಟನ್. ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ಬಿತ್ತರಿಸು ಬಟನ್. ಸಂಪರ್ಕಿತಗೊಂಡಿದೆ"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ಇದಕ್ಕೆ ಬಿತ್ತರಿಸಿ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ಬಿತ್ತರಿಸುವಿಕೆ ನಿಲ್ಲಿಸಿ"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ಮುಚ್ಚು"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ಪ್ಲೇ ಮಾಡಿ"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ವಿರಾಮ"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"ನಿಲ್ಲಿಸಿ"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ವಿಸ್ತರಿಸು"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ಸಂಕುಚಿಸು"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ಆಲ್ಬಮ್ ಕಲೆ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ವಾಲ್ಯೂಮ್ ಸ್ಲೈಡರ್"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ಯಾವುದೇ ಮಾಧ್ಯಮ ಆಯ್ಕೆಮಾಡಲಾಗಿಲ್ಲ"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ಯಾವುದೇ ಮಾಹಿತಿ ಲಭ್ಯವಿಲ್ಲ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ಪರದೆಯನ್ನು ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ko/strings.xml b/packages/MediaComponents/res/values-ko/strings.xml
deleted file mode 100644
index be893a9..0000000
--- a/packages/MediaComponents/res/values-ko/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"시스템"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"기기"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"전송 버튼"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"전송 버튼. 연결 해제됨"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"전송 버튼. 연결 중"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"전송 버튼. 연결됨"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"전송할 기기"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"기기를 찾는 중"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"연결 해제"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"전송 중지"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"닫기"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"재생"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"일시중지"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"중지"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"펼치기"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"접기"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"앨범아트"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"볼륨 슬라이더"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"선택한 미디어 없음"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"정보가 없습니다."</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"화면 전송 중"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ky/strings.xml b/packages/MediaComponents/res/values-ky/strings.xml
deleted file mode 100644
index 57813af..0000000
--- a/packages/MediaComponents/res/values-ky/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Тутум"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Түзмөктөр"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Тышкы экранга чыгаруу баскычы"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Тышкы экранга чыгаруу баскычы. Түзмөк ажырап турат."</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Тышкы экранга чыгаруу баскычы. Түзмөк туташууда"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Тышкы экранга чыгаруу баскычы. Түзмөк туташып турат"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Төмөнкүгө чыгаруу"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Түзмөктөр изделүүдө"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ажыратуу"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Тышк экранга чыгарну токтотуу"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Жабуу"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Ойнотуу"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Тындыруу"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Токтотуу"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Жайып көрсөтүү"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Жыйыштыруу"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Альбом мукабасы"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Үндү катуулатуучу сыдырма"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Бир да медиа файл тандалган жок"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Эч маалымат жок"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Тышкы экранга чыгарылууда"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-land/dimens.xml b/packages/MediaComponents/res/values-land/dimens.xml
deleted file mode 100644
index 29f1e1d..0000000
--- a/packages/MediaComponents/res/values-land/dimens.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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>
- <!-- MediaRouteController's volume group list -->
- <eat-comment />
- <!-- Maximum height of volume group list. -->
- <dimen name="mr_controller_volume_group_list_max_height">132dp</dimen>
- <!-- Height of volume group item. -->
- <dimen name="mr_controller_volume_group_list_item_height">61dp</dimen>
- <!-- Size of an item's icon. -->
- <dimen name="mr_controller_volume_group_list_item_icon_size">18dp</dimen>
-</resources>
diff --git a/packages/MediaComponents/res/values-lo/strings.xml b/packages/MediaComponents/res/values-lo/strings.xml
deleted file mode 100644
index 91737db..0000000
--- a/packages/MediaComponents/res/values-lo/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"ລະບົບ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ອຸປະກອນ"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ປຸ່ມຄາສທ໌"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ປຸ່ມສົ່ງສັນຍານ. ຕັດການເຊື່ອມຕໍ່ແລ້ວ"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ປຸ່ມສົ່ງສັນຍານ. ກຳລັງເຊື່ອມຕໍ່"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ປຸ່ມສົ່ງສັນຍານ. ເຊື່ອມຕໍ່ແລ້ວ"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ສົ່ງສັນຍານຫາ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ກຳລັງຊອກຫາອຸປະກອນ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ຕັດການເຊື່ອມຕໍ່"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ຢຸດການສົ່ງສັນຍານ"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ປິດ"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ຫຼິ້ນ"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ຢຸດຊົ່ວຄາວ"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"ຢຸດ"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ຂະຫຍາຍ"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ຫຍໍ້ລົງ"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ໜ້າປົກອະລະບໍ້າ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ຕົວປັບລະດັບສຽງ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ບໍ່ໄດ້ເລືອກມີເດຍໃດໄວ້"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ບໍ່ມີຂໍ້ມູນ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ການສົ່ງພາບໜ້າຈໍ"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-lt/strings.xml b/packages/MediaComponents/res/values-lt/strings.xml
deleted file mode 100644
index ff036d1..0000000
--- a/packages/MediaComponents/res/values-lt/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Įrenginiai"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Perdavimo mygtukas"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Perdavimo mygtukas. Atsijungta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Perdavimo mygtukas. Prisijungiama"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Perdavimo mygtukas. Prisijungta"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Perduoti į"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Randami įrenginiai"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Atjungti"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Sustabdyti perdavimą"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Uždaryti"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Leisti"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pristabdyti"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Sustabdyti"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Išskleisti"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sutraukti"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumo viršelis"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Garsumo šliaužiklis"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nepasirinkta jokia medija"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Informacija nepasiekiama"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Perduodamas ekranas"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-lv/strings.xml b/packages/MediaComponents/res/values-lv/strings.xml
deleted file mode 100644
index 454063e..0000000
--- a/packages/MediaComponents/res/values-lv/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistēma"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Ierīces"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Apraides poga"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Apraides poga. Savienojums pārtraukts"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Apraides poga. Notiek savienojuma izveide"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Apraides poga. Savienojums izveidots"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Apraidīšana uz ierīci"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Notiek ierīču meklēšana"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Atvienot"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Apturēt apraidi"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Aizvērt"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Atskaņot"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Apturēt"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Apturēt"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Izvērst"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sakļaut"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albuma vāciņš"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Skaļuma slīdnis"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nav atlasīti multivides faili"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nav pieejama informācija"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Notiek ekrāna apraide"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-mk/strings.xml b/packages/MediaComponents/res/values-mk/strings.xml
deleted file mode 100644
index 12dee36..0000000
--- a/packages/MediaComponents/res/values-mk/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Уреди"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Копчето за Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Копче за Cast. Исклучено"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Копче за Cast. Се поврзува"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Копче за Cast. Поврзано"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Емитувај на"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Се бараат уреди"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Исклучи"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Сопри го емитувањето"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Затвори"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Репродуцирај"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Паузирај"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Сопри"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Прошири"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Собери"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Корица на албум"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Лизгач за јачина на звук"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Не се избрани медиуми"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Нема достапни информации"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Екранот се емитува"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ml/strings.xml b/packages/MediaComponents/res/values-ml/strings.xml
deleted file mode 100644
index 2d914b9..0000000
--- a/packages/MediaComponents/res/values-ml/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"സിസ്റ്റം"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ഉപകരണങ്ങൾ"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ടാപ്പുചെയ്യുക"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"കാസ്റ്റ് ബട്ടൺ. വിച്ഛേദിച്ചു"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"കാസ്റ്റ് ബട്ടൺ. കണക്റ്റുചെയ്യുന്നു"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"കാസ്റ്റ് ബട്ടൺ. കണക്റ്റുചെയ്തു"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ഇതിലേക്ക് കാസ്റ്റുചെയ്യുക"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ഉപകരണങ്ങൾ കണ്ടെത്തുന്നു"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"വിച്ഛേദിക്കുക"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"കാസ്റ്റുചെയ്യൽ നിർത്തുക"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"അവസാനിപ്പിക്കുക"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"പ്ലേ ചെയ്യുക"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"തൽക്കാലം നിർത്തൂ"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"നിര്ത്തുക"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"വികസിപ്പിക്കുക"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ചുരുക്കുക"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ആൽബം ആർട്ട്"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"വോളിയം സ്ലൈഡർ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"മീഡിയയൊന്നും തിരഞ്ഞെടുത്തിട്ടില്ല"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"വിവരങ്ങളൊന്നും ലഭ്യമല്ല"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"സ്ക്രീൻ കാസ്റ്റുചെയ്യുന്നു"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-mn/strings.xml b/packages/MediaComponents/res/values-mn/strings.xml
deleted file mode 100644
index ef87c92..0000000
--- a/packages/MediaComponents/res/values-mn/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Төхөөрөмжүүд"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Дамжуулах товчлуур"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Дамжуулах товчлуур. Салсан"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Дамжуулах товчлуур. Холбож байна"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Дамжуулах товчлуур. Холбогдсон"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Дамжуулах"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Төхөөрөмж хайж байна"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Салгах"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Дамжуулахыг зогсоох"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Хаах"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Тоглуулах"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Түр зогсоох"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Зогсоох"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Дэлгэх"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Хураах"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Цомгийн зураг"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Дууны түвшин тааруулагч"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ямар ч медиа сонгоогүй"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Мэдээлэл байхгүй байна"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Дэлгэцийг дамжуулж байна"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-mr/strings.xml b/packages/MediaComponents/res/values-mr/strings.xml
deleted file mode 100644
index 2ffbebb..0000000
--- a/packages/MediaComponents/res/values-mr/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"सिस्टम"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"डिव्हाइसेस"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"कास्ट बटण"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"कास्ट बटण. डिस्कनेक्ट केले"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"कास्ट बटण. कनेक्ट करत आहे"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"कास्ट बटण. कनेक्ट केले"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"यावर कास्ट करा"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"डिव्हाइसेस शोधत आहे"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"डिस्कनेक्ट करा"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"कास्ट करणे थांबवा"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"बंद करा"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"प्ले करा"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"विराम"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"थांबा"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तृत करा"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संकुचित करा"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"अल्बम कला"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"व्हॉल्यूम स्लायडर"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"मीडिया निवडला नाही"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोणतीही माहिती उपलब्ध नाही"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्ट करत आहे"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ms/strings.xml b/packages/MediaComponents/res/values-ms/strings.xml
deleted file mode 100644
index 085e480..0000000
--- a/packages/MediaComponents/res/values-ms/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Peranti"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Butang Hantar"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Butang hantar. Sambungan diputuskan"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Butang hantar. Menyambung"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Butang hantar. Disambungkan"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Hantar ke"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari peranti"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Berhenti menghantar"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Tutup"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Main"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Berhenti"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Kembangkan"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Runtuhkan"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Seni album"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Peluncur kelantangan"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Tiada media dipilih"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Maklumat tidak tersedia"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Menghantar skrin"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-my/strings.xml b/packages/MediaComponents/res/values-my/strings.xml
deleted file mode 100644
index 083d805..0000000
--- a/packages/MediaComponents/res/values-my/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"စနစ်"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"စက်ပစ္စည်းများ"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ကာစ်တ်လုပ်ရန် ခလုတ်"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ကာစ်ခလုတ်။ ချိတ်ဆက်မထားပါ"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ကာစ်ခလုတ်။ ချိတ်ဆက်နေသည်"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ကာစ်ခလုတ်။ ချိတ်ဆက်ထားသည်"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ကာစ်လုပ်ရန် စက်"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"စက်ပစ္စည်းများ ရှာဖွေခြင်း"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ဆက်သွယ်မှု ဖြတ်ရန်"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ကာစ်လုပ်ခြင်း ရပ်ရန်"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ပိတ်ရန်"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ဖွင့်ရန်"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ခဏရပ်ရန်"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"ရပ်ရန်"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ဖြန့်ချရန်၃"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ခေါက်သိမ်းရန်..."</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"အယ်လ်ဘမ်ပုံ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"အသံအတိုးအကျယ်ချိန်သည့် ဆလိုက်ဒါ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"မည်သည့်မီဒီမှ မရွေးချယ်ထားပါ"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"အချက်အလက် မရရှိနိုင်ပါ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"တည်းဖြတ်ရေး မျက်နှာပြင်"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-nb/strings.xml b/packages/MediaComponents/res/values-nb/strings.xml
deleted file mode 100644
index 4f764c9..0000000
--- a/packages/MediaComponents/res/values-nb/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheter"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-ikonet"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-knappen. Frakoblet"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-knappen. Kobler til"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-knappen. Tilkoblet"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Søker etter enheter"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Koble fra"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stopp castingen"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Lukk"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Spill av"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Sett på pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stopp"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Utvid"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumgrafikk"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Glidebryter for volum"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Du har ikke valgt noen medier"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Ingen informasjon er tilgjengelig"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Caster skjermen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ne/strings.xml b/packages/MediaComponents/res/values-ne/strings.xml
deleted file mode 100644
index d6c2e1a..0000000
--- a/packages/MediaComponents/res/values-ne/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"प्रणाली"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"उपकरणहरू"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast बटन"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast बटन। जडान विच्छेद भयो"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast बटन। जडान हुँदै"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast बटन। जडान भयो"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"यसमा Cast गर्नुहोस्"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"यन्त्रहरू पत्ता लगाउँदै"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"विच्छेद गर्नुहोस्"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"casting रोक्नुहोस्"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"बन्द गर्नुहोस्"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"बजाउनुहोस्"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"रोक्नुहोस्"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"रोक्नुहोस्"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तार गर्नुहोस्"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संक्षिप्त पार्नुहोस्"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"एल्बम आर्ट"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"भोल्युमको स्लाइडर"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"कुनै मिडिया चयन भएको छैन"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"जानकारी उपलब्ध छैन"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रिन cast गर्दै"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-nl/strings.xml b/packages/MediaComponents/res/values-nl/strings.xml
deleted file mode 100644
index 05df62d..0000000
--- a/packages/MediaComponents/res/values-nl/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Systeem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Apparaten"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-icoon"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-icoon. Verbinding verbroken"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-icoon. Verbinding maken"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-icoon. Verbonden"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Casten naar"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Apparaten zoeken"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Loskoppelen"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Casten stoppen"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Sluiten"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Afspelen"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Onderbreken"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Stoppen"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Uitvouwen"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Samenvouwen"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumhoes"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volumeschuifregelaar"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Geen media geselecteerd"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Geen informatie beschikbaar"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Scherm casten"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-pa/strings.xml b/packages/MediaComponents/res/values-pa/strings.xml
deleted file mode 100644
index 1b5df71..0000000
--- a/packages/MediaComponents/res/values-pa/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"ਸਿਸਟਮ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"ਡਿਵਾਈਸਾਂ"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ਕਾਸਟ ਬਟਨ"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ਕਾਸਟ ਬਟਨ। ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ਕਾਸਟ ਬਟਨ। ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ਕਾਸਟ ਬਟਨ। ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ਏਥੇ ਕਾਸਟ ਕਰੋ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ਡੀਵਾਈਸਾਂ ਨੂੰ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ਕਾਸਟ ਕਰਨਾ ਬੰਦ ਕਰੋ"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ਬੰਦ ਕਰੋ"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ਪਲੇ ਕਰੋ"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ਰੋਕੋ"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"ਬੰਦ ਕਰੋ"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ਵਿਸਤਾਰ ਕਰੋ"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ਬੰਦ ਕਰੋ"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ਐਲਬਮ ਆਰਟ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ਵੌਲਯੂਮ ਸਲਾਈਡਰ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ਕੋਈ ਵੀ ਮੀਡੀਆ ਨਹੀਂ ਚੁਣਿਆ ਗਿਆ"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ਕੋਈ ਜਾਣਕਾਰੀ ਉਪਲਬਧ ਨਹੀਂ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ਸਕ੍ਰੀਨ ਜੋੜ ਰਿਹਾ ਹੈ"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-pl/strings.xml b/packages/MediaComponents/res/values-pl/strings.xml
deleted file mode 100644
index c792a6d..0000000
--- a/packages/MediaComponents/res/values-pl/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Urządzenia"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Przycisk Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Przycisk Prześlij ekran. Rozłączono"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Przycisk Prześlij ekran. Łączę"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Przycisk Prześlij ekran. Połączono"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Przesyłaj na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Znajdowanie urządzeń"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odłącz"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zatrzymaj przesyłanie"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zamknij"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Odtwórz"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Wstrzymaj"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Zatrzymaj"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozwiń"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Zwiń"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Okładka albumu"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Suwak głośności"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nie wybrano multimediów"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Brak informacji"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Przesyłam ekran"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-pt-rBR/strings.xml b/packages/MediaComponents/res/values-pt-rBR/strings.xml
deleted file mode 100644
index 43c619d..0000000
--- a/packages/MediaComponents/res/values-pt-rBR/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botão \"Transmitir\". Desconectado"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botão \"Transmitir\". Conectando"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botão \"Transmitir\". Conectado"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Localizando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Interromper transmissão"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Parar"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Recolher"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Arte do álbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Controle deslizante de volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhuma mídia selecionada"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitindo a tela"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-pt-rPT/strings.xml b/packages/MediaComponents/res/values-pt-rPT/strings.xml
deleted file mode 100644
index 3f0a61d..0000000
--- a/packages/MediaComponents/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botão Transmitir. Desligado"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botão Transmitir. A ligar..."</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botão Transmitir. Ligado"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"A localizar dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desassociar"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Parar a transmissão"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Interromper"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Parar"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Reduzir"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Imagem do álbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Controlo de deslize do volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhum suporte multimédia selecionado"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"A transmitir o ecrã"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-pt/strings.xml b/packages/MediaComponents/res/values-pt/strings.xml
deleted file mode 100644
index 43c619d..0000000
--- a/packages/MediaComponents/res/values-pt/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botão \"Transmitir\". Desconectado"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botão \"Transmitir\". Conectando"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botão \"Transmitir\". Conectado"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Localizando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Interromper transmissão"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Parar"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Recolher"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Arte do álbum"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Controle deslizante de volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhuma mídia selecionada"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitindo a tela"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ro/strings.xml b/packages/MediaComponents/res/values-ro/strings.xml
deleted file mode 100644
index 6ebb2f6..0000000
--- a/packages/MediaComponents/res/values-ro/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispozitive"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Butonul de proiecție"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Butonul de proiecție. Deconectat"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Butonul de proiecție. Se conectează"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Butonul de proiecție. Conectat"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Proiectați pe"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Se caută dispozitive"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Deconectați-vă"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Nu mai proiectați"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Închideți"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Redați"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Întrerupeți"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Opriți"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Extindeți"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Restrângeți"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Grafica albumului"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Glisor pentru volum"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Niciun fișier media selectat"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nu sunt disponibile informații"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Se proiectează ecranul"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ru/strings.xml b/packages/MediaComponents/res/values-ru/strings.xml
deleted file mode 100644
index 7c462d2..0000000
--- a/packages/MediaComponents/res/values-ru/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Устройства"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляции"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Кнопка трансляции. Устройство отключено."</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Кнопка трансляции. Устройство подключается."</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Кнопка трансляции. Устройство подключено."</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Выберите устройство"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Поиск устройств…"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Отключить"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Прекратить трансляцию"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрыть"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Воспроизвести"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Приостановить"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Остановить"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Развернуть"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Свернуть"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Обложка"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Регулятор громкости"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медиафайл не выбран"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Данных нет"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Подключение к удаленному монитору"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-si/strings.xml b/packages/MediaComponents/res/values-si/strings.xml
deleted file mode 100644
index a55ce50..0000000
--- a/packages/MediaComponents/res/values-si/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"පද්ධතිය"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"උපාංග"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"විකාශ බොත්තම"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"විකාශ බොත්තම. විසන්ධි කරන ලදී"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"විකාශ බොත්තම සම්බන්ධ කරමින්"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"විකාශ බොත්තම සම්බන්ධ කරන ලදී"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"විකාශය"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"උපාංග සෙවීම"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"විසන්ධි කරන්න"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"විකාශ කිරීම නතර කරන්න"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"වසන්න"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ධාවනය කරන්න"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"විරාම ගන්වන්න"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"නතර කරන්න"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"දිග හරින්න"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"හකුළන්න"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ඇල්බම කලාව"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"හඬ පරිමා ස්ලයිඩරය"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"මාධ්යය තෝරා නැත"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ලබා ගත හැකි තොරතුරු නොමැත"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"විකාශ තිරය"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sk/strings.xml b/packages/MediaComponents/res/values-sk/strings.xml
deleted file mode 100644
index a58aa11..0000000
--- a/packages/MediaComponents/res/values-sk/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Systém"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Zariadenia"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Tlačidlo prenosu"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Tlačidlo prenosu. Odpojené"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tlačidlo prenosu. Pripája sa"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tlačidlo prenosu. Pripojené"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Prenos do"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Hľadajú sa zariadenia"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojiť"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zastaviť prenášanie"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zavrieť"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Prehrať"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pozastaviť"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Zastaviť"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozbaliť"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Zbaliť"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Obrázok albumu"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Posúvač hlasitosti"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nie sú vybrané žiadne médiá"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nie sú k dispozícii žiadne informácie"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prenáša sa obrazovka"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sl/strings.xml b/packages/MediaComponents/res/values-sl/strings.xml
deleted file mode 100644
index 8ca4ce4..0000000
--- a/packages/MediaComponents/res/values-sl/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Naprave"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Gumb za predvajanje"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Gumb za predvajanje. Povezava je prekinjena."</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Gumb za predvajanje. Vzpostavljanje povezave."</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Gumb za predvajanje. Povezava je vzpostavljena."</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Predvajanje prek:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Iskanje naprav"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini povezavo"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Ustavi predvajanje"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zapri"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Predvajanje"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Zaustavi"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Ustavi"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Razširi"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Strni"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Naslovnica albuma"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Drsnik za glasnost"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ni izbrane predstavnosti"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Podatki niso na voljo"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Predvajanje zaslona"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sq/strings.xml b/packages/MediaComponents/res/values-sq/strings.xml
deleted file mode 100644
index 816e110..0000000
--- a/packages/MediaComponents/res/values-sq/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistemi"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Pajisjet"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Butoni i transmetimit"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Butoni i transmetimit. Je i shkëputur"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Butoni i transmetimit. Po lidhet"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Butoni i transmetimit. Je i lidhur"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmeto te"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Po kërkon pajisje"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Shkëpute"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Ndalo transmetimin"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Mbyll"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Luaj"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pauzë"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Ndalo"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Zgjeroje"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Palose"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Kopertina e albumit"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Rrëshqitësi i volumit"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nuk u zgjodh asnjë media"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nuk jepet asnjë informacion"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Po transmeton ekranin"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sr/strings.xml b/packages/MediaComponents/res/values-sr/strings.xml
deleted file mode 100644
index caabad5..0000000
--- a/packages/MediaComponents/res/values-sr/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Уређаји"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Дугме Пребаци"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Дугме Пребаци. Веза је прекинута"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Дугме Пребаци. Повезује се"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Дугме Пребаци. Повезан је"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Пребацуј на"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Проналажење уређаја"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Прекини везу"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Заустави пребацивање"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Затвори"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Пусти"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Паузирај"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Заустави"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Прошири"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Скупи"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Омот албума"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Клизач за јачину звука"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Нема изабраних медија"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Нису доступне никакве информације"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Пребацује се екран"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sv/strings.xml b/packages/MediaComponents/res/values-sv/strings.xml
deleted file mode 100644
index ca7d3e0..0000000
--- a/packages/MediaComponents/res/values-sv/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheter"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knappen"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Cast-knappen. Frånkopplad"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-knappen. Ansluter"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-knappen. Ansluten"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Casta till"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Letar efter enheter"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Koppla från"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Sluta casta"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Stäng"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Spela upp"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Avbryt"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Utöka"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Komprimera"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Skivomslag"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Volymreglage"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Inga media har valts"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Det finns ingen information"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skärmen castas"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sw/strings.xml b/packages/MediaComponents/res/values-sw/strings.xml
deleted file mode 100644
index 9562cb1..0000000
--- a/packages/MediaComponents/res/values-sw/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Mfumo"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Vifaa"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Kitufe cha kutuma"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Kitufe cha kutuma. Kimeondolewa"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Kitufe cha kutuma. Kinaunganisha"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Kitufe cha kutuma. Kimeunganishwa"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Tuma kwenye"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Inatafuta vifaa"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ondoa"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Acha kutuma"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Funga"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Cheza"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Sitisha"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Simamisha"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Panua"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Kunja"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Sanaa ya albamu"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Kitelezi cha sauti"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Hakuna maudhui yaliyochaguliwa"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hakuna maelezo yaliyopatikana"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Inatuma skrini"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-sw600dp/dimens.xml b/packages/MediaComponents/res/values-sw600dp/dimens.xml
deleted file mode 100644
index 4042348..0000000
--- a/packages/MediaComponents/res/values-sw600dp/dimens.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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>
- <!-- The platform's desired fixed width for a dialog along the major axis
- (the screen is in landscape). This may be either a fraction or a dimension.-->
- <item type="dimen" name="mr_dialog_fixed_width_major">60%</item>
- <!-- The platform's desired fixed width for a dialog along the minor axis
- (the screen is in portrait). This may be either a fraction or a dimension.-->
- <item type="dimen" name="mr_dialog_fixed_width_minor">90%</item>
-</resources>
diff --git a/packages/MediaComponents/res/values-sw720dp/dimens.xml b/packages/MediaComponents/res/values-sw720dp/dimens.xml
deleted file mode 100644
index 634ab8d..0000000
--- a/packages/MediaComponents/res/values-sw720dp/dimens.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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>
- <!-- The platform's desired fixed width for a dialog along the major axis
- (the screen is in landscape). This may be either a fraction or a dimension.-->
- <item type="dimen" name="mr_dialog_fixed_width_major">50%</item>
- <!-- The platform's desired fixed width for a dialog along the minor axis
- (the screen is in portrait). This may be either a fraction or a dimension.-->
- <item type="dimen" name="mr_dialog_fixed_width_minor">70%</item>
-</resources>
diff --git a/packages/MediaComponents/res/values-ta/strings.xml b/packages/MediaComponents/res/values-ta/strings.xml
deleted file mode 100644
index e1978f3..0000000
--- a/packages/MediaComponents/res/values-ta/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"சிஸ்டம்"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"சாதனங்கள்"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"திரையிடு பட்டன்"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"அனுப்புதல் பொத்தான். துண்டிக்கப்பட்டது"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"அனுப்புதல் பொத்தான். இணைக்கிறது"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"அனுப்புதல் பொத்தான். இணைக்கப்பட்டது"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"இதற்கு அனுப்பு"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"சாதனங்களைத் தேடுகிறது"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"தொடர்பைத் துண்டி"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"அனுப்புவதை நிறுத்து"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"மூடும்"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"இயக்கும்"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"இடைநிறுத்தும்"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"நிறுத்துவதற்கான பொத்தான்"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"விரிவாக்கு"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"சுருக்கு"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ஆல்பம் ஆர்ட்"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"ஒலியளவு ஸ்லைடர்"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"மீடியா எதுவும் தேர்ந்தெடுக்கப்படவில்லை"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"தகவல் எதுவுமில்லை"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"திரையை அனுப்புகிறீர்கள்"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-te/strings.xml b/packages/MediaComponents/res/values-te/strings.xml
deleted file mode 100644
index 7d312e3..0000000
--- a/packages/MediaComponents/res/values-te/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"సిస్టమ్"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"పరికరాలు"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ప్రసారం చేయి బటన్"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ప్రసార బటన్. డిస్కనెక్ట్ చేయబడింది"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ప్రసార బటన్. కనెక్ట్ చేస్తోంది"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ప్రసార బటన్. కనెక్ట్ చేయబడింది"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"దీనికి ప్రసారం చేయండి"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"పరికరాలను కనుగొంటోంది"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"డిస్కనెక్ట్ చేయి"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ప్రసారాన్ని ఆపివేయి"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"మూసివేస్తుంది"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ప్లే చేస్తుంది"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"పాజ్ చేస్తుంది"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"ఆపివేయి"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"విస్తరింపజేస్తుంది"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"కుదిస్తుంది"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ఆల్బమ్ ఆర్ట్"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"వాల్యూమ్ స్లయిడర్"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"మీడియా ఏదీ ఎంచుకోబడలేదు"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"సమాచారం అందుబాటులో లేదు"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"స్క్రీన్ను ప్రసారం చేస్తోంది"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-th/strings.xml b/packages/MediaComponents/res/values-th/strings.xml
deleted file mode 100644
index cfa8ae5..0000000
--- a/packages/MediaComponents/res/values-th/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"ระบบ"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"อุปกรณ์"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ปุ่ม \"แคสต์\""</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ปุ่ม \"แคสต์\" ยกเลิกการเชื่อมต่อ"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ปุ่ม \"แคสต์\" กำลังเชื่อมต่อ"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"ปุ่ม \"แคสต์\" เชื่อมต่อแล้ว"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"แคสต์ไปยัง"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"กำลังค้นหาอุปกรณ์"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ยกเลิกการเชื่อมต่อ"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"หยุดแคสต์"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ปิด"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"เล่น"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"หยุดชั่วคราว"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"หยุด"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ขยาย"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ยุบ"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"ปกอัลบั้ม"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"แถบเลื่อนปรับระดับเสียง"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ไม่ได้เลือกสื่อไว้"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ไม่มีข้อมูล"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"กำลังแคสต์หน้าจอ"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-tl/strings.xml b/packages/MediaComponents/res/values-tl/strings.xml
deleted file mode 100644
index a8be3d0..0000000
--- a/packages/MediaComponents/res/values-tl/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Mga Device"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Button na I-cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Button na I-cast. Nadiskonekta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Button na I-cast. Kumokonekta"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Button na I-cast. Nakakonekta"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"I-cast sa"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Naghahanap ng mga device"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Idiskonekta"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Ihinto ang pag-cast"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Isara"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"I-play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"I-pause"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Ihinto"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Palawakin"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"I-collapse"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Slider ng volume"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Walang piniling media"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Walang available na impormasyon"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Kina-cast ang screen"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-tr/strings.xml b/packages/MediaComponents/res/values-tr/strings.xml
deleted file mode 100644
index 05f6392..0000000
--- a/packages/MediaComponents/res/values-tr/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Cihazlar"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Yayınla düğmesi"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Yayınla düğmesi. Bağlantı kesildi"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Yayınla düğmesi. Bağlanıyor"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Yayınla düğmesi. Bağlandı"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Şuraya yayınla:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Cihazlar bulunuyor"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Bağlantıyı kes"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Yayını durdur"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Kapat"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Oynat"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Duraklat"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Durdur"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Genişlet"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Daralt"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albüm kapağı"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Ses düzeyi kaydırma çubuğu"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Medya seçilmedi"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Bilgi yok"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekran yayınlanıyor"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-uk/strings.xml b/packages/MediaComponents/res/values-uk/strings.xml
deleted file mode 100644
index 33d365e..0000000
--- a/packages/MediaComponents/res/values-uk/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Пристрої"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляції"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Кнопка трансляції. Від’єднано"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Кнопка трансляції. Під’єднання"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Кнопка трансляції. Під’єднано"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Транслювати на"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук пристроїв"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Відключити"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Припинити трансляцію"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрити"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Відтворити"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Призупинити"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Припинити"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Розгорнути"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Згорнути"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Обкладинка альбому"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Повзунок гучності"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медіа-файл не вибрано"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Немає даних"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Трансляція екрана"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-ur/strings.xml b/packages/MediaComponents/res/values-ur/strings.xml
deleted file mode 100644
index 632c598..0000000
--- a/packages/MediaComponents/res/values-ur/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"سسٹم"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"آلات"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"کاسٹ کرنے کا بٹن"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"کاسٹ کرنے کا بٹن۔ غیر منسلک ہے"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"کاسٹ کرنے کا بٹن۔ منسلک ہو رہا ہے"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"کاسٹ کرنے کا بٹن۔ منسلک ہے"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"اس میں کاسٹ کریں"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"آلات تلاش ہو رہے ہیں"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"غیر منسلک کریں"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"کاسٹ کرنا بند کریں"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"بند کریں"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"چلائیں"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"موقوف کریں"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"روکیں"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"پھیلائیں"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"سکیڑیں"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"البم آرٹ"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"والیوم سلائیڈر"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"کوئی میڈیا منتخب نہیں ہے"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"کوئی معلومات دستیاب نہیں"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"سکرین کاسٹ ہو رہی ہے"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-uz/strings.xml b/packages/MediaComponents/res/values-uz/strings.xml
deleted file mode 100644
index 10a0817..0000000
--- a/packages/MediaComponents/res/values-uz/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Tizim"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Qurilmalar"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Translatsiya tugmasi"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Translatsiya tugmasi. Uzildi"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Translatsiya tugmasi. Ulanmoqda"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Translatsiya tugmasi. Ulandi"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Quyidagiga translatsiya qilish:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Qurilmalarni topish"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ulanishni uzish"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Translatsiyani to‘xtatish"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Yopish"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Boshlash"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"To‘xtatib turish"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"To‘xtatish"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Yoyish"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yig‘ish"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Albom muqovasi"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Tovush balandligi slayderi"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Multimedia tanlamagan"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hech qanday ma’lumot yo‘q"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekranni translatsiya qilish"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-vi/strings.xml b/packages/MediaComponents/res/values-vi/strings.xml
deleted file mode 100644
index 7098cca..0000000
--- a/packages/MediaComponents/res/values-vi/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Hệ thống"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Thiết bị"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Nút truyền"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Nút truyền. Đã ngắt kết nối"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Nút truyền. Đang kết nối"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Nút truyền. Đã kết nối"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Truyền tới"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Đang tìm thiết bị"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ngắt kết nối"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Dừng truyền"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Đóng"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Phát"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Tạm dừng"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Dừng"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mở rộng"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Thu gọn"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Ảnh bìa album"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Thanh trượt âm lượng"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Không có phương tiện nào được chọn"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Không có thông tin nào"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Đang truyền màn hình"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-zh-rCN/strings.xml b/packages/MediaComponents/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 1e22d01..0000000
--- a/packages/MediaComponents/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"系统"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"设备"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"投射按钮"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"投射按钮。已断开连接"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"投射按钮。正在连接"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"投射按钮。已连接"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"投射到"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"正在查找设备"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"断开连接"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"停止投射"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"关闭"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"暂停"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"停止"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"展开"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"收起"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"专辑封面"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"音量滑块"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"未选择任何媒体"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"没有任何相关信息"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投射屏幕"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-zh-rHK/strings.xml b/packages/MediaComponents/res/values-zh-rHK/strings.xml
deleted file mode 100644
index 156e5c2..0000000
--- a/packages/MediaComponents/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"系統"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"裝置"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"投放按鈕"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"投放按鈕。已解除連接"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"投放按鈕。正在連接"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"投放按鈕。已連接"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"投放至"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"正在尋找裝置"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"中斷連線"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"停止投放"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"關閉"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"暫停"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"停止"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"收合"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"專輯封面"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"音量滑桿"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"尚未選擇媒體"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"沒有詳細資料"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投放螢幕"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-zh-rTW/strings.xml b/packages/MediaComponents/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 6cafde1..0000000
--- a/packages/MediaComponents/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"系統"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"裝置"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"投放按鈕"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"投放按鈕;已中斷連線"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"投放按鈕;連線中"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"投放按鈕;已連線"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"投放到"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"正在尋找裝置"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"中斷連線"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"停止投放"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"關閉"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"暫停"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"停止"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"收合"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"專輯封面"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"音量滑桿"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"未選取任何媒體"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"沒有可用的資訊"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投放螢幕"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values-zu/strings.xml b/packages/MediaComponents/res/values-zu/strings.xml
deleted file mode 100644
index e107c43..0000000
--- a/packages/MediaComponents/res/values-zu/strings.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Isistimu"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Amadivayisi"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Inkinobho ye-Cast"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Inkinobho yokusakaza. Kunqanyuliwe"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Inkinobho yokusakaza. Kuyaxhunywa"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Inkinobho yokusakaza. Kuxhunyiwe"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Sakaza ku-"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Ithola amadivayisi"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Nqamula"</string>
- <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Misa ukusakaza"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Vala"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Dlala"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Misa isikhashana"</string>
- <string name="mr_controller_stop" msgid="735874641921425123">"Misa"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Nweba"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Goqa"</string>
- <string name="mr_controller_album_art" msgid="6422801843540543585">"Ubuciko be-albhamu"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Isilayida sevolumu"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ayikho imidiya ekhethiwe"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Alukho ulwazi olutholakalayo"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Isikrini sokusakaza"</string>
-</resources>
diff --git a/packages/MediaComponents/res/values/arrays.xml b/packages/MediaComponents/res/values/arrays.xml
deleted file mode 100644
index 1187320..0000000
--- a/packages/MediaComponents/res/values/arrays.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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>
- <integer-array name="speed_multiplied_by_100">
- <item>25</item>
- <item>50</item>
- <item>75</item>
- <item>100</item>
- <item>125</item>
- <item>150</item>
- <item>200</item>
- </integer-array>
-</resources>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/values/attrs.xml b/packages/MediaComponents/res/values/attrs.xml
deleted file mode 100644
index e37285b..0000000
--- a/packages/MediaComponents/res/values/attrs.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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>
- <declare-styleable name="MediaRouteButton">
- <!-- This drawable is a state list where the "checked" state
- indicates active media routing. Checkable indicates connecting
- and non-checked / non-checkable indicates
- that media is playing to the local device only. -->
- <attr name="externalRouteEnabledDrawable" format="reference" />
- <!-- Tint to apply to the media route button -->
- <attr name="mediaRouteButtonTint" format="color" />
-
- <attr name="android:minWidth" />
- <attr name="android:minHeight" />
- </declare-styleable>
-
- <attr name="mediaRouteButtonStyle" format="reference" />
- <attr name="mediaRouteCloseDrawable" format="reference" />
- <attr name="mediaRoutePlayDrawable" format="reference" />
- <attr name="mediaRoutePauseDrawable" format="reference" />
- <attr name="mediaRouteStopDrawable" format="reference" />
- <attr name="mediaRouteAudioTrackDrawable" format="reference" />
- <attr name="mediaRouteDefaultIconDrawable" format="reference" />
- <attr name="mediaRouteTvIconDrawable" format="reference" />
- <attr name="mediaRouteSpeakerIconDrawable" format="reference" />
- <attr name="mediaRouteSpeakerGroupIconDrawable" format="reference" />
- <attr name="mediaRouteControlPanelThemeOverlay" format="reference" />
-
- <attr name="mediaRouteTheme" format="reference" />
-</resources>
diff --git a/packages/MediaComponents/res/values/colors.xml b/packages/MediaComponents/res/values/colors.xml
deleted file mode 100644
index e7bc299..0000000
--- a/packages/MediaComponents/res/values/colors.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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>
- <color name="gray">#808080</color>
- <color name="white">#ffffff</color>
- <color name="white_opacity_70">#B3ffffff</color>
- <color name="black_opacity_70">#B3000000</color>
- <color name="title_bar_gradient_start">#50000000</color>
- <color name="title_bar_gradient_end">#00000000</color>
- <color name="bottom_bar_background">#40202020</color>
-</resources>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/values/dimens.xml b/packages/MediaComponents/res/values/dimens.xml
deleted file mode 100644
index 2d7b022..0000000
--- a/packages/MediaComponents/res/values/dimens.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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>
- <!-- Dialog size -->
- <eat-comment />
- <!-- The platform's desired fixed width for a dialog along the major axis
- (the screen is in landscape). This may be either a fraction or a dimension.-->
- <dimen name="mr_dialog_fixed_width_major">320dp</dimen>
- <!-- The platform's desired fixed width for a dialog along the minor axis
- (the screen is in portrait). This may be either a fraction or a dimension.-->
- <dimen name="mr_dialog_fixed_width_minor">320dp</dimen>
-
- <!-- MediaRouteController's volume group list -->
- <eat-comment />
- <!-- Maximum height of volume group list. -->
- <dimen name="mr_controller_volume_group_list_max_height">288dp</dimen>
- <!-- Height of volume group item. -->
- <dimen name="mr_controller_volume_group_list_item_height">68dp</dimen>
- <!-- Size of an item's icon. -->
- <dimen name="mr_controller_volume_group_list_item_icon_size">24dp</dimen>
-
- <dimen name="mr_controller_volume_group_list_padding_top">16dp</dimen>
- <!-- Group list expand/collapse animation duration. -->
- <integer name="mr_controller_volume_group_list_animation_duration_ms">400</integer>
- <!-- Group list fade in animation duration. -->
- <integer name="mr_controller_volume_group_list_fade_in_duration_ms">400</integer>
- <!-- Group list fade out animation duration. -->
- <integer name="mr_controller_volume_group_list_fade_out_duration_ms">200</integer>
-
- <dimen name="mcv2_embedded_settings_width">150dp</dimen>
- <dimen name="mcv2_embedded_settings_height">36dp</dimen>
- <dimen name="mcv2_embedded_settings_icon_size">20dp</dimen>
- <dimen name="mcv2_embedded_settings_text_height">18dp</dimen>
- <dimen name="mcv2_embedded_settings_main_text_size">12sp</dimen>
- <dimen name="mcv2_embedded_settings_sub_text_size">10sp</dimen>
- <dimen name="mcv2_full_settings_width">225dp</dimen>
- <dimen name="mcv2_full_settings_height">54dp</dimen>
- <dimen name="mcv2_full_settings_icon_size">30dp</dimen>
- <dimen name="mcv2_full_settings_text_height">27dp</dimen>
- <dimen name="mcv2_full_settings_main_text_size">16sp</dimen>
- <dimen name="mcv2_full_settings_sub_text_size">13sp</dimen>
- <dimen name="mcv2_settings_offset">8dp</dimen>
-
- <dimen name="mcv2_transport_controls_padding">4dp</dimen>
- <dimen name="mcv2_pause_icon_size">36dp</dimen>
- <dimen name="mcv2_full_icon_size">28dp</dimen>
- <dimen name="mcv2_embedded_icon_size">24dp</dimen>
- <dimen name="mcv2_minimal_icon_size">24dp</dimen>
- <dimen name="mcv2_icon_margin">10dp</dimen>
-
- <dimen name="mcv2_full_album_image_portrait_size">232dp</dimen>
- <dimen name="mcv2_full_album_image_landscape_size">176dp</dimen>
-
- <dimen name="mcv2_custom_progress_max_size">2dp</dimen>
- <dimen name="mcv2_custom_progress_thumb_size">12dp</dimen>
- <dimen name="mcv2_buffer_view_height">5dp</dimen>
- <!-- TODO: adjust bottom bar view -->
-</resources>
diff --git a/packages/MediaComponents/res/values/strings.xml b/packages/MediaComponents/res/values/strings.xml
deleted file mode 100644
index 2597a3b..0000000
--- a/packages/MediaComponents/res/values/strings.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
- <!-- Name for the default system route prior to Jellybean. [CHAR LIMIT=30] -->
- <string name="mr_system_route_name">System</string>
-
- <!-- Name for the user route category created when publishing routes to the system in Jellybean and above. [CHAR LIMIT=30] -->
- <string name="mr_user_route_category_name">Devices</string>
-
- <!-- String to be shown as a tooltip of MediaRouteButton
- Cast is the standard android verb for sending content to a remote device. [CHAR LIMIT=50] -->
- <string name="mr_button_content_description">Cast button</string>
-
- <!-- Content description of a MediaRouteButton for accessibility support when no remote device is connected.
- Cast is the standard android verb for sending content to a remote device. [CHAR LIMIT=NONE] -->
- <string name="mr_cast_button_disconnected">Cast button. Disconnected</string>
-
- <!-- Content description of a MediaRouteButton for accessibility support while connecting to a remote device.
- Cast is the standard android verb for sending content to a remote device. [CHAR LIMIT=NONE] -->
- <string name="mr_cast_button_connecting">Cast button. Connecting</string>
-
- <!-- Content description of a MediaRouteButton for accessibility support when a remote device is connected.
- Cast is the standard android verb for sending content to a remote device. [CHAR LIMIT=NONE] -->
- <string name="mr_cast_button_connected">Cast button. Connected</string>
-
- <!-- Title of the media route chooser dialog. [CHAR LIMIT=30] -->
- <string name="mr_chooser_title">Cast to</string>
-
- <!-- Placeholder text to show when no devices have been found. [CHAR LIMIT=50] -->
- <string name="mr_chooser_searching">Finding devices</string>
-
- <!-- Button to disconnect from a media route. [CHAR LIMIT=30] -->
- <string name="mr_controller_disconnect">Disconnect</string>
-
- <!-- Button to stop playback and disconnect from a media route. [CHAR LIMIT=30] -->
- <string name="mr_controller_stop_casting">Stop casting</string>
-
- <!-- Content description for accessibility (not shown on the screen): dialog close button. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_close_description">Close</string>
-
- <!-- Content description for accessibility (not shown on the screen): media play button. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_play">Play</string>
-
- <!-- Content description for accessibility (not shown on the screen): media pause button. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_pause">Pause</string>
-
- <!-- Content description for accessibility (not shown on the screen): media stop button. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_stop">Stop</string>
-
- <!-- Content description for accessibility (not shown on the screen): group expand button. Pressing button shows group members of a selected route group. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_expand_group">Expand</string>
-
- <!-- Content description for accessibility (not shown on the screen): group collapse button. Pressing button hides group members of a selected route group. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_collapse_group">Collapse</string>
-
- <!-- Content description for accessibility (not shown on the screen): album art button. Clicking on the album art takes user to a predefined activity per media app. [CHAR LIMIT=50] -->
- <string name="mr_controller_album_art">Album art</string>
-
- <!-- Content description for accessibility (not shown on the screen): volume slider. [CHAR LIMIT=NONE] -->
- <string name="mr_controller_volume_slider">Volume slider</string>
-
- <!-- Placeholder text to show when no media have been selected for playback. [CHAR LIMIT=50] -->
- <string name="mr_controller_no_media_selected">No media selected</string>
-
- <!-- Placeholder text to show when no title/description have been found for a given song/video. [CHAR LIMIT=50] -->
- <string name="mr_controller_no_info_available">No info available</string>
-
- <!-- Placeholder text indicating that the user is currently casting screen. [CHAR LIMIT=50] -->
- <string name="mr_controller_casting_screen">Casting screen</string>
-
- <!-- Text for error alert when a video container is not valid for progressive download/playback. -->
- <string name="VideoView2_error_text_invalid_progressive_playback">This video isn\'t valid for streaming to this device.</string>
- <!-- Text for error alert when a video cannot be played. It can be used by any app. -->
- <string name="VideoView2_error_text_unknown">Can\'t play this video.</string>
- <!-- Button to close error alert when a video cannot be played. -->
- <string name="VideoView2_error_button">OK</string>
-
- <!-- Text for displaying ad skip wait time. -->
- <string name="MediaControlView2_ad_skip_wait_time">
- You can skip Ad in <xliff:g id="wait_time" example="5">%1$d</xliff:g>s
- </string>
- <!-- Text for displaying ad total remaining time. -->
- <string name="MediaControlView2_ad_remaining_time">
- Ad · <xliff:g id="remaining_time" example="1:15">%1$s</xliff:g> remaining
- </string>
- <!-- Placeholder text indicating that the user can press the button to go to an external website. -->
- <string name="MediaControlView2_ad_text">Visit Advertiser</string>
- <string name="MediaControlView2_subtitle_text">Closed caption</string>
- <string name="MediaControlView2_subtitle_off_text">Off</string>
- <string name="MediaControlView2_audio_track_text">Audio track</string>
- <string name="MediaControlView2_audio_track_none_text">None</string>
- <string name="MediaControlView2_video_quality_text">Video quality</string>
- <string name="MediaControlView2_video_quality_auto_text">Auto</string>
- <string name="MediaControlView2_help_text">Help & feedback</string>
- <string name="MediaControlView2_playback_speed_text">Playback speed</string>
- <string-array name="MediaControlView2_playback_speeds">
- <item>0.25x</item>
- <item>0.5x</item>
- <item>0.75x</item>
- <item>Normal</item>
- <item>1.25x</item>
- <item>1.5x</item>
- <item>2x</item>
- </string-array>
- <!-- Placeholder text for displaying time. Used to calculate which size layout to use. -->
- <string name="MediaControlView2_time_placeholder">00:00:00</string>
-
- <!-- Text for displaying subtitle track number. -->
- <string name="MediaControlView2_subtitle_track_number_text">
- Track <xliff:g id="track_number" example="1">%1$s</xliff:g>
- </string>
- <!-- Text for displaying audio track number. -->
- <string name="MediaControlView2_audio_track_number_text">
- Track <xliff:g id="audio_number" example="1">%1$s</xliff:g>
- </string>
- <!-- Text for displaying unknown song title. -->
- <string name="mcv2_music_title_unknown_text">Song title unknown</string>
- <!-- Text for displaying unknown artist name. -->
- <string name="mcv2_music_artist_unknown_text">Artist unknown</string>
-
- <!--Content Descriptions -->
- <string name="mcv2_back_button_desc">Back</string>
- <string name="mcv2_overflow_left_button_desc">See more buttons</string>
- <string name="mcv2_overflow_right_button_desc">Back to previous button list</string>
- <string name="mcv2_seek_bar_desc">Playback progress</string>
- <string name="mcv2_settings_button_desc">Settings</string>
- <string name="mcv2_video_quality_button_desc">Video Quality Selection</string>
- <string name="mcv2_cc_is_on">Subtitle is on. Click to hide it.</string>
- <string name="mcv2_cc_is_off">Subtitle is off. Click to show it.</string>
- <string name="mcv2_replay_button_desc">Replay</string>
- <string name="mcv2_play_button_desc">Play</string>
- <string name="mcv2_pause_button_desc">Pause</string>
- <string name="mcv2_previous_button_desc">Previous media</string>
- <string name="mcv2_next_button_desc">Next media</string>
- <string name="mcv2_rewind_button_desc">Rewind by 10 seconds</string>
- <string name="mcv2_ffwd_button_desc">Go forward by 30 seconds</string>
- <string name="mcv2_launch_button_desc">Launch Link</string>
- <string name="mcv2_muted_button_desc">Muted. Click to unmute</string>
- <string name="mcv2_unmuted_button_desc">Click to Mute</string>
- <string name="mcv2_full_screen_button_desc">Full screen</string>
-</resources>
diff --git a/packages/MediaComponents/res/values/style.xml b/packages/MediaComponents/res/values/style.xml
deleted file mode 100644
index 5b9a8ee..0000000
--- a/packages/MediaComponents/res/values/style.xml
+++ /dev/null
@@ -1,221 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <style name="FullTransportControlsButton">
- <item name="android:background">@null</item>
- <item name="android:layout_margin">@dimen/mcv2_icon_margin</item>
- <item name="android:scaleType">fitXY</item>
- </style>
-
- <style name="FullTransportControlsButton.Previous">
- <item name="android:src">@drawable/ic_skip_previous</item>
- <item name="android:layout_width">@dimen/mcv2_full_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_full_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_previous_button_desc</item>
- </style>
-
- <style name="FullTransportControlsButton.Next">
- <item name="android:src">@drawable/ic_skip_next</item>
- <item name="android:layout_width">@dimen/mcv2_full_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_full_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_next_button_desc</item>
- </style>
-
- <style name="FullTransportControlsButton.Pause">
- <item name="android:src">@drawable/ic_pause_circle_filled</item>
- <item name="android:layout_width">@dimen/mcv2_pause_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_pause_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_pause_button_desc</item>
- </style>
-
- <style name="FullTransportControlsButton.Ffwd">
- <item name="android:src">@drawable/ic_forward_30</item>
- <item name="android:layout_width">@dimen/mcv2_full_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_full_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_ffwd_button_desc</item>
- </style>
-
- <style name="FullTransportControlsButton.Rew">
- <item name="android:src">@drawable/ic_rewind_10</item>
- <item name="android:layout_width">@dimen/mcv2_full_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_full_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_rewind_button_desc</item>
- </style>
-
- <style name="EmbeddedTransportControlsButton">
- <item name="android:background">@null</item>
- <item name="android:layout_margin">@dimen/mcv2_icon_margin</item>
- <item name="android:scaleType">fitXY</item>
- </style>
-
- <style name="EmbeddedTransportControlsButton.Previous">
- <item name="android:src">@drawable/ic_skip_previous</item>
- <item name="android:layout_width">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_previous_button_desc</item>
- </style>
-
- <style name="EmbeddedTransportControlsButton.Next">
- <item name="android:src">@drawable/ic_skip_next</item>
- <item name="android:layout_width">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_next_button_desc</item>
- </style>
-
- <style name="EmbeddedTransportControlsButton.Pause">
- <item name="android:src">@drawable/ic_pause_circle_filled</item>
- <item name="android:layout_width">@dimen/mcv2_pause_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_pause_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_pause_button_desc</item>
- </style>
-
- <style name="EmbeddedTransportControlsButton.Ffwd">
- <item name="android:src">@drawable/ic_forward_30</item>
- <item name="android:layout_width">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_ffwd_button_desc</item>
- </style>
-
- <style name="EmbeddedTransportControlsButton.Rew">
- <item name="android:src">@drawable/ic_rewind_10</item>
- <item name="android:layout_width">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:contentDescription">@string/mcv2_rewind_button_desc</item>
- </style>
-
- <style name="MinimalTransportControlsButton">
- <item name="android:background">@null</item>
- <item name="android:layout_width">@dimen/mcv2_pause_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_pause_icon_size</item>
- <item name="android:layout_margin">@dimen/mcv2_icon_margin</item>
- <item name="android:scaleType">fitXY</item>
- <item name="android:src">@drawable/ic_pause_circle_filled</item>
- <item name="android:contentDescription">@string/mcv2_pause_button_desc</item>
- </style>
-
- <style name="TitleBar">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">46dp</item>
- <item name="android:paddingStart">5dp</item>
- <item name="android:paddingEnd">5dp</item>
- </style>
-
- <style name="TitleBarButton">
- <item name="android:background">@null</item>
- <item name="android:layout_width">36dp</item>
- <item name="android:layout_height">36dp</item>
- </style>
-
- <style name="TitleBarButton.Back">
- <item name="android:src">@drawable/ic_arrow_back</item>
- <item name="android:contentDescription">@string/mcv2_back_button_desc</item>
- </style>
-
- <style name="TitleBarButton.Launch">
- <item name="android:src">@drawable/ic_launch</item>
- <item name="android:contentDescription">@string/mcv2_launch_button_desc</item>
- </style>
-
- <style name="TimeText">
- <item name="android:layout_width">wrap_content</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:paddingStart">4dp</item>
- <item name="android:paddingEnd">4dp</item>
- <item name="android:textStyle">bold</item>
- <item name="android:textSize">14sp</item>
- <item name="android:gravity">center</item>
- </style>
-
- <style name="TimeText.Current">
- <item name="android:textColor">@color/white</item>
- <item name="android:text">@string/MediaControlView2_time_placeholder</item>
- </style>
-
- <style name="TimeText.Interpunct">
- <item name="android:textColor">@color/white_opacity_70</item>
- <item name="android:text">·</item>
- </style>
-
- <style name="TimeText.End">
- <item name="android:textColor">@color/white_opacity_70</item>
- <item name="android:text">@string/MediaControlView2_time_placeholder</item>
- </style>
-
- <style name="BottomBarButton">
- <item name="android:background">@null</item>
- <item name="android:layout_width">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:layout_height">@dimen/mcv2_embedded_icon_size</item>
- <item name="android:layout_margin">@dimen/mcv2_icon_margin</item>
- <item name="android:gravity">center_horizontal</item>
- <item name="android:scaleType">fitXY</item>
- </style>
-
- <style name="BottomBarButton.CC">
- <item name="android:src">@drawable/ic_subtitle_off</item>
- <item name="android:contentDescription">@string/mcv2_cc_is_off</item>
- </style>
-
- <style name="BottomBarButton.FullScreen">
- <item name="android:src">@drawable/ic_fullscreen</item>
- <item name="android:contentDescription">@string/mcv2_full_screen_button_desc</item>
- </style>
-
- <style name="BottomBarButton.OverflowRight">
- <item name="android:src">@drawable/ic_chevron_right</item>
- <item name="android:contentDescription">@string/mcv2_overflow_right_button_desc</item>
- </style>
-
- <style name="BottomBarButton.OverflowLeft">
- <item name="android:src">@drawable/ic_chevron_left</item>
- <item name="android:contentDescription">@string/mcv2_overflow_left_button_desc</item>
- </style>
-
- <style name="BottomBarButton.Settings">
- <item name="android:src">@drawable/ic_settings</item>
- <item name="android:contentDescription">@string/mcv2_settings_button_desc</item>
- </style>
-
- <style name="BottomBarButton.Mute">
- <item name="android:src">@drawable/ic_unmute</item>
- <item name="android:contentDescription">@string/mcv2_unmuted_button_desc</item>
- </style>
-
- <style name="BottomBarButton.VideoQuality">
- <item name="android:src">@drawable/ic_high_quality</item>
- <item name="android:contentDescription">@string/mcv2_video_quality_button_desc</item>
- </style>
-
- <style name="FullMusicPortrait">
- <item name="android:layout_height">0dp</item>
- </style>
-
- <style name="FullMusicPortrait.Image">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_weight">0.6</item>
- <item name="android:gravity">center</item>
- </style>
-
- <style name="FullMusicPortrait.Text">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_weight">0.4</item>
- <item name="android:gravity">top|center</item>
- <item name="android:orientation">vertical</item>
- </style>
-
- <style name="FullMusicLandscape">
- <item name="android:layout_width">0dp</item>
- </style>
-
- <style name="FullMusicLandscape.Image">
- <item name="android:layout_height">match_parent</item>
- <item name="android:layout_weight">0.35</item>
- <item name="android:gravity">center|right</item>
- </style>
-
- <style name="FullMusicLandscape.Text">
- <item name="android:layout_height">match_parent</item>
- <item name="android:layout_weight">0.65</item>
- <item name="android:layout_marginLeft">24dp</item>
- <item name="android:gravity">center|left</item>
- <item name="android:orientation">vertical</item>
- </style>
-</resources>
diff --git a/packages/MediaComponents/res/values/styles.xml b/packages/MediaComponents/res/values/styles.xml
deleted file mode 100644
index bde6900..0000000
--- a/packages/MediaComponents/res/values/styles.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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>
- <style name="Widget.MediaRouter.MediaRouteButton"
- parent="Widget.AppCompat.ActionButton">
- <item name="externalRouteEnabledDrawable">@drawable/mr_button_dark</item>
- </style>
-
- <style name="Widget.MediaRouter.Light.MediaRouteButton"
- parent="Widget.AppCompat.Light.ActionButton">
- <item name="externalRouteEnabledDrawable">@drawable/mr_button_light</item>
- </style>
-
- <style name="TextAppearance.MediaRouter.Title" parent="TextAppearance.AppCompat.Title" />
-
- <style name="TextAppearance.MediaRouter.PrimaryText" parent="TextAppearance.AppCompat.Subhead" />
-
- <style name="TextAppearance.MediaRouter.SecondaryText" parent="TextAppearance.AppCompat.Body1" />
-</resources>
diff --git a/packages/MediaComponents/res/values/symbols.xml b/packages/MediaComponents/res/values/symbols.xml
deleted file mode 100644
index ee0e8c6..0000000
--- a/packages/MediaComponents/res/values/symbols.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* Copyright 2017, 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>
- <!--java-symbol type="id" name="cc" />
- <java-symbol type="id" name="ffwd" />
- <java-symbol type="id" name="mediacontroller_progress" />
- <java-symbol type="id" name="next" />
- <java-symbol type="id" name="pause" />
- <java-symbol type="id" name="prev" />
- <java-symbol type="id" name="rew" />
- <java-symbol type="id" name="time" />
- <java-symbol type="id" name="time_current" /-->
-</resources>
\ No newline at end of file
diff --git a/packages/MediaComponents/res/values/themes.xml b/packages/MediaComponents/res/values/themes.xml
deleted file mode 100644
index d9a754b..0000000
--- a/packages/MediaComponents/res/values/themes.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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>
-
- <style name="Theme.MediaRouter" parent="android:Theme.Material">
- <item name="android:windowNoTitle">true</item>
- <item name="mediaRouteButtonStyle">@style/Widget.MediaRouter.MediaRouteButton</item>
-
- <item name="mediaRouteCloseDrawable">@drawable/mr_dialog_close_dark</item>
- <item name="mediaRoutePlayDrawable">@drawable/mr_media_play_dark</item>
- <item name="mediaRoutePauseDrawable">@drawable/mr_media_pause_dark</item>
- <item name="mediaRouteStopDrawable">@drawable/mr_media_stop_dark</item>
- <item name="mediaRouteAudioTrackDrawable">@drawable/mr_vol_type_audiotrack_dark</item>
- <item name="mediaRouteDefaultIconDrawable">@drawable/ic_mr_button_disconnected_dark</item>
- <item name="mediaRouteTvIconDrawable">@drawable/ic_vol_type_tv_dark</item>
- <item name="mediaRouteSpeakerIconDrawable">@drawable/ic_vol_type_speaker_dark</item>
- <item name="mediaRouteSpeakerGroupIconDrawable">@drawable/ic_vol_type_speaker_group_dark</item>
-
- <item name="mediaRouteControlPanelThemeOverlay">@null</item>
- </style>
-
- <style name="Theme.MediaRouter.LightControlPanel">
- <item name="mediaRouteControlPanelThemeOverlay">@style/ThemeOverlay.MediaRouter.Light</item>
- </style>
-
- <style name="Theme.MediaRouter.Light" parent="android:Theme.Material.Light">
- <item name="android:windowNoTitle">true</item>
- <item name="mediaRouteButtonStyle">@style/Widget.MediaRouter.Light.MediaRouteButton</item>
-
- <item name="mediaRouteCloseDrawable">@drawable/mr_dialog_close_light</item>
- <item name="mediaRoutePlayDrawable">@drawable/mr_media_play_light</item>
- <item name="mediaRoutePauseDrawable">@drawable/mr_media_pause_light</item>
- <item name="mediaRouteStopDrawable">@drawable/mr_media_stop_light</item>
- <item name="mediaRouteAudioTrackDrawable">@drawable/mr_vol_type_audiotrack_light</item>
- <item name="mediaRouteDefaultIconDrawable">@drawable/ic_mr_button_grey</item>
- <item name="mediaRouteTvIconDrawable">@drawable/ic_vol_type_tv_light</item>
- <item name="mediaRouteSpeakerIconDrawable">@drawable/ic_vol_type_speaker_light</item>
- <item name="mediaRouteSpeakerGroupIconDrawable">@drawable/ic_vol_type_speaker_group_light</item>
-
- <item name="mediaRouteControlPanelThemeOverlay">@null</item>
- </style>
-
- <style name="Theme.MediaRouter.Light.DarkControlPanel">
- <item name="mediaRouteControlPanelThemeOverlay">@style/ThemeOverlay.MediaRouter.Dark</item>
- </style>
-
- <style name="ThemeOverlay.MediaRouter.Dark" parent="android:Theme.Material">
- <item name="mediaRoutePlayDrawable">@drawable/mr_media_play_dark</item>
- <item name="mediaRoutePauseDrawable">@drawable/mr_media_pause_dark</item>
- <item name="mediaRouteStopDrawable">@drawable/mr_media_stop_dark</item>
- <item name="mediaRouteAudioTrackDrawable">@drawable/mr_vol_type_audiotrack_dark</item>
-
- </style>
- <style name="ThemeOverlay.MediaRouter.Light" parent="android:Theme.Material.Light">
- <item name="mediaRoutePlayDrawable">@drawable/mr_media_play_light</item>
- <item name="mediaRoutePauseDrawable">@drawable/mr_media_pause_light</item>
- <item name="mediaRouteStopDrawable">@drawable/mr_media_stop_light</item>
- <item name="mediaRouteAudioTrackDrawable">@drawable/mr_vol_type_audiotrack_light</item>
- </style>
-
-</resources>
diff --git a/packages/MediaComponents/src/com/android/media/RoutePlayer.java b/packages/MediaComponents/src/com/android/media/RoutePlayer.java
deleted file mode 100644
index ebff0e2..0000000
--- a/packages/MediaComponents/src/com/android/media/RoutePlayer.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media;
-
-import android.content.Context;
-import android.media.DataSourceDesc;
-import android.media.session.MediaSession;
-import android.media.session.PlaybackState;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-
-import androidx.annotation.RequiresApi;
-
-import com.android.support.mediarouter.media.MediaItemStatus;
-import com.android.support.mediarouter.media.MediaRouter;
-import com.android.support.mediarouter.media.MediaSessionStatus;
-import com.android.support.mediarouter.media.RemotePlaybackClient;
-import com.android.support.mediarouter.media.RemotePlaybackClient.ItemActionCallback;
-import com.android.support.mediarouter.media.RemotePlaybackClient.SessionActionCallback;
-import com.android.support.mediarouter.media.RemotePlaybackClient.StatusCallback;
-
-@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
-public class RoutePlayer extends MediaSession.Callback {
- public static final long PLAYBACK_ACTIONS = PlaybackState.ACTION_PAUSE
- | PlaybackState.ACTION_PLAY | PlaybackState.ACTION_SEEK_TO
- | PlaybackState.ACTION_FAST_FORWARD | PlaybackState.ACTION_REWIND;
-
- private RemotePlaybackClient mClient;
- private String mSessionId;
- private String mItemId;
- private PlayerEventCallback mCallback;
-
- private StatusCallback mStatusCallback = new StatusCallback() {
- @Override
- public void onItemStatusChanged(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus,
- String itemId, MediaItemStatus itemStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- updateItemStatus(itemId, itemStatus);
- }
- };
-
- public RoutePlayer(Context context, MediaRouter.RouteInfo route) {
- mClient = new RemotePlaybackClient(context, route);
- mClient.setStatusCallback(mStatusCallback);
- mClient.startSession(null, new SessionActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- }
- });
- }
-
- @Override
- public void onPlay() {
- mClient.resume(null, new SessionActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- }
- });
- }
-
- @Override
- public void onPause() {
- mClient.pause(null, new SessionActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- }
- });
- }
-
- @Override
- public void onSeekTo(long pos) {
- mClient.seek(mItemId, pos, null, new ItemActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus,
- String itemId, MediaItemStatus itemStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- updateItemStatus(itemId, itemStatus);
- }
- });
- }
-
- @Override
- public void onStop() {
- mClient.stop(null, new SessionActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- }
- });
- }
-
- public void setPlayerEventCallback(PlayerEventCallback callback) {
- mCallback = callback;
- }
-
- public void openVideo(DataSourceDesc dsd) {
- mClient.play(dsd.getUri(), "video/mp4", null, 0, null, new ItemActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus,
- String itemId, MediaItemStatus itemStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- updateItemStatus(itemId, itemStatus);
- playInternal(dsd.getUri());
- }
- });
- }
-
- public void release() {
- if (mClient != null) {
- mClient.release();
- mClient = null;
- }
- if (mCallback != null) {
- mCallback = null;
- }
- }
-
- private void playInternal(Uri uri) {
- mClient.play(uri, "video/mp4", null, 0, null, new ItemActionCallback() {
- @Override
- public void onResult(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus,
- String itemId, MediaItemStatus itemStatus) {
- updateSessionStatus(sessionId, sessionStatus);
- updateItemStatus(itemId, itemStatus);
- }
- });
- }
-
- private void updateSessionStatus(String sessionId, MediaSessionStatus sessionStatus) {
- mSessionId = sessionId;
- }
-
- private void updateItemStatus(String itemId, MediaItemStatus itemStatus) {
- mItemId = itemId;
- if (itemStatus == null || mCallback == null) return;
- mCallback.onPlayerStateChanged(itemStatus);
- }
-
- public static abstract class PlayerEventCallback {
- public void onPlayerStateChanged(MediaItemStatus itemStatus) { }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/subtitle/ClosedCaptionRenderer.java b/packages/MediaComponents/src/com/android/media/subtitle/ClosedCaptionRenderer.java
deleted file mode 100644
index ff7eec9..0000000
--- a/packages/MediaComponents/src/com/android/media/subtitle/ClosedCaptionRenderer.java
+++ /dev/null
@@ -1,1501 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.media.subtitle;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.media.MediaFormat;
-import android.text.Spannable;
-import android.text.SpannableStringBuilder;
-import android.text.TextPaint;
-import android.text.style.CharacterStyle;
-import android.text.style.StyleSpan;
-import android.text.style.UnderlineSpan;
-import android.text.style.UpdateAppearance;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.accessibility.CaptioningManager;
-import android.view.accessibility.CaptioningManager.CaptionStyle;
-import android.view.accessibility.CaptioningManager.CaptioningChangeListener;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Vector;
-
-// Note: This is forked from android.media.ClosedCaptionRenderer since P
-public class ClosedCaptionRenderer extends SubtitleController.Renderer {
- private final Context mContext;
- private Cea608CCWidget mCCWidget;
-
- public ClosedCaptionRenderer(Context context) {
- mContext = context;
- }
-
- @Override
- public boolean supports(MediaFormat format) {
- if (format.containsKey(MediaFormat.KEY_MIME)) {
- String mimeType = format.getString(MediaFormat.KEY_MIME);
- return MediaFormat.MIMETYPE_TEXT_CEA_608.equals(mimeType);
- }
- return false;
- }
-
- @Override
- public SubtitleTrack createTrack(MediaFormat format) {
- String mimeType = format.getString(MediaFormat.KEY_MIME);
- if (MediaFormat.MIMETYPE_TEXT_CEA_608.equals(mimeType)) {
- if (mCCWidget == null) {
- mCCWidget = new Cea608CCWidget(mContext);
- }
- return new Cea608CaptionTrack(mCCWidget, format);
- }
- throw new RuntimeException("No matching format: " + format.toString());
- }
-}
-
-class Cea608CaptionTrack extends SubtitleTrack {
- private final Cea608CCParser mCCParser;
- private final Cea608CCWidget mRenderingWidget;
-
- Cea608CaptionTrack(Cea608CCWidget renderingWidget, MediaFormat format) {
- super(format);
-
- mRenderingWidget = renderingWidget;
- mCCParser = new Cea608CCParser(mRenderingWidget);
- }
-
- @Override
- public void onData(byte[] data, boolean eos, long runID) {
- mCCParser.parse(data);
- }
-
- @Override
- public RenderingWidget getRenderingWidget() {
- return mRenderingWidget;
- }
-
- @Override
- public void updateView(Vector<Cue> activeCues) {
- // Overriding with NO-OP, CC rendering by-passes this
- }
-}
-
-/**
- * Abstract widget class to render a closed caption track.
- */
-abstract class ClosedCaptionWidget extends ViewGroup implements SubtitleTrack.RenderingWidget {
-
- interface ClosedCaptionLayout {
- void setCaptionStyle(CaptionStyle captionStyle);
- void setFontScale(float scale);
- }
-
- private static final CaptionStyle DEFAULT_CAPTION_STYLE = CaptionStyle.DEFAULT;
-
- /** Captioning manager, used to obtain and track caption properties. */
- private final CaptioningManager mManager;
-
- /** Current caption style. */
- protected CaptionStyle mCaptionStyle;
-
- /** Callback for rendering changes. */
- protected OnChangedListener mListener;
-
- /** Concrete layout of CC. */
- protected ClosedCaptionLayout mClosedCaptionLayout;
-
- /** Whether a caption style change listener is registered. */
- private boolean mHasChangeListener;
-
- public ClosedCaptionWidget(Context context) {
- this(context, null);
- }
-
- public ClosedCaptionWidget(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public ClosedCaptionWidget(Context context, AttributeSet attrs, int defStyle) {
- this(context, attrs, defStyle, 0);
- }
-
- public ClosedCaptionWidget(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
-
- // Cannot render text over video when layer type is hardware.
- setLayerType(View.LAYER_TYPE_SOFTWARE, null);
-
- mManager = (CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE);
- mCaptionStyle = DEFAULT_CAPTION_STYLE.applyStyle(mManager.getUserStyle());
-
- mClosedCaptionLayout = createCaptionLayout(context);
- mClosedCaptionLayout.setCaptionStyle(mCaptionStyle);
- mClosedCaptionLayout.setFontScale(mManager.getFontScale());
- addView((ViewGroup) mClosedCaptionLayout, LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT);
-
- requestLayout();
- }
-
- public abstract ClosedCaptionLayout createCaptionLayout(Context context);
-
- @Override
- public void setOnChangedListener(OnChangedListener listener) {
- mListener = listener;
- }
-
- @Override
- public void setSize(int width, int height) {
- final int widthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
- final int heightSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
-
- measure(widthSpec, heightSpec);
- layout(0, 0, width, height);
- }
-
- @Override
- public void setVisible(boolean visible) {
- if (visible) {
- setVisibility(View.VISIBLE);
- } else {
- setVisibility(View.GONE);
- }
-
- manageChangeListener();
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
-
- manageChangeListener();
- }
-
- @Override
- public void onDetachedFromWindow() {
- super.onDetachedFromWindow();
-
- manageChangeListener();
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- ((ViewGroup) mClosedCaptionLayout).measure(widthMeasureSpec, heightMeasureSpec);
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- ((ViewGroup) mClosedCaptionLayout).layout(l, t, r, b);
- }
-
- /**
- * Manages whether this renderer is listening for caption style changes.
- */
- private final CaptioningChangeListener mCaptioningListener = new CaptioningChangeListener() {
- @Override
- public void onUserStyleChanged(CaptionStyle userStyle) {
- mCaptionStyle = DEFAULT_CAPTION_STYLE.applyStyle(userStyle);
- mClosedCaptionLayout.setCaptionStyle(mCaptionStyle);
- }
-
- @Override
- public void onFontScaleChanged(float fontScale) {
- mClosedCaptionLayout.setFontScale(fontScale);
- }
- };
-
- private void manageChangeListener() {
- final boolean needsListener = isAttachedToWindow() && getVisibility() == View.VISIBLE;
- if (mHasChangeListener != needsListener) {
- mHasChangeListener = needsListener;
-
- if (needsListener) {
- mManager.addCaptioningChangeListener(mCaptioningListener);
- } else {
- mManager.removeCaptioningChangeListener(mCaptioningListener);
- }
- }
- }
-}
-
-/**
- * CCParser processes CEA-608 closed caption data.
- *
- * It calls back into OnDisplayChangedListener upon
- * display change with styled text for rendering.
- *
- */
-class Cea608CCParser {
- public static final int MAX_ROWS = 15;
- public static final int MAX_COLS = 32;
-
- private static final String TAG = "Cea608CCParser";
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- private static final int INVALID = -1;
-
- // EIA-CEA-608: Table 70 - Control Codes
- private static final int RCL = 0x20;
- private static final int BS = 0x21;
- private static final int AOF = 0x22;
- private static final int AON = 0x23;
- private static final int DER = 0x24;
- private static final int RU2 = 0x25;
- private static final int RU3 = 0x26;
- private static final int RU4 = 0x27;
- private static final int FON = 0x28;
- private static final int RDC = 0x29;
- private static final int TR = 0x2a;
- private static final int RTD = 0x2b;
- private static final int EDM = 0x2c;
- private static final int CR = 0x2d;
- private static final int ENM = 0x2e;
- private static final int EOC = 0x2f;
-
- // Transparent Space
- private static final char TS = '\u00A0';
-
- // Captioning Modes
- private static final int MODE_UNKNOWN = 0;
- private static final int MODE_PAINT_ON = 1;
- private static final int MODE_ROLL_UP = 2;
- private static final int MODE_POP_ON = 3;
- private static final int MODE_TEXT = 4;
-
- private final DisplayListener mListener;
-
- private int mMode = MODE_PAINT_ON;
- private int mRollUpSize = 4;
- private int mPrevCtrlCode = INVALID;
-
- private CCMemory mDisplay = new CCMemory();
- private CCMemory mNonDisplay = new CCMemory();
- private CCMemory mTextMem = new CCMemory();
-
- Cea608CCParser(DisplayListener listener) {
- mListener = listener;
- }
-
- public void parse(byte[] data) {
- CCData[] ccData = CCData.fromByteArray(data);
-
- for (int i = 0; i < ccData.length; i++) {
- if (DEBUG) {
- Log.d(TAG, ccData[i].toString());
- }
-
- if (handleCtrlCode(ccData[i])
- || handleTabOffsets(ccData[i])
- || handlePACCode(ccData[i])
- || handleMidRowCode(ccData[i])) {
- continue;
- }
-
- handleDisplayableChars(ccData[i]);
- }
- }
-
- interface DisplayListener {
- void onDisplayChanged(SpannableStringBuilder[] styledTexts);
- CaptionStyle getCaptionStyle();
- }
-
- private CCMemory getMemory() {
- // get the CC memory to operate on for current mode
- switch (mMode) {
- case MODE_POP_ON:
- return mNonDisplay;
- case MODE_TEXT:
- // TODO(chz): support only caption mode for now,
- // in text mode, dump everything to text mem.
- return mTextMem;
- case MODE_PAINT_ON:
- case MODE_ROLL_UP:
- return mDisplay;
- default:
- Log.w(TAG, "unrecoginized mode: " + mMode);
- }
- return mDisplay;
- }
-
- private boolean handleDisplayableChars(CCData ccData) {
- if (!ccData.isDisplayableChar()) {
- return false;
- }
-
- // Extended char includes 1 automatic backspace
- if (ccData.isExtendedChar()) {
- getMemory().bs();
- }
-
- getMemory().writeText(ccData.getDisplayText());
-
- if (mMode == MODE_PAINT_ON || mMode == MODE_ROLL_UP) {
- updateDisplay();
- }
-
- return true;
- }
-
- private boolean handleMidRowCode(CCData ccData) {
- StyleCode m = ccData.getMidRow();
- if (m != null) {
- getMemory().writeMidRowCode(m);
- return true;
- }
- return false;
- }
-
- private boolean handlePACCode(CCData ccData) {
- PAC pac = ccData.getPAC();
-
- if (pac != null) {
- if (mMode == MODE_ROLL_UP) {
- getMemory().moveBaselineTo(pac.getRow(), mRollUpSize);
- }
- getMemory().writePAC(pac);
- return true;
- }
-
- return false;
- }
-
- private boolean handleTabOffsets(CCData ccData) {
- int tabs = ccData.getTabOffset();
-
- if (tabs > 0) {
- getMemory().tab(tabs);
- return true;
- }
-
- return false;
- }
-
- private boolean handleCtrlCode(CCData ccData) {
- int ctrlCode = ccData.getCtrlCode();
-
- if (mPrevCtrlCode != INVALID && mPrevCtrlCode == ctrlCode) {
- // discard double ctrl codes (but if there's a 3rd one, we still take that)
- mPrevCtrlCode = INVALID;
- return true;
- }
-
- switch(ctrlCode) {
- case RCL:
- // select pop-on style
- mMode = MODE_POP_ON;
- break;
- case BS:
- getMemory().bs();
- break;
- case DER:
- getMemory().der();
- break;
- case RU2:
- case RU3:
- case RU4:
- mRollUpSize = (ctrlCode - 0x23);
- // erase memory if currently in other style
- if (mMode != MODE_ROLL_UP) {
- mDisplay.erase();
- mNonDisplay.erase();
- }
- // select roll-up style
- mMode = MODE_ROLL_UP;
- break;
- case FON:
- Log.i(TAG, "Flash On");
- break;
- case RDC:
- // select paint-on style
- mMode = MODE_PAINT_ON;
- break;
- case TR:
- mMode = MODE_TEXT;
- mTextMem.erase();
- break;
- case RTD:
- mMode = MODE_TEXT;
- break;
- case EDM:
- // erase display memory
- mDisplay.erase();
- updateDisplay();
- break;
- case CR:
- if (mMode == MODE_ROLL_UP) {
- getMemory().rollUp(mRollUpSize);
- } else {
- getMemory().cr();
- }
- if (mMode == MODE_ROLL_UP) {
- updateDisplay();
- }
- break;
- case ENM:
- // erase non-display memory
- mNonDisplay.erase();
- break;
- case EOC:
- // swap display/non-display memory
- swapMemory();
- // switch to pop-on style
- mMode = MODE_POP_ON;
- updateDisplay();
- break;
- case INVALID:
- default:
- mPrevCtrlCode = INVALID;
- return false;
- }
-
- mPrevCtrlCode = ctrlCode;
-
- // handled
- return true;
- }
-
- private void updateDisplay() {
- if (mListener != null) {
- CaptionStyle captionStyle = mListener.getCaptionStyle();
- mListener.onDisplayChanged(mDisplay.getStyledText(captionStyle));
- }
- }
-
- private void swapMemory() {
- CCMemory temp = mDisplay;
- mDisplay = mNonDisplay;
- mNonDisplay = temp;
- }
-
- private static class StyleCode {
- static final int COLOR_WHITE = 0;
- static final int COLOR_GREEN = 1;
- static final int COLOR_BLUE = 2;
- static final int COLOR_CYAN = 3;
- static final int COLOR_RED = 4;
- static final int COLOR_YELLOW = 5;
- static final int COLOR_MAGENTA = 6;
- static final int COLOR_INVALID = 7;
-
- static final int STYLE_ITALICS = 0x00000001;
- static final int STYLE_UNDERLINE = 0x00000002;
-
- static final String[] mColorMap = {
- "WHITE", "GREEN", "BLUE", "CYAN", "RED", "YELLOW", "MAGENTA", "INVALID"
- };
-
- final int mStyle;
- final int mColor;
-
- static StyleCode fromByte(byte data2) {
- int style = 0;
- int color = (data2 >> 1) & 0x7;
-
- if ((data2 & 0x1) != 0) {
- style |= STYLE_UNDERLINE;
- }
-
- if (color == COLOR_INVALID) {
- // WHITE ITALICS
- color = COLOR_WHITE;
- style |= STYLE_ITALICS;
- }
-
- return new StyleCode(style, color);
- }
-
- StyleCode(int style, int color) {
- mStyle = style;
- mColor = color;
- }
-
- boolean isItalics() {
- return (mStyle & STYLE_ITALICS) != 0;
- }
-
- boolean isUnderline() {
- return (mStyle & STYLE_UNDERLINE) != 0;
- }
-
- int getColor() {
- return mColor;
- }
-
- @Override
- public String toString() {
- StringBuilder str = new StringBuilder();
- str.append("{");
- str.append(mColorMap[mColor]);
- if ((mStyle & STYLE_ITALICS) != 0) {
- str.append(", ITALICS");
- }
- if ((mStyle & STYLE_UNDERLINE) != 0) {
- str.append(", UNDERLINE");
- }
- str.append("}");
-
- return str.toString();
- }
- }
-
- private static class PAC extends StyleCode {
- final int mRow;
- final int mCol;
-
- static PAC fromBytes(byte data1, byte data2) {
- int[] rowTable = {11, 1, 3, 12, 14, 5, 7, 9};
- int row = rowTable[data1 & 0x07] + ((data2 & 0x20) >> 5);
- int style = 0;
- if ((data2 & 1) != 0) {
- style |= STYLE_UNDERLINE;
- }
- if ((data2 & 0x10) != 0) {
- // indent code
- int indent = (data2 >> 1) & 0x7;
- return new PAC(row, indent * 4, style, COLOR_WHITE);
- } else {
- // style code
- int color = (data2 >> 1) & 0x7;
-
- if (color == COLOR_INVALID) {
- // WHITE ITALICS
- color = COLOR_WHITE;
- style |= STYLE_ITALICS;
- }
- return new PAC(row, -1, style, color);
- }
- }
-
- PAC(int row, int col, int style, int color) {
- super(style, color);
- mRow = row;
- mCol = col;
- }
-
- boolean isIndentPAC() {
- return (mCol >= 0);
- }
-
- int getRow() {
- return mRow;
- }
-
- int getCol() {
- return mCol;
- }
-
- @Override
- public String toString() {
- return String.format("{%d, %d}, %s",
- mRow, mCol, super.toString());
- }
- }
-
- /**
- * Mutable version of BackgroundSpan to facilitate text rendering with edge styles.
- */
- public static class MutableBackgroundColorSpan extends CharacterStyle
- implements UpdateAppearance {
- private int mColor;
-
- public MutableBackgroundColorSpan(int color) {
- mColor = color;
- }
-
- public void setBackgroundColor(int color) {
- mColor = color;
- }
-
- public int getBackgroundColor() {
- return mColor;
- }
-
- @Override
- public void updateDrawState(TextPaint ds) {
- ds.bgColor = mColor;
- }
- }
-
- /* CCLineBuilder keeps track of displayable chars, as well as
- * MidRow styles and PACs, for a single line of CC memory.
- *
- * It generates styled text via getStyledText() method.
- */
- private static class CCLineBuilder {
- private final StringBuilder mDisplayChars;
- private final StyleCode[] mMidRowStyles;
- private final StyleCode[] mPACStyles;
-
- CCLineBuilder(String str) {
- mDisplayChars = new StringBuilder(str);
- mMidRowStyles = new StyleCode[mDisplayChars.length()];
- mPACStyles = new StyleCode[mDisplayChars.length()];
- }
-
- void setCharAt(int index, char ch) {
- mDisplayChars.setCharAt(index, ch);
- mMidRowStyles[index] = null;
- }
-
- void setMidRowAt(int index, StyleCode m) {
- mDisplayChars.setCharAt(index, ' ');
- mMidRowStyles[index] = m;
- }
-
- void setPACAt(int index, PAC pac) {
- mPACStyles[index] = pac;
- }
-
- char charAt(int index) {
- return mDisplayChars.charAt(index);
- }
-
- int length() {
- return mDisplayChars.length();
- }
-
- void applyStyleSpan(
- SpannableStringBuilder styledText,
- StyleCode s, int start, int end) {
- if (s.isItalics()) {
- styledText.setSpan(
- new StyleSpan(android.graphics.Typeface.ITALIC),
- start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- if (s.isUnderline()) {
- styledText.setSpan(
- new UnderlineSpan(),
- start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- }
-
- SpannableStringBuilder getStyledText(CaptionStyle captionStyle) {
- SpannableStringBuilder styledText = new SpannableStringBuilder(mDisplayChars);
- int start = -1, next = 0;
- int styleStart = -1;
- StyleCode curStyle = null;
- while (next < mDisplayChars.length()) {
- StyleCode newStyle = null;
- if (mMidRowStyles[next] != null) {
- // apply mid-row style change
- newStyle = mMidRowStyles[next];
- } else if (mPACStyles[next] != null
- && (styleStart < 0 || start < 0)) {
- // apply PAC style change, only if:
- // 1. no style set, or
- // 2. style set, but prev char is none-displayable
- newStyle = mPACStyles[next];
- }
- if (newStyle != null) {
- curStyle = newStyle;
- if (styleStart >= 0 && start >= 0) {
- applyStyleSpan(styledText, newStyle, styleStart, next);
- }
- styleStart = next;
- }
-
- if (mDisplayChars.charAt(next) != TS) {
- if (start < 0) {
- start = next;
- }
- } else if (start >= 0) {
- int expandedStart = mDisplayChars.charAt(start) == ' ' ? start : start - 1;
- int expandedEnd = mDisplayChars.charAt(next - 1) == ' ' ? next : next + 1;
- styledText.setSpan(
- new MutableBackgroundColorSpan(captionStyle.backgroundColor),
- expandedStart, expandedEnd,
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- if (styleStart >= 0) {
- applyStyleSpan(styledText, curStyle, styleStart, expandedEnd);
- }
- start = -1;
- }
- next++;
- }
-
- return styledText;
- }
- }
-
- /*
- * CCMemory models a console-style display.
- */
- private static class CCMemory {
- private final String mBlankLine;
- private final CCLineBuilder[] mLines = new CCLineBuilder[MAX_ROWS + 2];
- private int mRow;
- private int mCol;
-
- CCMemory() {
- char[] blank = new char[MAX_COLS + 2];
- Arrays.fill(blank, TS);
- mBlankLine = new String(blank);
- }
-
- void erase() {
- // erase all lines
- for (int i = 0; i < mLines.length; i++) {
- mLines[i] = null;
- }
- mRow = MAX_ROWS;
- mCol = 1;
- }
-
- void der() {
- if (mLines[mRow] != null) {
- for (int i = 0; i < mCol; i++) {
- if (mLines[mRow].charAt(i) != TS) {
- for (int j = mCol; j < mLines[mRow].length(); j++) {
- mLines[j].setCharAt(j, TS);
- }
- return;
- }
- }
- mLines[mRow] = null;
- }
- }
-
- void tab(int tabs) {
- moveCursorByCol(tabs);
- }
-
- void bs() {
- moveCursorByCol(-1);
- if (mLines[mRow] != null) {
- mLines[mRow].setCharAt(mCol, TS);
- if (mCol == MAX_COLS - 1) {
- // Spec recommendation:
- // if cursor was at col 32, move cursor
- // back to col 31 and erase both col 31&32
- mLines[mRow].setCharAt(MAX_COLS, TS);
- }
- }
- }
-
- void cr() {
- moveCursorTo(mRow + 1, 1);
- }
-
- void rollUp(int windowSize) {
- int i;
- for (i = 0; i <= mRow - windowSize; i++) {
- mLines[i] = null;
- }
- int startRow = mRow - windowSize + 1;
- if (startRow < 1) {
- startRow = 1;
- }
- for (i = startRow; i < mRow; i++) {
- mLines[i] = mLines[i + 1];
- }
- for (i = mRow; i < mLines.length; i++) {
- // clear base row
- mLines[i] = null;
- }
- // default to col 1, in case PAC is not sent
- mCol = 1;
- }
-
- void writeText(String text) {
- for (int i = 0; i < text.length(); i++) {
- getLineBuffer(mRow).setCharAt(mCol, text.charAt(i));
- moveCursorByCol(1);
- }
- }
-
- void writeMidRowCode(StyleCode m) {
- getLineBuffer(mRow).setMidRowAt(mCol, m);
- moveCursorByCol(1);
- }
-
- void writePAC(PAC pac) {
- if (pac.isIndentPAC()) {
- moveCursorTo(pac.getRow(), pac.getCol());
- } else {
- moveCursorTo(pac.getRow(), 1);
- }
- getLineBuffer(mRow).setPACAt(mCol, pac);
- }
-
- SpannableStringBuilder[] getStyledText(CaptionStyle captionStyle) {
- ArrayList<SpannableStringBuilder> rows = new ArrayList<>(MAX_ROWS);
- for (int i = 1; i <= MAX_ROWS; i++) {
- rows.add(mLines[i] != null ?
- mLines[i].getStyledText(captionStyle) : null);
- }
- return rows.toArray(new SpannableStringBuilder[MAX_ROWS]);
- }
-
- private static int clamp(int x, int min, int max) {
- return x < min ? min : (x > max ? max : x);
- }
-
- private void moveCursorTo(int row, int col) {
- mRow = clamp(row, 1, MAX_ROWS);
- mCol = clamp(col, 1, MAX_COLS);
- }
-
- private void moveCursorToRow(int row) {
- mRow = clamp(row, 1, MAX_ROWS);
- }
-
- private void moveCursorByCol(int col) {
- mCol = clamp(mCol + col, 1, MAX_COLS);
- }
-
- private void moveBaselineTo(int baseRow, int windowSize) {
- if (mRow == baseRow) {
- return;
- }
- int actualWindowSize = windowSize;
- if (baseRow < actualWindowSize) {
- actualWindowSize = baseRow;
- }
- if (mRow < actualWindowSize) {
- actualWindowSize = mRow;
- }
-
- int i;
- if (baseRow < mRow) {
- // copy from bottom to top row
- for (i = actualWindowSize - 1; i >= 0; i--) {
- mLines[baseRow - i] = mLines[mRow - i];
- }
- } else {
- // copy from top to bottom row
- for (i = 0; i < actualWindowSize; i++) {
- mLines[baseRow - i] = mLines[mRow - i];
- }
- }
- // clear rest of the rows
- for (i = 0; i <= baseRow - windowSize; i++) {
- mLines[i] = null;
- }
- for (i = baseRow + 1; i < mLines.length; i++) {
- mLines[i] = null;
- }
- }
-
- private CCLineBuilder getLineBuffer(int row) {
- if (mLines[row] == null) {
- mLines[row] = new CCLineBuilder(mBlankLine);
- }
- return mLines[row];
- }
- }
-
- /*
- * CCData parses the raw CC byte pair into displayable chars,
- * misc control codes, Mid-Row or Preamble Address Codes.
- */
- private static class CCData {
- private final byte mType;
- private final byte mData1;
- private final byte mData2;
-
- private static final String[] mCtrlCodeMap = {
- "RCL", "BS" , "AOF", "AON",
- "DER", "RU2", "RU3", "RU4",
- "FON", "RDC", "TR" , "RTD",
- "EDM", "CR" , "ENM", "EOC",
- };
-
- private static final String[] mSpecialCharMap = {
- "\u00AE",
- "\u00B0",
- "\u00BD",
- "\u00BF",
- "\u2122",
- "\u00A2",
- "\u00A3",
- "\u266A", // Eighth note
- "\u00E0",
- "\u00A0", // Transparent space
- "\u00E8",
- "\u00E2",
- "\u00EA",
- "\u00EE",
- "\u00F4",
- "\u00FB",
- };
-
- private static final String[] mSpanishCharMap = {
- // Spanish and misc chars
- "\u00C1", // A
- "\u00C9", // E
- "\u00D3", // I
- "\u00DA", // O
- "\u00DC", // U
- "\u00FC", // u
- "\u2018", // opening single quote
- "\u00A1", // inverted exclamation mark
- "*",
- "'",
- "\u2014", // em dash
- "\u00A9", // Copyright
- "\u2120", // Servicemark
- "\u2022", // round bullet
- "\u201C", // opening double quote
- "\u201D", // closing double quote
- // French
- "\u00C0",
- "\u00C2",
- "\u00C7",
- "\u00C8",
- "\u00CA",
- "\u00CB",
- "\u00EB",
- "\u00CE",
- "\u00CF",
- "\u00EF",
- "\u00D4",
- "\u00D9",
- "\u00F9",
- "\u00DB",
- "\u00AB",
- "\u00BB"
- };
-
- private static final String[] mProtugueseCharMap = {
- // Portuguese
- "\u00C3",
- "\u00E3",
- "\u00CD",
- "\u00CC",
- "\u00EC",
- "\u00D2",
- "\u00F2",
- "\u00D5",
- "\u00F5",
- "{",
- "}",
- "\\",
- "^",
- "_",
- "|",
- "~",
- // German and misc chars
- "\u00C4",
- "\u00E4",
- "\u00D6",
- "\u00F6",
- "\u00DF",
- "\u00A5",
- "\u00A4",
- "\u2502", // vertical bar
- "\u00C5",
- "\u00E5",
- "\u00D8",
- "\u00F8",
- "\u250C", // top-left corner
- "\u2510", // top-right corner
- "\u2514", // lower-left corner
- "\u2518", // lower-right corner
- };
-
- static CCData[] fromByteArray(byte[] data) {
- CCData[] ccData = new CCData[data.length / 3];
-
- for (int i = 0; i < ccData.length; i++) {
- ccData[i] = new CCData(
- data[i * 3],
- data[i * 3 + 1],
- data[i * 3 + 2]);
- }
-
- return ccData;
- }
-
- CCData(byte type, byte data1, byte data2) {
- mType = type;
- mData1 = data1;
- mData2 = data2;
- }
-
- int getCtrlCode() {
- if ((mData1 == 0x14 || mData1 == 0x1c)
- && mData2 >= 0x20 && mData2 <= 0x2f) {
- return mData2;
- }
- return INVALID;
- }
-
- StyleCode getMidRow() {
- // only support standard Mid-row codes, ignore
- // optional background/foreground mid-row codes
- if ((mData1 == 0x11 || mData1 == 0x19)
- && mData2 >= 0x20 && mData2 <= 0x2f) {
- return StyleCode.fromByte(mData2);
- }
- return null;
- }
-
- PAC getPAC() {
- if ((mData1 & 0x70) == 0x10
- && (mData2 & 0x40) == 0x40
- && ((mData1 & 0x07) != 0 || (mData2 & 0x20) == 0)) {
- return PAC.fromBytes(mData1, mData2);
- }
- return null;
- }
-
- int getTabOffset() {
- if ((mData1 == 0x17 || mData1 == 0x1f)
- && mData2 >= 0x21 && mData2 <= 0x23) {
- return mData2 & 0x3;
- }
- return 0;
- }
-
- boolean isDisplayableChar() {
- return isBasicChar() || isSpecialChar() || isExtendedChar();
- }
-
- String getDisplayText() {
- String str = getBasicChars();
-
- if (str == null) {
- str = getSpecialChar();
-
- if (str == null) {
- str = getExtendedChar();
- }
- }
-
- return str;
- }
-
- private String ctrlCodeToString(int ctrlCode) {
- return mCtrlCodeMap[ctrlCode - 0x20];
- }
-
- private boolean isBasicChar() {
- return mData1 >= 0x20 && mData1 <= 0x7f;
- }
-
- private boolean isSpecialChar() {
- return ((mData1 == 0x11 || mData1 == 0x19)
- && mData2 >= 0x30 && mData2 <= 0x3f);
- }
-
- private boolean isExtendedChar() {
- return ((mData1 == 0x12 || mData1 == 0x1A
- || mData1 == 0x13 || mData1 == 0x1B)
- && mData2 >= 0x20 && mData2 <= 0x3f);
- }
-
- private char getBasicChar(byte data) {
- char c;
- // replace the non-ASCII ones
- switch (data) {
- case 0x2A: c = '\u00E1'; break;
- case 0x5C: c = '\u00E9'; break;
- case 0x5E: c = '\u00ED'; break;
- case 0x5F: c = '\u00F3'; break;
- case 0x60: c = '\u00FA'; break;
- case 0x7B: c = '\u00E7'; break;
- case 0x7C: c = '\u00F7'; break;
- case 0x7D: c = '\u00D1'; break;
- case 0x7E: c = '\u00F1'; break;
- case 0x7F: c = '\u2588'; break; // Full block
- default: c = (char) data; break;
- }
- return c;
- }
-
- private String getBasicChars() {
- if (mData1 >= 0x20 && mData1 <= 0x7f) {
- StringBuilder builder = new StringBuilder(2);
- builder.append(getBasicChar(mData1));
- if (mData2 >= 0x20 && mData2 <= 0x7f) {
- builder.append(getBasicChar(mData2));
- }
- return builder.toString();
- }
-
- return null;
- }
-
- private String getSpecialChar() {
- if ((mData1 == 0x11 || mData1 == 0x19)
- && mData2 >= 0x30 && mData2 <= 0x3f) {
- return mSpecialCharMap[mData2 - 0x30];
- }
-
- return null;
- }
-
- private String getExtendedChar() {
- if ((mData1 == 0x12 || mData1 == 0x1A)
- && mData2 >= 0x20 && mData2 <= 0x3f){
- // 1 Spanish/French char
- return mSpanishCharMap[mData2 - 0x20];
- } else if ((mData1 == 0x13 || mData1 == 0x1B)
- && mData2 >= 0x20 && mData2 <= 0x3f){
- // 1 Portuguese/German/Danish char
- return mProtugueseCharMap[mData2 - 0x20];
- }
-
- return null;
- }
-
- @Override
- public String toString() {
- String str;
-
- if (mData1 < 0x10 && mData2 < 0x10) {
- // Null Pad, ignore
- return String.format("[%d]Null: %02x %02x", mType, mData1, mData2);
- }
-
- int ctrlCode = getCtrlCode();
- if (ctrlCode != INVALID) {
- return String.format("[%d]%s", mType, ctrlCodeToString(ctrlCode));
- }
-
- int tabOffset = getTabOffset();
- if (tabOffset > 0) {
- return String.format("[%d]Tab%d", mType, tabOffset);
- }
-
- PAC pac = getPAC();
- if (pac != null) {
- return String.format("[%d]PAC: %s", mType, pac.toString());
- }
-
- StyleCode m = getMidRow();
- if (m != null) {
- return String.format("[%d]Mid-row: %s", mType, m.toString());
- }
-
- if (isDisplayableChar()) {
- return String.format("[%d]Displayable: %s (%02x %02x)",
- mType, getDisplayText(), mData1, mData2);
- }
-
- return String.format("[%d]Invalid: %02x %02x", mType, mData1, mData2);
- }
- }
-}
-
-/**
- * Widget capable of rendering CEA-608 closed captions.
- */
-class Cea608CCWidget extends ClosedCaptionWidget implements Cea608CCParser.DisplayListener {
- private static final Rect mTextBounds = new Rect();
- private static final String mDummyText = "1234567890123456789012345678901234";
-
- public Cea608CCWidget(Context context) {
- this(context, null);
- }
-
- public Cea608CCWidget(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public Cea608CCWidget(Context context, AttributeSet attrs, int defStyle) {
- this(context, attrs, defStyle, 0);
- }
-
- public Cea608CCWidget(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- @Override
- public ClosedCaptionLayout createCaptionLayout(Context context) {
- return new CCLayout(context);
- }
-
- @Override
- public void onDisplayChanged(SpannableStringBuilder[] styledTexts) {
- ((CCLayout) mClosedCaptionLayout).update(styledTexts);
-
- if (mListener != null) {
- mListener.onChanged(this);
- }
- }
-
- @Override
- public CaptionStyle getCaptionStyle() {
- return mCaptionStyle;
- }
-
- private static class CCLineBox extends TextView {
- private static final float FONT_PADDING_RATIO = 0.75f;
- private static final float EDGE_OUTLINE_RATIO = 0.1f;
- private static final float EDGE_SHADOW_RATIO = 0.05f;
- private float mOutlineWidth;
- private float mShadowRadius;
- private float mShadowOffset;
-
- private int mTextColor = Color.WHITE;
- private int mBgColor = Color.BLACK;
- private int mEdgeType = CaptionStyle.EDGE_TYPE_NONE;
- private int mEdgeColor = Color.TRANSPARENT;
-
- CCLineBox(Context context) {
- super(context);
- setGravity(Gravity.CENTER);
- setBackgroundColor(Color.TRANSPARENT);
- setTextColor(Color.WHITE);
- setTypeface(Typeface.MONOSPACE);
- setVisibility(View.INVISIBLE);
-
- final Resources res = getContext().getResources();
-
- // get the default (will be updated later during measure)
- mOutlineWidth = res.getDimensionPixelSize(
- com.android.internal.R.dimen.subtitle_outline_width);
- mShadowRadius = res.getDimensionPixelSize(
- com.android.internal.R.dimen.subtitle_shadow_radius);
- mShadowOffset = res.getDimensionPixelSize(
- com.android.internal.R.dimen.subtitle_shadow_offset);
- }
-
- void setCaptionStyle(CaptionStyle captionStyle) {
- mTextColor = captionStyle.foregroundColor;
- mBgColor = captionStyle.backgroundColor;
- mEdgeType = captionStyle.edgeType;
- mEdgeColor = captionStyle.edgeColor;
-
- setTextColor(mTextColor);
- if (mEdgeType == CaptionStyle.EDGE_TYPE_DROP_SHADOW) {
- setShadowLayer(mShadowRadius, mShadowOffset, mShadowOffset, mEdgeColor);
- } else {
- setShadowLayer(0, 0, 0, 0);
- }
- invalidate();
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- float fontSize = MeasureSpec.getSize(heightMeasureSpec) * FONT_PADDING_RATIO;
- setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize);
-
- mOutlineWidth = EDGE_OUTLINE_RATIO * fontSize + 1.0f;
- mShadowRadius = EDGE_SHADOW_RATIO * fontSize + 1.0f;;
- mShadowOffset = mShadowRadius;
-
- // set font scale in the X direction to match the required width
- setScaleX(1.0f);
- getPaint().getTextBounds(mDummyText, 0, mDummyText.length(), mTextBounds);
- float actualTextWidth = mTextBounds.width();
- float requiredTextWidth = MeasureSpec.getSize(widthMeasureSpec);
- setScaleX(requiredTextWidth / actualTextWidth);
-
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- }
-
- @Override
- protected void onDraw(Canvas c) {
- if (mEdgeType == CaptionStyle.EDGE_TYPE_UNSPECIFIED
- || mEdgeType == CaptionStyle.EDGE_TYPE_NONE
- || mEdgeType == CaptionStyle.EDGE_TYPE_DROP_SHADOW) {
- // these edge styles don't require a second pass
- super.onDraw(c);
- return;
- }
-
- if (mEdgeType == CaptionStyle.EDGE_TYPE_OUTLINE) {
- drawEdgeOutline(c);
- } else {
- // Raised or depressed
- drawEdgeRaisedOrDepressed(c);
- }
- }
-
- private void drawEdgeOutline(Canvas c) {
- TextPaint textPaint = getPaint();
-
- Paint.Style previousStyle = textPaint.getStyle();
- Paint.Join previousJoin = textPaint.getStrokeJoin();
- float previousWidth = textPaint.getStrokeWidth();
-
- setTextColor(mEdgeColor);
- textPaint.setStyle(Paint.Style.FILL_AND_STROKE);
- textPaint.setStrokeJoin(Paint.Join.ROUND);
- textPaint.setStrokeWidth(mOutlineWidth);
-
- // Draw outline and background only.
- super.onDraw(c);
-
- // Restore original settings.
- setTextColor(mTextColor);
- textPaint.setStyle(previousStyle);
- textPaint.setStrokeJoin(previousJoin);
- textPaint.setStrokeWidth(previousWidth);
-
- // Remove the background.
- setBackgroundSpans(Color.TRANSPARENT);
- // Draw foreground only.
- super.onDraw(c);
- // Restore the background.
- setBackgroundSpans(mBgColor);
- }
-
- private void drawEdgeRaisedOrDepressed(Canvas c) {
- TextPaint textPaint = getPaint();
-
- Paint.Style previousStyle = textPaint.getStyle();
- textPaint.setStyle(Paint.Style.FILL);
-
- final boolean raised = mEdgeType == CaptionStyle.EDGE_TYPE_RAISED;
- final int colorUp = raised ? Color.WHITE : mEdgeColor;
- final int colorDown = raised ? mEdgeColor : Color.WHITE;
- final float offset = mShadowRadius / 2f;
-
- // Draw background and text with shadow up
- setShadowLayer(mShadowRadius, -offset, -offset, colorUp);
- super.onDraw(c);
-
- // Remove the background.
- setBackgroundSpans(Color.TRANSPARENT);
-
- // Draw text with shadow down
- setShadowLayer(mShadowRadius, +offset, +offset, colorDown);
- super.onDraw(c);
-
- // Restore settings
- textPaint.setStyle(previousStyle);
-
- // Restore the background.
- setBackgroundSpans(mBgColor);
- }
-
- private void setBackgroundSpans(int color) {
- CharSequence text = getText();
- if (text instanceof Spannable) {
- Spannable spannable = (Spannable) text;
- Cea608CCParser.MutableBackgroundColorSpan[] bgSpans = spannable.getSpans(
- 0, spannable.length(), Cea608CCParser.MutableBackgroundColorSpan.class);
- for (int i = 0; i < bgSpans.length; i++) {
- bgSpans[i].setBackgroundColor(color);
- }
- }
- }
- }
-
- private static class CCLayout extends LinearLayout implements ClosedCaptionLayout {
- private static final int MAX_ROWS = Cea608CCParser.MAX_ROWS;
- private static final float SAFE_AREA_RATIO = 0.9f;
-
- private final CCLineBox[] mLineBoxes = new CCLineBox[MAX_ROWS];
-
- CCLayout(Context context) {
- super(context);
- setGravity(Gravity.START);
- setOrientation(LinearLayout.VERTICAL);
- for (int i = 0; i < MAX_ROWS; i++) {
- mLineBoxes[i] = new CCLineBox(getContext());
- addView(mLineBoxes[i], LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
- }
- }
-
- @Override
- public void setCaptionStyle(CaptionStyle captionStyle) {
- for (int i = 0; i < MAX_ROWS; i++) {
- mLineBoxes[i].setCaptionStyle(captionStyle);
- }
- }
-
- @Override
- public void setFontScale(float fontScale) {
- // Ignores the font scale changes of the system wide CC preference.
- }
-
- void update(SpannableStringBuilder[] textBuffer) {
- for (int i = 0; i < MAX_ROWS; i++) {
- if (textBuffer[i] != null) {
- mLineBoxes[i].setText(textBuffer[i], TextView.BufferType.SPANNABLE);
- mLineBoxes[i].setVisibility(View.VISIBLE);
- } else {
- mLineBoxes[i].setVisibility(View.INVISIBLE);
- }
- }
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
- int safeWidth = getMeasuredWidth();
- int safeHeight = getMeasuredHeight();
-
- // CEA-608 assumes 4:3 video
- if (safeWidth * 3 >= safeHeight * 4) {
- safeWidth = safeHeight * 4 / 3;
- } else {
- safeHeight = safeWidth * 3 / 4;
- }
- safeWidth *= SAFE_AREA_RATIO;
- safeHeight *= SAFE_AREA_RATIO;
-
- int lineHeight = safeHeight / MAX_ROWS;
- int lineHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
- lineHeight, MeasureSpec.EXACTLY);
- int lineWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
- safeWidth, MeasureSpec.EXACTLY);
-
- for (int i = 0; i < MAX_ROWS; i++) {
- mLineBoxes[i].measure(lineWidthMeasureSpec, lineHeightMeasureSpec);
- }
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- // safe caption area
- int viewPortWidth = r - l;
- int viewPortHeight = b - t;
- int safeWidth, safeHeight;
- // CEA-608 assumes 4:3 video
- if (viewPortWidth * 3 >= viewPortHeight * 4) {
- safeWidth = viewPortHeight * 4 / 3;
- safeHeight = viewPortHeight;
- } else {
- safeWidth = viewPortWidth;
- safeHeight = viewPortWidth * 3 / 4;
- }
- safeWidth *= SAFE_AREA_RATIO;
- safeHeight *= SAFE_AREA_RATIO;
- int left = (viewPortWidth - safeWidth) / 2;
- int top = (viewPortHeight - safeHeight) / 2;
-
- for (int i = 0; i < MAX_ROWS; i++) {
- mLineBoxes[i].layout(
- left,
- top + safeHeight * i / MAX_ROWS,
- left + safeWidth,
- top + safeHeight * (i + 1) / MAX_ROWS);
- }
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/media/update/ApiFactory.java b/packages/MediaComponents/src/com/android/media/update/ApiFactory.java
index f75b75e..b8d4908 100644
--- a/packages/MediaComponents/src/com/android/media/update/ApiFactory.java
+++ b/packages/MediaComponents/src/com/android/media/update/ApiFactory.java
@@ -41,7 +41,6 @@
import android.media.SessionToken2;
import android.media.VolumeProvider2;
import android.media.update.MediaBrowser2Provider;
-import android.media.update.MediaControlView2Provider;
import android.media.update.MediaController2Provider;
import android.media.update.MediaItem2Provider;
import android.media.update.MediaLibraryService2Provider.LibraryRootProvider;
@@ -54,16 +53,9 @@
import android.media.update.MediaSessionService2Provider.MediaNotificationProvider;
import android.media.update.SessionToken2Provider;
import android.media.update.StaticProvider;
-import android.media.update.VideoView2Provider;
-import android.media.update.ViewGroupProvider;
import android.media.update.VolumeProvider2Provider;
import android.os.Bundle;
import android.os.IInterface;
-import android.util.AttributeSet;
-import android.widget.MediaControlView2;
-import android.widget.VideoView2;
-
-import androidx.annotation.Nullable;
import com.android.media.IMediaController2;
import com.android.media.MediaBrowser2Impl;
@@ -78,8 +70,6 @@
import com.android.media.Rating2Impl;
import com.android.media.SessionToken2Impl;
import com.android.media.VolumeProvider2Impl;
-import com.android.widget.MediaControlView2Impl;
-import com.android.widget.VideoView2Impl;
import java.util.concurrent.Executor;
@@ -182,20 +172,6 @@
}
@Override
- public MediaControlView2Provider createMediaControlView2(MediaControlView2 instance,
- ViewGroupProvider superProvider, ViewGroupProvider privateProvider,
- @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- return new MediaControlView2Impl(instance, superProvider, privateProvider);
- }
-
- @Override
- public VideoView2Provider createVideoView2(
- VideoView2 instance, ViewGroupProvider superProvider, ViewGroupProvider privateProvider,
- @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- return new VideoView2Impl(instance, superProvider, privateProvider);
- }
-
- @Override
public SessionToken2Provider createSessionToken2(Context context, SessionToken2 instance,
String packageName, String serviceName, int uid) {
return new SessionToken2Impl(context, instance, packageName, serviceName, uid);
diff --git a/packages/MediaComponents/src/com/android/media/update/ApiHelper.java b/packages/MediaComponents/src/com/android/media/update/ApiHelper.java
index dc5e5e2..f918ed3 100644
--- a/packages/MediaComponents/src/com/android/media/update/ApiHelper.java
+++ b/packages/MediaComponents/src/com/android/media/update/ApiHelper.java
@@ -16,34 +16,11 @@
package com.android.media.update;
-import android.annotation.Nullable;
-import android.content.Context;
import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Resources;
-import android.content.res.Resources.Theme;
-import android.content.res.XmlResourceParser;
-import android.util.AttributeSet;
-import android.view.ContextThemeWrapper;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.annotation.GuardedBy;
-import androidx.appcompat.widget.ButtonBarLayout;
-import androidx.legacy.widget.Space;
-
-import com.android.support.mediarouter.app.MediaRouteButton;
-import com.android.support.mediarouter.app.MediaRouteExpandCollapseButton;
-import com.android.support.mediarouter.app.MediaRouteVolumeSlider;
-import com.android.support.mediarouter.app.OverlayListView;
public final class ApiHelper {
private static ApplicationInfo sUpdatableInfo;
- @GuardedBy("this")
- private static Theme sLibTheme;
-
private ApiHelper() { }
static void initialize(ApplicationInfo updatableInfo) {
@@ -53,90 +30,4 @@
sUpdatableInfo = updatableInfo;
}
-
- public static Resources getLibResources(Context context) {
- return getLibTheme(context).getResources();
- }
-
- public static Theme getLibTheme(Context context) {
- if (sLibTheme != null) return sLibTheme;
-
- return getLibThemeSynchronized(context);
- }
-
- public static Theme getLibTheme(Context context, int themeId) {
- Theme theme = getLibResources(context).newTheme();
- theme.applyStyle(themeId, true);
- return theme;
- }
-
- public static LayoutInflater getLayoutInflater(Context context) {
- return getLayoutInflater(context, null);
- }
-
- public static LayoutInflater getLayoutInflater(Context context, Theme theme) {
- if (theme == null) {
- theme = getLibTheme(context);
- }
-
- // TODO (b/72975976): Avoid to use ContextThemeWrapper with app context and lib theme.
- LayoutInflater layoutInflater = LayoutInflater.from(context).cloneInContext(
- new ContextThemeWrapper(context, theme));
- layoutInflater.setFactory2(new LayoutInflater.Factory2() {
- @Override
- public View onCreateView(
- View parent, String name, Context context, AttributeSet attrs) {
- if (MediaRouteButton.class.getCanonicalName().equals(name)) {
- return new MediaRouteButton(context, attrs);
- } else if (MediaRouteVolumeSlider.class.getCanonicalName().equals(name)) {
- return new MediaRouteVolumeSlider(context, attrs);
- } else if (MediaRouteExpandCollapseButton.class.getCanonicalName().equals(name)) {
- return new MediaRouteExpandCollapseButton(context, attrs);
- } else if (OverlayListView.class.getCanonicalName().equals(name)) {
- return new OverlayListView(context, attrs);
- } else if (ButtonBarLayout.class.getCanonicalName().equals(name)) {
- return new ButtonBarLayout(context, attrs);
- } else if (Space.class.getCanonicalName().equals(name)) {
- return new Space(context, attrs);
- }
- return null;
- }
-
- @Override
- public View onCreateView(String name, Context context, AttributeSet attrs) {
- return onCreateView(null, name, context, attrs);
- }
- });
- return layoutInflater;
- }
-
- public static View inflateLibLayout(Context context, int libResId) {
- return inflateLibLayout(context, getLibTheme(context), libResId, null, false);
- }
-
- public static View inflateLibLayout(Context context, Theme theme, int libResId) {
- return inflateLibLayout(context, theme, libResId, null, false);
- }
-
- public static View inflateLibLayout(Context context, Theme theme, int libResId,
- @Nullable ViewGroup root, boolean attachToRoot) {
- try (XmlResourceParser parser = getLibResources(context).getLayout(libResId)) {
- return getLayoutInflater(context, theme).inflate(parser, root, attachToRoot);
- }
- }
-
- private static synchronized Theme getLibThemeSynchronized(Context context) {
- if (sLibTheme != null) return sLibTheme;
-
- if (sUpdatableInfo == null) {
- throw new IllegalStateException("initialize hasn't been called yet");
- }
-
- try {
- return sLibTheme = context.getPackageManager()
- .getResourcesForApplication(sUpdatableInfo).newTheme();
- } catch (NameNotFoundException e) {
- throw new RuntimeException(e);
- }
- }
}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/api24/media/MediaRouterApi24.java b/packages/MediaComponents/src/com/android/support/mediarouter/api24/media/MediaRouterApi24.java
deleted file mode 100644
index 1146af6..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/api24/media/MediaRouterApi24.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-// @@RequiresApi(24)
-final class MediaRouterApi24 {
- public static final class RouteInfo {
- public static int getDeviceType(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getDeviceType();
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteActionProvider.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteActionProvider.java
deleted file mode 100644
index 98c0d17..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteActionProvider.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.core.view.ActionProvider;
-
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-import java.lang.ref.WeakReference;
-
-/**
- * The media route action provider displays a {@link MediaRouteButton media route button}
- * in the application's {@link ActionBar} to allow the user to select routes and
- * to control the currently selected route.
- * <p>
- * The application must specify the kinds of routes that the user should be allowed
- * to select by specifying a {@link MediaRouteSelector selector} with the
- * {@link #setRouteSelector} method.
- * </p><p>
- * Refer to {@link MediaRouteButton} for a description of the button that will
- * appear in the action bar menu. Note that instead of disabling the button
- * when no routes are available, the action provider will instead make the
- * menu item invisible. In this way, the button will only be visible when it
- * is possible for the user to discover and select a matching route.
- * </p>
- *
- * <h3>Prerequisites</h3>
- * <p>
- * To use the media route action provider, the activity must be a subclass of
- * {@link AppCompatActivity} from the <code>androidx.appcompat.appcompat</code>
- * support library. Refer to support library documentation for details.
- * </p>
- *
- * <h3>Example</h3>
- * <p>
- * </p><p>
- * The application should define a menu resource to include the provider in the
- * action bar options menu. Note that the support library action bar uses attributes
- * that are defined in the application's resource namespace rather than the framework's
- * resource namespace to configure each item.
- * </p><pre>
- * <menu xmlns:android="http://schemas.android.com/apk/res/android"
- * xmlns:app="http://schemas.android.com/apk/res-auto">
- * <item android:id="@+id/media_route_menu_item"
- * android:title="@string/media_route_menu_title"
- * app:showAsAction="always"
- * app:actionProviderClass="androidx.mediarouter.app.MediaRouteActionProvider"/>
- * </menu>
- * </pre><p>
- * Then configure the menu and set the route selector for the chooser.
- * </p><pre>
- * public class MyActivity extends AppCompatActivity {
- * private MediaRouter mRouter;
- * private MediaRouter.Callback mCallback;
- * private MediaRouteSelector mSelector;
- *
- * protected void onCreate(Bundle savedInstanceState) {
- * super.onCreate(savedInstanceState);
- *
- * mRouter = Mediarouter.getInstance(this);
- * mSelector = new MediaRouteSelector.Builder()
- * .addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
- * .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
- * .build();
- * mCallback = new MyCallback();
- * }
- *
- * // Add the callback on start to tell the media router what kinds of routes
- * // the application is interested in so that it can try to discover suitable ones.
- * public void onStart() {
- * super.onStart();
- *
- * mediaRouter.addCallback(mSelector, mCallback,
- * MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
- *
- * MediaRouter.RouteInfo route = mediaRouter.updateSelectedRoute(mSelector);
- * // do something with the route...
- * }
- *
- * // Remove the selector on stop to tell the media router that it no longer
- * // needs to invest effort trying to discover routes of these kinds for now.
- * public void onStop() {
- * super.onStop();
- *
- * mediaRouter.removeCallback(mCallback);
- * }
- *
- * public boolean onCreateOptionsMenu(Menu menu) {
- * super.onCreateOptionsMenu(menu);
- *
- * getMenuInflater().inflate(R.menu.sample_media_router_menu, menu);
- *
- * MenuItem mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item);
- * MediaRouteActionProvider mediaRouteActionProvider =
- * (MediaRouteActionProvider)MenuItemCompat.getActionProvider(mediaRouteMenuItem);
- * mediaRouteActionProvider.setRouteSelector(mSelector);
- * return true;
- * }
- *
- * private final class MyCallback extends MediaRouter.Callback {
- * // Implement callback methods as needed.
- * }
- * }
- * </pre>
- *
- * @see #setRouteSelector
- */
-public class MediaRouteActionProvider extends ActionProvider {
- private static final String TAG = "MediaRouteActionProvider";
-
- private final MediaRouter mRouter;
- private final MediaRouterCallback mCallback;
-
- private MediaRouteSelector mSelector = MediaRouteSelector.EMPTY;
- private MediaRouteDialogFactory mDialogFactory = MediaRouteDialogFactory.getDefault();
- private MediaRouteButton mButton;
-
- /**
- * Creates the action provider.
- *
- * @param context The context.
- */
- public MediaRouteActionProvider(Context context) {
- super(context);
-
- mRouter = MediaRouter.getInstance(context);
- mCallback = new MediaRouterCallback(this);
- }
-
- /**
- * Gets the media route selector for filtering the routes that the user can
- * select using the media route chooser dialog.
- *
- * @return The selector, never null.
- */
- @NonNull
- public MediaRouteSelector getRouteSelector() {
- return mSelector;
- }
-
- /**
- * Sets the media route selector for filtering the routes that the user can
- * select using the media route chooser dialog.
- *
- * @param selector The selector, must not be null.
- */
- public void setRouteSelector(@NonNull MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- if (!mSelector.equals(selector)) {
- // FIXME: We currently have no way of knowing whether the action provider
- // is still needed by the UI. Unfortunately this means the action provider
- // may leak callbacks until garbage collection occurs. This may result in
- // media route providers doing more work than necessary in the short term
- // while trying to discover routes that are no longer of interest to the
- // application. To solve this problem, the action provider will need some
- // indication from the framework that it is being destroyed.
- if (!mSelector.isEmpty()) {
- mRouter.removeCallback(mCallback);
- }
- if (!selector.isEmpty()) {
- mRouter.addCallback(selector, mCallback);
- }
- mSelector = selector;
- refreshRoute();
-
- if (mButton != null) {
- mButton.setRouteSelector(selector);
- }
- }
- }
-
- /**
- * Gets the media route dialog factory to use when showing the route chooser
- * or controller dialog.
- *
- * @return The dialog factory, never null.
- */
- @NonNull
- public MediaRouteDialogFactory getDialogFactory() {
- return mDialogFactory;
- }
-
- /**
- * Sets the media route dialog factory to use when showing the route chooser
- * or controller dialog.
- *
- * @param factory The dialog factory, must not be null.
- */
- public void setDialogFactory(@NonNull MediaRouteDialogFactory factory) {
- if (factory == null) {
- throw new IllegalArgumentException("factory must not be null");
- }
-
- if (mDialogFactory != factory) {
- mDialogFactory = factory;
-
- if (mButton != null) {
- mButton.setDialogFactory(factory);
- }
- }
- }
-
- /**
- * Gets the associated media route button, or null if it has not yet been created.
- */
- @Nullable
- public MediaRouteButton getMediaRouteButton() {
- return mButton;
- }
-
- /**
- * Called when the media route button is being created.
- * <p>
- * Subclasses may override this method to customize the button.
- * </p>
- */
- public MediaRouteButton onCreateMediaRouteButton() {
- return new MediaRouteButton(getContext());
- }
-
- @Override
- @SuppressWarnings("deprecation")
- public View onCreateActionView() {
- if (mButton != null) {
- Log.e(TAG, "onCreateActionView: this ActionProvider is already associated " +
- "with a menu item. Don't reuse MediaRouteActionProvider instances! " +
- "Abandoning the old menu item...");
- }
-
- mButton = onCreateMediaRouteButton();
- mButton.setCheatSheetEnabled(true);
- mButton.setRouteSelector(mSelector);
- mButton.setDialogFactory(mDialogFactory);
- mButton.setLayoutParams(new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.MATCH_PARENT));
- return mButton;
- }
-
- @Override
- public boolean onPerformDefaultAction() {
- if (mButton != null) {
- return mButton.showDialog();
- }
- return false;
- }
-
- @Override
- public boolean overridesItemVisibility() {
- return true;
- }
-
- @Override
- public boolean isVisible() {
- return mRouter.isRouteAvailable(mSelector,
- MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE);
- }
-
- void refreshRoute() {
- refreshVisibility();
- }
-
- private static final class MediaRouterCallback extends MediaRouter.Callback {
- private final WeakReference<MediaRouteActionProvider> mProviderWeak;
-
- public MediaRouterCallback(MediaRouteActionProvider provider) {
- mProviderWeak = new WeakReference<MediaRouteActionProvider>(provider);
- }
-
- @Override
- public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute(router);
- }
-
- @Override
- public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute(router);
- }
-
- @Override
- public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute(router);
- }
-
- @Override
- public void onProviderAdded(MediaRouter router, MediaRouter.ProviderInfo provider) {
- refreshRoute(router);
- }
-
- @Override
- public void onProviderRemoved(MediaRouter router, MediaRouter.ProviderInfo provider) {
- refreshRoute(router);
- }
-
- @Override
- public void onProviderChanged(MediaRouter router, MediaRouter.ProviderInfo provider) {
- refreshRoute(router);
- }
-
- private void refreshRoute(MediaRouter router) {
- MediaRouteActionProvider provider = mProviderWeak.get();
- if (provider != null) {
- provider.refreshRoute();
- } else {
- router.removeCallback(this);
- }
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteButton.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteButton.java
deleted file mode 100644
index e82fcb9..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteButton.java
+++ /dev/null
@@ -1,630 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.annotation.NonNull;
-import android.app.Activity;
-import android.app.FragmentManager;
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.drawable.AnimationDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.AsyncTask;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.SoundEffectConstants;
-import android.view.View;
-
-import androidx.appcompat.widget.TooltipCompat;
-import androidx.core.graphics.drawable.DrawableCompat;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-/**
- * The media route button allows the user to select routes and to control the
- * currently selected route.
- * <p>
- * The application must specify the kinds of routes that the user should be allowed
- * to select by specifying a {@link MediaRouteSelector selector} with the
- * {@link #setRouteSelector} method.
- * </p><p>
- * When the default route is selected or when the currently selected route does not
- * match the {@link #getRouteSelector() selector}, the button will appear in
- * an inactive state indicating that the application is not connected to a
- * route of the kind that it wants to use. Clicking on the button opens
- * a {@link MediaRouteChooserDialog} to allow the user to select a route.
- * If no non-default routes match the selector and it is not possible for an active
- * scan to discover any matching routes, then the button is disabled and cannot
- * be clicked.
- * </p><p>
- * When a non-default route is selected that matches the selector, the button will
- * appear in an active state indicating that the application is connected
- * to a route of the kind that it wants to use. The button may also appear
- * in an intermediary connecting state if the route is in the process of connecting
- * to the destination but has not yet completed doing so. In either case, clicking
- * on the button opens a {@link MediaRouteControllerDialog} to allow the user
- * to control or disconnect from the current route.
- * </p>
- *
- * <h3>Prerequisites</h3>
- * <p>
- * To use the media route button, the activity must be a subclass of
- * {@link FragmentActivity} from the <code>androidx.core./code>
- * support library. Refer to support library documentation for details.
- * </p>
- *
- * @see MediaRouteActionProvider
- * @see #setRouteSelector
- */
-public class MediaRouteButton extends View {
- private static final String TAG = "MediaRouteButton";
-
- private static final String CHOOSER_FRAGMENT_TAG =
- "androidx.mediarouter.media.outer:MediaRouteChooserDialogFragment";
- private static final String CONTROLLER_FRAGMENT_TAG =
- "androidx.mediarouter.media.outer:MediaRouteControllerDialogFragment";
-
- private final MediaRouter mRouter;
- private final MediaRouterCallback mCallback;
-
- private MediaRouteSelector mSelector = MediaRouteSelector.EMPTY;
- private int mRouteCallbackFlags;
- private MediaRouteDialogFactory mDialogFactory = MediaRouteDialogFactory.getDefault();
-
- private boolean mAttachedToWindow;
-
- private static final SparseArray<Drawable.ConstantState> sRemoteIndicatorCache =
- new SparseArray<>(2);
- private RemoteIndicatorLoader mRemoteIndicatorLoader;
- private Drawable mRemoteIndicator;
- private boolean mRemoteActive;
- private boolean mIsConnecting;
-
- private ColorStateList mButtonTint;
- private int mMinWidth;
- private int mMinHeight;
-
- // The checked state is used when connected to a remote route.
- private static final int[] CHECKED_STATE_SET = {
- android.R.attr.state_checked
- };
-
- // The checkable state is used while connecting to a remote route.
- private static final int[] CHECKABLE_STATE_SET = {
- android.R.attr.state_checkable
- };
-
- public MediaRouteButton(Context context) {
- this(context, null);
- }
-
- public MediaRouteButton(Context context, AttributeSet attrs) {
- this(context, attrs, R.attr.mediaRouteButtonStyle);
- }
-
- public MediaRouteButton(Context context, AttributeSet attrs, int defStyleAttr) {
- super(MediaRouterThemeHelper.createThemedButtonContext(context), attrs, defStyleAttr);
- context = getContext();
-
- mRouter = MediaRouter.getInstance(context);
- mCallback = new MediaRouterCallback();
-
- Resources.Theme theme = ApiHelper.getLibResources(context).newTheme();
- theme.applyStyle(MediaRouterThemeHelper.getRouterThemeId(context), true);
- TypedArray a = theme.obtainStyledAttributes(attrs,
- R.styleable.MediaRouteButton, defStyleAttr, 0);
-
- mButtonTint = a.getColorStateList(R.styleable.MediaRouteButton_mediaRouteButtonTint);
- mMinWidth = a.getDimensionPixelSize(
- R.styleable.MediaRouteButton_android_minWidth, 0);
- mMinHeight = a.getDimensionPixelSize(
- R.styleable.MediaRouteButton_android_minHeight, 0);
- int remoteIndicatorResId = a.getResourceId(
- R.styleable.MediaRouteButton_externalRouteEnabledDrawable, 0);
- a.recycle();
-
- if (remoteIndicatorResId != 0) {
- Drawable.ConstantState remoteIndicatorState =
- sRemoteIndicatorCache.get(remoteIndicatorResId);
- if (remoteIndicatorState != null) {
- setRemoteIndicatorDrawable(remoteIndicatorState.newDrawable());
- } else {
- mRemoteIndicatorLoader = new RemoteIndicatorLoader(remoteIndicatorResId);
- mRemoteIndicatorLoader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
- }
-
- updateContentDescription();
- setClickable(true);
- }
-
- /**
- * Gets the media route selector for filtering the routes that the user can
- * select using the media route chooser dialog.
- *
- * @return The selector, never null.
- */
- @NonNull
- public MediaRouteSelector getRouteSelector() {
- return mSelector;
- }
-
- /**
- * Sets the media route selector for filtering the routes that the user can
- * select using the media route chooser dialog.
- *
- * @param selector The selector.
- */
- public void setRouteSelector(MediaRouteSelector selector) {
- setRouteSelector(selector, 0);
- }
-
- /**
- * Sets the media route selector for filtering the routes that the user can
- * select using the media route chooser dialog.
- *
- * @param selector The selector.
- * @param flags Flags to control the behavior of the callback. May be zero or a combination of
- * {@link #MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN} and
- * {@link #MediaRouter.CALLBACK_FLAG_UNFILTERED_EVENTS}.
- */
- public void setRouteSelector(MediaRouteSelector selector, int flags) {
- if (mSelector.equals(selector) && mRouteCallbackFlags == flags) {
- return;
- }
- if (!mSelector.isEmpty()) {
- mRouter.removeCallback(mCallback);
- }
- if (selector == null || selector.isEmpty()) {
- mSelector = MediaRouteSelector.EMPTY;
- return;
- }
-
- mSelector = selector;
- mRouteCallbackFlags = flags;
-
- if (mAttachedToWindow) {
- mRouter.addCallback(selector, mCallback, flags);
- refreshRoute();
- }
- }
-
- /**
- * Gets the media route dialog factory to use when showing the route chooser
- * or controller dialog.
- *
- * @return The dialog factory, never null.
- */
- @NonNull
- public MediaRouteDialogFactory getDialogFactory() {
- return mDialogFactory;
- }
-
- /**
- * Sets the media route dialog factory to use when showing the route chooser
- * or controller dialog.
- *
- * @param factory The dialog factory, must not be null.
- */
- public void setDialogFactory(@NonNull MediaRouteDialogFactory factory) {
- if (factory == null) {
- throw new IllegalArgumentException("factory must not be null");
- }
-
- mDialogFactory = factory;
- }
-
- /**
- * Show the route chooser or controller dialog.
- * <p>
- * If the default route is selected or if the currently selected route does
- * not match the {@link #getRouteSelector selector}, then shows the route chooser dialog.
- * Otherwise, shows the route controller dialog to offer the user
- * a choice to disconnect from the route or perform other control actions
- * such as setting the route's volume.
- * </p><p>
- * The application can customize the dialogs by calling {@link #setDialogFactory}
- * to provide a customized dialog factory.
- * </p>
- *
- * @return True if the dialog was actually shown.
- *
- * @throws IllegalStateException if the activity is not a subclass of
- * {@link FragmentActivity}.
- */
- public boolean showDialog() {
- if (!mAttachedToWindow) {
- return false;
- }
-
- final FragmentManager fm = getActivity().getFragmentManager();
- if (fm == null) {
- throw new IllegalStateException("The activity must be a subclass of FragmentActivity");
- }
-
- MediaRouter.RouteInfo route = mRouter.getSelectedRoute();
- if (route.isDefaultOrBluetooth() || !route.matchesSelector(mSelector)) {
- if (fm.findFragmentByTag(CHOOSER_FRAGMENT_TAG) != null) {
- Log.w(TAG, "showDialog(): Route chooser dialog already showing!");
- return false;
- }
- MediaRouteChooserDialogFragment f =
- mDialogFactory.onCreateChooserDialogFragment();
- f.setRouteSelector(mSelector);
- f.show(fm, CHOOSER_FRAGMENT_TAG);
- } else {
- if (fm.findFragmentByTag(CONTROLLER_FRAGMENT_TAG) != null) {
- Log.w(TAG, "showDialog(): Route controller dialog already showing!");
- return false;
- }
- MediaRouteControllerDialogFragment f =
- mDialogFactory.onCreateControllerDialogFragment();
- f.show(fm, CONTROLLER_FRAGMENT_TAG);
- }
- return true;
- }
-
-
- private Activity getActivity() {
- // Gross way of unwrapping the Activity so we can get the FragmentManager
- Context context = getContext();
- while (context instanceof ContextWrapper) {
- if (context instanceof Activity) {
- return (Activity)context;
- }
- context = ((ContextWrapper)context).getBaseContext();
- }
- return null;
- }
-
- /**
- * Sets whether to enable showing a toast with the content descriptor of the
- * button when the button is long pressed.
- */
- void setCheatSheetEnabled(boolean enable) {
- TooltipCompat.setTooltipText(this, enable
- ? ApiHelper.getLibResources(getContext())
- .getString(R.string.mr_button_content_description)
- : null);
- }
-
- @Override
- public boolean performClick() {
- // Send the appropriate accessibility events and call listeners
- boolean handled = super.performClick();
- if (!handled) {
- playSoundEffect(SoundEffectConstants.CLICK);
- }
- return showDialog() || handled;
- }
-
- @Override
- protected int[] onCreateDrawableState(int extraSpace) {
- final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
-
- // Technically we should be handling this more completely, but these
- // are implementation details here. Checkable is used to express the connecting
- // drawable state and it's mutually exclusive with check for the purposes
- // of state selection here.
- if (mIsConnecting) {
- mergeDrawableStates(drawableState, CHECKABLE_STATE_SET);
- } else if (mRemoteActive) {
- mergeDrawableStates(drawableState, CHECKED_STATE_SET);
- }
- return drawableState;
- }
-
- @Override
- protected void drawableStateChanged() {
- super.drawableStateChanged();
-
- if (mRemoteIndicator != null) {
- int[] myDrawableState = getDrawableState();
- mRemoteIndicator.setState(myDrawableState);
- invalidate();
- }
- }
-
- /**
- * Sets a drawable to use as the remote route indicator.
- */
- public void setRemoteIndicatorDrawable(Drawable d) {
- if (mRemoteIndicatorLoader != null) {
- mRemoteIndicatorLoader.cancel(false);
- }
-
- if (mRemoteIndicator != null) {
- mRemoteIndicator.setCallback(null);
- unscheduleDrawable(mRemoteIndicator);
- }
- if (d != null) {
- if (mButtonTint != null) {
- d = DrawableCompat.wrap(d.mutate());
- DrawableCompat.setTintList(d, mButtonTint);
- }
- d.setCallback(this);
- d.setState(getDrawableState());
- d.setVisible(getVisibility() == VISIBLE, false);
- }
- mRemoteIndicator = d;
-
- refreshDrawableState();
- if (mAttachedToWindow && mRemoteIndicator != null
- && mRemoteIndicator.getCurrent() instanceof AnimationDrawable) {
- AnimationDrawable curDrawable = (AnimationDrawable) mRemoteIndicator.getCurrent();
- if (mIsConnecting) {
- if (!curDrawable.isRunning()) {
- curDrawable.start();
- }
- } else if (mRemoteActive) {
- if (curDrawable.isRunning()) {
- curDrawable.stop();
- }
- curDrawable.selectDrawable(curDrawable.getNumberOfFrames() - 1);
- }
- }
- }
-
- @Override
- protected boolean verifyDrawable(Drawable who) {
- return super.verifyDrawable(who) || who == mRemoteIndicator;
- }
-
- @Override
- public void jumpDrawablesToCurrentState() {
- // We can't call super to handle the background so we do it ourselves.
- //super.jumpDrawablesToCurrentState();
- if (getBackground() != null) {
- DrawableCompat.jumpToCurrentState(getBackground());
- }
-
- // Handle our own remote indicator.
- if (mRemoteIndicator != null) {
- DrawableCompat.jumpToCurrentState(mRemoteIndicator);
- }
- }
-
- @Override
- public void setVisibility(int visibility) {
- super.setVisibility(visibility);
-
- if (mRemoteIndicator != null) {
- mRemoteIndicator.setVisible(getVisibility() == VISIBLE, false);
- }
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
-
- mAttachedToWindow = true;
- if (!mSelector.isEmpty()) {
- mRouter.addCallback(mSelector, mCallback, mRouteCallbackFlags);
- }
- refreshRoute();
- }
-
- @Override
- public void onDetachedFromWindow() {
- mAttachedToWindow = false;
- if (!mSelector.isEmpty()) {
- mRouter.removeCallback(mCallback);
- }
-
- super.onDetachedFromWindow();
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
- final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
- final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
- final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
-
- final int width = Math.max(mMinWidth, mRemoteIndicator != null ?
- mRemoteIndicator.getIntrinsicWidth() + getPaddingLeft() + getPaddingRight() : 0);
- final int height = Math.max(mMinHeight, mRemoteIndicator != null ?
- mRemoteIndicator.getIntrinsicHeight() + getPaddingTop() + getPaddingBottom() : 0);
-
- int measuredWidth;
- switch (widthMode) {
- case MeasureSpec.EXACTLY:
- measuredWidth = widthSize;
- break;
- case MeasureSpec.AT_MOST:
- measuredWidth = Math.min(widthSize, width);
- break;
- default:
- case MeasureSpec.UNSPECIFIED:
- measuredWidth = width;
- break;
- }
-
- int measuredHeight;
- switch (heightMode) {
- case MeasureSpec.EXACTLY:
- measuredHeight = heightSize;
- break;
- case MeasureSpec.AT_MOST:
- measuredHeight = Math.min(heightSize, height);
- break;
- default:
- case MeasureSpec.UNSPECIFIED:
- measuredHeight = height;
- break;
- }
-
- setMeasuredDimension(measuredWidth, measuredHeight);
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
-
- if (mRemoteIndicator != null) {
- final int left = getPaddingLeft();
- final int right = getWidth() - getPaddingRight();
- final int top = getPaddingTop();
- final int bottom = getHeight() - getPaddingBottom();
-
- final int drawWidth = mRemoteIndicator.getIntrinsicWidth();
- final int drawHeight = mRemoteIndicator.getIntrinsicHeight();
- final int drawLeft = left + (right - left - drawWidth) / 2;
- final int drawTop = top + (bottom - top - drawHeight) / 2;
-
- mRemoteIndicator.setBounds(drawLeft, drawTop,
- drawLeft + drawWidth, drawTop + drawHeight);
- mRemoteIndicator.draw(canvas);
- }
- }
-
- void refreshRoute() {
- final MediaRouter.RouteInfo route = mRouter.getSelectedRoute();
- final boolean isRemote = !route.isDefaultOrBluetooth() && route.matchesSelector(mSelector);
- final boolean isConnecting = isRemote && route.isConnecting();
- boolean needsRefresh = false;
- if (mRemoteActive != isRemote) {
- mRemoteActive = isRemote;
- needsRefresh = true;
- }
- if (mIsConnecting != isConnecting) {
- mIsConnecting = isConnecting;
- needsRefresh = true;
- }
-
- if (needsRefresh) {
- updateContentDescription();
- refreshDrawableState();
- }
- if (mAttachedToWindow) {
- setEnabled(mRouter.isRouteAvailable(mSelector,
- MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE));
- }
- if (mRemoteIndicator != null
- && mRemoteIndicator.getCurrent() instanceof AnimationDrawable) {
- AnimationDrawable curDrawable = (AnimationDrawable) mRemoteIndicator.getCurrent();
- if (mAttachedToWindow) {
- if ((needsRefresh || isConnecting) && !curDrawable.isRunning()) {
- curDrawable.start();
- }
- } else if (isRemote && !isConnecting) {
- // When the route is already connected before the view is attached, show the last
- // frame of the connected animation immediately.
- if (curDrawable.isRunning()) {
- curDrawable.stop();
- }
- curDrawable.selectDrawable(curDrawable.getNumberOfFrames() - 1);
- }
- }
- }
-
- private void updateContentDescription() {
- int resId;
- if (mIsConnecting) {
- resId = R.string.mr_cast_button_connecting;
- } else if (mRemoteActive) {
- resId = R.string.mr_cast_button_connected;
- } else {
- resId = R.string.mr_cast_button_disconnected;
- }
- setContentDescription(ApiHelper.getLibResources(getContext()).getString(resId));
- }
-
- private final class MediaRouterCallback extends MediaRouter.Callback {
- MediaRouterCallback() {
- }
-
- @Override
- public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute();
- }
-
- @Override
- public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute();
- }
-
- @Override
- public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute();
- }
-
- @Override
- public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute();
- }
-
- @Override
- public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoute();
- }
-
- @Override
- public void onProviderAdded(MediaRouter router, MediaRouter.ProviderInfo provider) {
- refreshRoute();
- }
-
- @Override
- public void onProviderRemoved(MediaRouter router, MediaRouter.ProviderInfo provider) {
- refreshRoute();
- }
-
- @Override
- public void onProviderChanged(MediaRouter router, MediaRouter.ProviderInfo provider) {
- refreshRoute();
- }
- }
-
- private final class RemoteIndicatorLoader extends AsyncTask<Void, Void, Drawable> {
- private final int mResId;
-
- RemoteIndicatorLoader(int resId) {
- mResId = resId;
- }
-
- @Override
- protected Drawable doInBackground(Void... params) {
- return ApiHelper.getLibResources(getContext()).getDrawable(mResId);
- }
-
- @Override
- protected void onPostExecute(Drawable remoteIndicator) {
- cacheAndReset(remoteIndicator);
- setRemoteIndicatorDrawable(remoteIndicator);
- }
-
- @Override
- protected void onCancelled(Drawable remoteIndicator) {
- cacheAndReset(remoteIndicator);
- }
-
- private void cacheAndReset(Drawable remoteIndicator) {
- if (remoteIndicator != null) {
- sRemoteIndicatorCache.put(mResId, remoteIndicator.getConstantState());
- }
- mRemoteIndicatorLoader = null;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteChooserDialog.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteChooserDialog.java
deleted file mode 100644
index f24028a..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteChooserDialog.java
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import static com.android.support.mediarouter.media.MediaRouter.RouteInfo
- .CONNECTION_STATE_CONNECTED;
-import static com.android.support.mediarouter.media.MediaRouter.RouteInfo
- .CONNECTION_STATE_CONNECTING;
-
-import android.annotation.NonNull;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.ContextThemeWrapper;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * This class implements the route chooser dialog for {@link MediaRouter}.
- * <p>
- * This dialog allows the user to choose a route that matches a given selector.
- * </p>
- *
- * @see MediaRouteButton
- * @see MediaRouteActionProvider
- */
-public class MediaRouteChooserDialog extends Dialog {
- static final String TAG = "MediaRouteChooserDialog";
-
- // Do not update the route list immediately to avoid unnatural dialog change.
- private static final long UPDATE_ROUTES_DELAY_MS = 300L;
- static final int MSG_UPDATE_ROUTES = 1;
-
- private final MediaRouter mRouter;
- private final MediaRouterCallback mCallback;
-
- private TextView mTitleView;
- private MediaRouteSelector mSelector = MediaRouteSelector.EMPTY;
- private ArrayList<MediaRouter.RouteInfo> mRoutes;
- private RouteAdapter mAdapter;
- private ListView mListView;
- private boolean mAttachedToWindow;
- private long mLastUpdateTime;
- private final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message message) {
- switch (message.what) {
- case MSG_UPDATE_ROUTES:
- updateRoutes((List<MediaRouter.RouteInfo>) message.obj);
- break;
- }
- }
- };
-
- public MediaRouteChooserDialog(Context context) {
- this(context, 0);
- }
-
- public MediaRouteChooserDialog(Context context, int theme) {
- // TODO (b/72975976): Avoid to use ContextThemeWrapper with app context and lib theme.
- super(new ContextThemeWrapper(context, ApiHelper.getLibTheme(context,
- MediaRouterThemeHelper.getRouterThemeId(context))), theme);
- context = getContext();
-
- mRouter = MediaRouter.getInstance(context);
- mCallback = new MediaRouterCallback();
- }
-
- /**
- * Gets the media route selector for filtering the routes that the user can select.
- *
- * @return The selector, never null.
- */
- @NonNull
- public MediaRouteSelector getRouteSelector() {
- return mSelector;
- }
-
- /**
- * Sets the media route selector for filtering the routes that the user can select.
- *
- * @param selector The selector, must not be null.
- */
- public void setRouteSelector(@NonNull MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- if (!mSelector.equals(selector)) {
- mSelector = selector;
-
- if (mAttachedToWindow) {
- mRouter.removeCallback(mCallback);
- mRouter.addCallback(selector, mCallback,
- MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
- }
-
- refreshRoutes();
- }
- }
-
- /**
- * Called to filter the set of routes that should be included in the list.
- * <p>
- * The default implementation iterates over all routes in the provided list and
- * removes those for which {@link #onFilterRoute} returns false.
- * </p>
- *
- * @param routes The list of routes to filter in-place, never null.
- */
- public void onFilterRoutes(@NonNull List<MediaRouter.RouteInfo> routes) {
- for (int i = routes.size(); i-- > 0; ) {
- if (!onFilterRoute(routes.get(i))) {
- routes.remove(i);
- }
- }
- }
-
- /**
- * Returns true if the route should be included in the list.
- * <p>
- * The default implementation returns true for enabled non-default routes that
- * match the selector. Subclasses can override this method to filter routes
- * differently.
- * </p>
- *
- * @param route The route to consider, never null.
- * @return True if the route should be included in the chooser dialog.
- */
- public boolean onFilterRoute(@NonNull MediaRouter.RouteInfo route) {
- return !route.isDefaultOrBluetooth() && route.isEnabled()
- && route.matchesSelector(mSelector);
- }
-
- @Override
- public void setTitle(CharSequence title) {
- mTitleView.setText(title);
- }
-
- @Override
- public void setTitle(int titleId) {
- mTitleView.setText(titleId);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(ApiHelper.inflateLibLayout(getContext(), ApiHelper.getLibTheme(getContext(),
- MediaRouterThemeHelper.getRouterThemeId(getContext())),
- R.layout.mr_chooser_dialog));
-
- mRoutes = new ArrayList<>();
- mAdapter = new RouteAdapter(getContext(), mRoutes);
- mListView = (ListView)findViewById(R.id.mr_chooser_list);
- mListView.setAdapter(mAdapter);
- mListView.setOnItemClickListener(mAdapter);
- mListView.setEmptyView(findViewById(android.R.id.empty));
- mTitleView = findViewById(R.id.mr_chooser_title);
-
- updateLayout();
- }
-
- /**
- * Sets the width of the dialog. Also called when configuration changes.
- */
- void updateLayout() {
- getWindow().setLayout(MediaRouteDialogHelper.getDialogWidth(getContext()),
- ViewGroup.LayoutParams.WRAP_CONTENT);
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
-
- mAttachedToWindow = true;
- mRouter.addCallback(mSelector, mCallback, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
- refreshRoutes();
- }
-
- @Override
- public void onDetachedFromWindow() {
- mAttachedToWindow = false;
- mRouter.removeCallback(mCallback);
- mHandler.removeMessages(MSG_UPDATE_ROUTES);
-
- super.onDetachedFromWindow();
- }
-
- /**
- * Refreshes the list of routes that are shown in the chooser dialog.
- */
- public void refreshRoutes() {
- if (mAttachedToWindow) {
- ArrayList<MediaRouter.RouteInfo> routes = new ArrayList<>(mRouter.getRoutes());
- onFilterRoutes(routes);
- Collections.sort(routes, RouteComparator.sInstance);
- if (SystemClock.uptimeMillis() - mLastUpdateTime >= UPDATE_ROUTES_DELAY_MS) {
- updateRoutes(routes);
- } else {
- mHandler.removeMessages(MSG_UPDATE_ROUTES);
- mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_UPDATE_ROUTES, routes),
- mLastUpdateTime + UPDATE_ROUTES_DELAY_MS);
- }
- }
- }
-
- void updateRoutes(List<MediaRouter.RouteInfo> routes) {
- mLastUpdateTime = SystemClock.uptimeMillis();
- mRoutes.clear();
- mRoutes.addAll(routes);
- mAdapter.notifyDataSetChanged();
- }
-
- private final class RouteAdapter extends ArrayAdapter<MediaRouter.RouteInfo>
- implements ListView.OnItemClickListener {
- private final Drawable mDefaultIcon;
- private final Drawable mTvIcon;
- private final Drawable mSpeakerIcon;
- private final Drawable mSpeakerGroupIcon;
-
- public RouteAdapter(Context context, List<MediaRouter.RouteInfo> routes) {
- super(context, 0, routes);
-
- TypedArray styledAttributes = ApiHelper.getLibTheme(context,
- MediaRouterThemeHelper.getRouterThemeId(context)).obtainStyledAttributes(
- new int[] {
- R.attr.mediaRouteDefaultIconDrawable,
- R.attr.mediaRouteTvIconDrawable,
- R.attr.mediaRouteSpeakerIconDrawable,
- R.attr.mediaRouteSpeakerGroupIconDrawable
- });
-
- mDefaultIcon = styledAttributes.getDrawable(0);
- mTvIcon = styledAttributes.getDrawable(1);
- mSpeakerIcon = styledAttributes.getDrawable(2);
- mSpeakerGroupIcon = styledAttributes.getDrawable(3);
- styledAttributes.recycle();
- }
-
- @Override
- public boolean areAllItemsEnabled() {
- return false;
- }
-
- @Override
- public boolean isEnabled(int position) {
- return getItem(position).isEnabled();
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View view = convertView;
- if (view == null) {
- view = ApiHelper.inflateLibLayout(getContext(),
- ApiHelper.getLibTheme(getContext(),
- MediaRouterThemeHelper.getRouterThemeId(getContext())),
- R.layout.mr_chooser_list_item, parent, false);
- }
-
- MediaRouter.RouteInfo route = getItem(position);
- TextView text1 = (TextView) view.findViewById(R.id.mr_chooser_route_name);
- TextView text2 = (TextView) view.findViewById(R.id.mr_chooser_route_desc);
- text1.setText(route.getName());
- String description = route.getDescription();
- boolean isConnectedOrConnecting =
- route.getConnectionState() == CONNECTION_STATE_CONNECTED
- || route.getConnectionState() == CONNECTION_STATE_CONNECTING;
- if (isConnectedOrConnecting && !TextUtils.isEmpty(description)) {
- text1.setGravity(Gravity.BOTTOM);
- text2.setVisibility(View.VISIBLE);
- text2.setText(description);
- } else {
- text1.setGravity(Gravity.CENTER_VERTICAL);
- text2.setVisibility(View.GONE);
- text2.setText("");
- }
- view.setEnabled(route.isEnabled());
-
- ImageView iconView = (ImageView) view.findViewById(R.id.mr_chooser_route_icon);
- if (iconView != null) {
- iconView.setImageDrawable(getIconDrawable(route));
- }
- return view;
- }
-
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- MediaRouter.RouteInfo route = getItem(position);
- if (route.isEnabled()) {
- route.select();
- dismiss();
- }
- }
-
- private Drawable getIconDrawable(MediaRouter.RouteInfo route) {
- Uri iconUri = route.getIconUri();
- if (iconUri != null) {
- try {
- InputStream is = getContext().getContentResolver().openInputStream(iconUri);
- Drawable drawable = Drawable.createFromStream(is, null);
- if (drawable != null) {
- return drawable;
- }
- } catch (IOException e) {
- Log.w(TAG, "Failed to load " + iconUri, e);
- // Falls back.
- }
- }
- return getDefaultIconDrawable(route);
- }
-
- private Drawable getDefaultIconDrawable(MediaRouter.RouteInfo route) {
- // If the type of the receiver device is specified, use it.
- switch (route.getDeviceType()) {
- case MediaRouter.RouteInfo.DEVICE_TYPE_TV:
- return mTvIcon;
- case MediaRouter.RouteInfo.DEVICE_TYPE_SPEAKER:
- return mSpeakerIcon;
- }
-
- // Otherwise, make the best guess based on other route information.
- if (route instanceof MediaRouter.RouteGroup) {
- // Only speakers can be grouped for now.
- return mSpeakerGroupIcon;
- }
- return mDefaultIcon;
- }
- }
-
- private final class MediaRouterCallback extends MediaRouter.Callback {
- MediaRouterCallback() {
- }
-
- @Override
- public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoutes();
- }
-
- @Override
- public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoutes();
- }
-
- @Override
- public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo info) {
- refreshRoutes();
- }
-
- @Override
- public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
- dismiss();
- }
- }
-
- static final class RouteComparator implements Comparator<MediaRouter.RouteInfo> {
- public static final RouteComparator sInstance = new RouteComparator();
-
- @Override
- public int compare(MediaRouter.RouteInfo lhs, MediaRouter.RouteInfo rhs) {
- return lhs.getName().compareToIgnoreCase(rhs.getName());
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteChooserDialogFragment.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteChooserDialogFragment.java
deleted file mode 100644
index 65e6b29..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteChooserDialogFragment.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.os.Bundle;
-
-import com.android.support.mediarouter.media.MediaRouteSelector;
-
-/**
- * Media route chooser dialog fragment.
- * <p>
- * Creates a {@link MediaRouteChooserDialog}. The application may subclass
- * this dialog fragment to customize the media route chooser dialog.
- * </p>
- */
-public class MediaRouteChooserDialogFragment extends DialogFragment {
- private final String ARGUMENT_SELECTOR = "selector";
-
- private MediaRouteChooserDialog mDialog;
- private MediaRouteSelector mSelector;
-
- /**
- * Creates a media route chooser dialog fragment.
- * <p>
- * All subclasses of this class must also possess a default constructor.
- * </p>
- */
- public MediaRouteChooserDialogFragment() {
- setCancelable(true);
- }
-
- /**
- * Gets the media route selector for filtering the routes that the user can select.
- *
- * @return The selector, never null.
- */
- public MediaRouteSelector getRouteSelector() {
- ensureRouteSelector();
- return mSelector;
- }
-
- private void ensureRouteSelector() {
- if (mSelector == null) {
- Bundle args = getArguments();
- if (args != null) {
- mSelector = MediaRouteSelector.fromBundle(args.getBundle(ARGUMENT_SELECTOR));
- }
- if (mSelector == null) {
- mSelector = MediaRouteSelector.EMPTY;
- }
- }
- }
-
- /**
- * Sets the media route selector for filtering the routes that the user can select.
- * This method must be called before the fragment is added.
- *
- * @param selector The selector to set.
- */
- public void setRouteSelector(MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- ensureRouteSelector();
- if (!mSelector.equals(selector)) {
- mSelector = selector;
-
- Bundle args = getArguments();
- if (args == null) {
- args = new Bundle();
- }
- args.putBundle(ARGUMENT_SELECTOR, selector.asBundle());
- setArguments(args);
-
- MediaRouteChooserDialog dialog = (MediaRouteChooserDialog)getDialog();
- if (dialog != null) {
- dialog.setRouteSelector(selector);
- }
- }
- }
-
- /**
- * Called when the chooser dialog is being created.
- * <p>
- * Subclasses may override this method to customize the dialog.
- * </p>
- */
- public MediaRouteChooserDialog onCreateChooserDialog(
- Context context, Bundle savedInstanceState) {
- return new MediaRouteChooserDialog(context);
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- mDialog = onCreateChooserDialog(getContext(), savedInstanceState);
- mDialog.setRouteSelector(getRouteSelector());
- return mDialog;
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- if (mDialog != null) {
- mDialog.updateLayout();
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteControllerDialog.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteControllerDialog.java
deleted file mode 100644
index f6c1d2f..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteControllerDialog.java
+++ /dev/null
@@ -1,1487 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PAUSE;
-import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PLAY;
-import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PLAY_PAUSE;
-import static android.support.v4.media.session.PlaybackStateCompat.ACTION_STOP;
-
-import android.app.AlertDialog;
-import android.app.PendingIntent;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.support.v4.media.MediaDescriptionCompat;
-import android.support.v4.media.MediaMetadataCompat;
-import android.support.v4.media.session.MediaControllerCompat;
-import android.support.v4.media.session.MediaSessionCompat;
-import android.support.v4.media.session.PlaybackStateCompat;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.ContextThemeWrapper;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.MeasureSpec;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
-import android.view.animation.AnimationSet;
-import android.view.animation.AnimationUtils;
-import android.view.animation.Interpolator;
-import android.view.animation.Transformation;
-import android.view.animation.TranslateAnimation;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.RelativeLayout;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import androidx.core.util.ObjectsCompat;
-import androidx.core.view.accessibility.AccessibilityEventCompat;
-import androidx.palette.graphics.Palette;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-import com.android.support.mediarouter.app.OverlayListView.OverlayObject;
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-/**
- * This class implements the route controller dialog for {@link MediaRouter}.
- * <p>
- * This dialog allows the user to control or disconnect from the currently selected route.
- * </p>
- *
- * @see MediaRouteButton
- * @see MediaRouteActionProvider
- */
-public class MediaRouteControllerDialog extends AlertDialog {
- // Tags should be less than 24 characters long (see docs for android.util.Log.isLoggable())
- static final String TAG = "MediaRouteCtrlDialog";
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- // Time to wait before updating the volume when the user lets go of the seek bar
- // to allow the route provider time to propagate the change and publish a new
- // route descriptor.
- static final int VOLUME_UPDATE_DELAY_MILLIS = 500;
- static final int CONNECTION_TIMEOUT_MILLIS = (int) TimeUnit.SECONDS.toMillis(30L);
-
- private static final int BUTTON_NEUTRAL_RES_ID = android.R.id.button3;
- static final int BUTTON_DISCONNECT_RES_ID = android.R.id.button2;
- static final int BUTTON_STOP_RES_ID = android.R.id.button1;
-
- final MediaRouter mRouter;
- private final MediaRouterCallback mCallback;
- final MediaRouter.RouteInfo mRoute;
-
- Context mContext;
- private boolean mCreated;
- private boolean mAttachedToWindow;
-
- private int mDialogContentWidth;
-
- private View mCustomControlView;
-
- private Button mDisconnectButton;
- private Button mStopCastingButton;
- private ImageButton mPlaybackControlButton;
- private ImageButton mCloseButton;
- private MediaRouteExpandCollapseButton mGroupExpandCollapseButton;
-
- private FrameLayout mExpandableAreaLayout;
- private LinearLayout mDialogAreaLayout;
- FrameLayout mDefaultControlLayout;
- private FrameLayout mCustomControlLayout;
- private ImageView mArtView;
- private TextView mTitleView;
- private TextView mSubtitleView;
- private TextView mRouteNameTextView;
-
- private boolean mVolumeControlEnabled = true;
- // Layout for media controllers including play/pause button and the main volume slider.
- private LinearLayout mMediaMainControlLayout;
- private RelativeLayout mPlaybackControlLayout;
- private LinearLayout mVolumeControlLayout;
- private View mDividerView;
-
- OverlayListView mVolumeGroupList;
- VolumeGroupAdapter mVolumeGroupAdapter;
- private List<MediaRouter.RouteInfo> mGroupMemberRoutes;
- Set<MediaRouter.RouteInfo> mGroupMemberRoutesAdded;
- private Set<MediaRouter.RouteInfo> mGroupMemberRoutesRemoved;
- Set<MediaRouter.RouteInfo> mGroupMemberRoutesAnimatingWithBitmap;
- SeekBar mVolumeSlider;
- VolumeChangeListener mVolumeChangeListener;
- MediaRouter.RouteInfo mRouteInVolumeSliderTouched;
- private int mVolumeGroupListItemIconSize;
- private int mVolumeGroupListItemHeight;
- private int mVolumeGroupListMaxHeight;
- private final int mVolumeGroupListPaddingTop;
- Map<MediaRouter.RouteInfo, SeekBar> mVolumeSliderMap;
-
- MediaControllerCompat mMediaController;
- MediaControllerCallback mControllerCallback;
- PlaybackStateCompat mState;
- MediaDescriptionCompat mDescription;
-
- FetchArtTask mFetchArtTask;
- Bitmap mArtIconBitmap;
- Uri mArtIconUri;
- boolean mArtIconIsLoaded;
- Bitmap mArtIconLoadedBitmap;
- int mArtIconBackgroundColor;
-
- boolean mHasPendingUpdate;
- boolean mPendingUpdateAnimationNeeded;
-
- boolean mIsGroupExpanded;
- boolean mIsGroupListAnimating;
- boolean mIsGroupListAnimationPending;
- int mGroupListAnimationDurationMs;
- private int mGroupListFadeInDurationMs;
- private int mGroupListFadeOutDurationMs;
-
- private Interpolator mInterpolator;
- private Interpolator mLinearOutSlowInInterpolator;
- private Interpolator mFastOutSlowInInterpolator;
- private Interpolator mAccelerateDecelerateInterpolator;
-
- final AccessibilityManager mAccessibilityManager;
-
- Runnable mGroupListFadeInAnimation = new Runnable() {
- @Override
- public void run() {
- startGroupListFadeInAnimation();
- }
- };
-
- public MediaRouteControllerDialog(Context context) {
- this(context, 0);
- }
-
- public MediaRouteControllerDialog(Context context, int theme) {
- // TODO (b/72975976): Avoid to use ContextThemeWrapper with app context and lib theme.
- super(new ContextThemeWrapper(context, ApiHelper.getLibTheme(context,
- MediaRouterThemeHelper.getRouterThemeId(context))), theme);
- mContext = getContext();
-
- mControllerCallback = new MediaControllerCallback();
- mRouter = MediaRouter.getInstance(mContext);
- mCallback = new MediaRouterCallback();
- mRoute = mRouter.getSelectedRoute();
- setMediaSession(mRouter.getMediaSessionToken());
- mVolumeGroupListPaddingTop = ApiHelper.getLibResources(context).getDimensionPixelSize(
- R.dimen.mr_controller_volume_group_list_padding_top);
- mAccessibilityManager =
- (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
- mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(
- mContext, android.R.interpolator.linear_out_slow_in);
- mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(
- mContext, android.R.interpolator.fast_out_slow_in);
- mAccelerateDecelerateInterpolator = new AccelerateDecelerateInterpolator();
- }
-
- /**
- * Gets the route that this dialog is controlling.
- */
- public MediaRouter.RouteInfo getRoute() {
- return mRoute;
- }
-
- private MediaRouter.RouteGroup getGroup() {
- if (mRoute instanceof MediaRouter.RouteGroup) {
- return (MediaRouter.RouteGroup) mRoute;
- }
- return null;
- }
-
- /**
- * Provides the subclass an opportunity to create a view that will replace the default media
- * controls for the currently playing content.
- *
- * @param savedInstanceState The dialog's saved instance state.
- * @return The media control view, or null if none.
- */
- public View onCreateMediaControlView(Bundle savedInstanceState) {
- return null;
- }
-
- /**
- * Gets the media control view that was created by {@link #onCreateMediaControlView(Bundle)}.
- *
- * @return The media control view, or null if none.
- */
- public View getMediaControlView() {
- return mCustomControlView;
- }
-
- /**
- * Sets whether to enable the volume slider and volume control using the volume keys
- * when the route supports it.
- * <p>
- * The default value is true.
- * </p>
- */
- public void setVolumeControlEnabled(boolean enable) {
- if (mVolumeControlEnabled != enable) {
- mVolumeControlEnabled = enable;
- if (mCreated) {
- update(false);
- }
- }
- }
-
- /**
- * Returns whether to enable the volume slider and volume control using the volume keys
- * when the route supports it.
- */
- public boolean isVolumeControlEnabled() {
- return mVolumeControlEnabled;
- }
-
- /**
- * Set the session to use for metadata and transport controls. The dialog
- * will listen to changes on this session and update the UI automatically in
- * response to changes.
- *
- * @param sessionToken The token for the session to use.
- */
- private void setMediaSession(MediaSessionCompat.Token sessionToken) {
- if (mMediaController != null) {
- mMediaController.unregisterCallback(mControllerCallback);
- mMediaController = null;
- }
- if (sessionToken == null) {
- return;
- }
- if (!mAttachedToWindow) {
- return;
- }
- try {
- mMediaController = new MediaControllerCompat(mContext, sessionToken);
- } catch (RemoteException e) {
- Log.e(TAG, "Error creating media controller in setMediaSession.", e);
- }
- if (mMediaController != null) {
- mMediaController.registerCallback(mControllerCallback);
- }
- MediaMetadataCompat metadata = mMediaController == null ? null
- : mMediaController.getMetadata();
- mDescription = metadata == null ? null : metadata.getDescription();
- mState = mMediaController == null ? null : mMediaController.getPlaybackState();
- updateArtIconIfNeeded();
- update(false);
- }
-
- /**
- * Gets the session to use for metadata and transport controls.
- *
- * @return The token for the session to use or null if none.
- */
- public MediaSessionCompat.Token getMediaSession() {
- return mMediaController == null ? null : mMediaController.getSessionToken();
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- getWindow().setBackgroundDrawableResource(android.R.color.transparent);
-
- setContentView(ApiHelper.inflateLibLayout(mContext,
- ApiHelper.getLibTheme(mContext, MediaRouterThemeHelper.getRouterThemeId(mContext)),
- R.layout.mr_controller_material_dialog_b));
-
- // Remove the neutral button.
- findViewById(BUTTON_NEUTRAL_RES_ID).setVisibility(View.GONE);
-
- ClickListener listener = new ClickListener();
-
- mExpandableAreaLayout = findViewById(R.id.mr_expandable_area);
- mExpandableAreaLayout.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- dismiss();
- }
- });
- mDialogAreaLayout = findViewById(R.id.mr_dialog_area);
- mDialogAreaLayout.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // Eat unhandled touch events.
- }
- });
- int color = MediaRouterThemeHelper.getButtonTextColor(mContext);
- mDisconnectButton = findViewById(BUTTON_DISCONNECT_RES_ID);
- mDisconnectButton.setText(
- ApiHelper.getLibResources(mContext).getString(R.string.mr_controller_disconnect));
- mDisconnectButton.setTextColor(color);
- mDisconnectButton.setOnClickListener(listener);
-
- mStopCastingButton = findViewById(BUTTON_STOP_RES_ID);
- mStopCastingButton.setText(
- ApiHelper.getLibResources(mContext).getString(R.string.mr_controller_stop_casting));
- mStopCastingButton.setTextColor(color);
- mStopCastingButton.setOnClickListener(listener);
-
- mRouteNameTextView = findViewById(R.id.mr_name);
- mCloseButton = findViewById(R.id.mr_close);
- mCloseButton.setOnClickListener(listener);
- mCustomControlLayout = findViewById(R.id.mr_custom_control);
- mDefaultControlLayout = findViewById(R.id.mr_default_control);
-
- // Start the session activity when a content item (album art, title or subtitle) is clicked.
- View.OnClickListener onClickListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mMediaController != null) {
- PendingIntent pi = mMediaController.getSessionActivity();
- if (pi != null) {
- try {
- pi.send();
- dismiss();
- } catch (PendingIntent.CanceledException e) {
- Log.e(TAG, pi + " was not sent, it had been canceled.");
- }
- }
- }
- }
- };
- mArtView = findViewById(R.id.mr_art);
- mArtView.setOnClickListener(onClickListener);
- findViewById(R.id.mr_control_title_container).setOnClickListener(onClickListener);
-
- mMediaMainControlLayout = findViewById(R.id.mr_media_main_control);
- mDividerView = findViewById(R.id.mr_control_divider);
-
- mPlaybackControlLayout = findViewById(R.id.mr_playback_control);
- mTitleView = findViewById(R.id.mr_control_title);
- mSubtitleView = findViewById(R.id.mr_control_subtitle);
- mPlaybackControlButton = findViewById(R.id.mr_control_playback_ctrl);
- mPlaybackControlButton.setOnClickListener(listener);
-
- mVolumeControlLayout = findViewById(R.id.mr_volume_control);
- mVolumeControlLayout.setVisibility(View.GONE);
- mVolumeSlider = findViewById(R.id.mr_volume_slider);
- mVolumeSlider.setTag(mRoute);
- mVolumeChangeListener = new VolumeChangeListener();
- mVolumeSlider.setOnSeekBarChangeListener(mVolumeChangeListener);
-
- mVolumeGroupList = findViewById(R.id.mr_volume_group_list);
- mGroupMemberRoutes = new ArrayList<MediaRouter.RouteInfo>();
- mVolumeGroupAdapter = new VolumeGroupAdapter(mVolumeGroupList.getContext(),
- mGroupMemberRoutes);
- mVolumeGroupList.setAdapter(mVolumeGroupAdapter);
- mGroupMemberRoutesAnimatingWithBitmap = new HashSet<>();
-
- MediaRouterThemeHelper.setMediaControlsBackgroundColor(mContext,
- mMediaMainControlLayout, mVolumeGroupList, getGroup() != null);
- MediaRouterThemeHelper.setVolumeSliderColor(mContext,
- (MediaRouteVolumeSlider) mVolumeSlider, mMediaMainControlLayout);
- mVolumeSliderMap = new HashMap<>();
- mVolumeSliderMap.put(mRoute, mVolumeSlider);
-
- mGroupExpandCollapseButton =
- findViewById(R.id.mr_group_expand_collapse);
- mGroupExpandCollapseButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mIsGroupExpanded = !mIsGroupExpanded;
- if (mIsGroupExpanded) {
- mVolumeGroupList.setVisibility(View.VISIBLE);
- }
- loadInterpolator();
- updateLayoutHeight(true);
- }
- });
- loadInterpolator();
- mGroupListAnimationDurationMs = ApiHelper.getLibResources(mContext).getInteger(
- R.integer.mr_controller_volume_group_list_animation_duration_ms);
- mGroupListFadeInDurationMs = ApiHelper.getLibResources(mContext).getInteger(
- R.integer.mr_controller_volume_group_list_fade_in_duration_ms);
- mGroupListFadeOutDurationMs = ApiHelper.getLibResources(mContext).getInteger(
- R.integer.mr_controller_volume_group_list_fade_out_duration_ms);
-
- mCustomControlView = onCreateMediaControlView(savedInstanceState);
- if (mCustomControlView != null) {
- mCustomControlLayout.addView(mCustomControlView);
- mCustomControlLayout.setVisibility(View.VISIBLE);
- }
- mCreated = true;
- updateLayout();
- }
-
- /**
- * Sets the width of the dialog. Also called when configuration changes.
- */
- void updateLayout() {
- int width = MediaRouteDialogHelper.getDialogWidth(mContext);
- getWindow().setLayout(width, ViewGroup.LayoutParams.WRAP_CONTENT);
-
- View decorView = getWindow().getDecorView();
- mDialogContentWidth = width - decorView.getPaddingLeft() - decorView.getPaddingRight();
-
- Resources res = ApiHelper.getLibResources(mContext);
- mVolumeGroupListItemIconSize = res.getDimensionPixelSize(
- R.dimen.mr_controller_volume_group_list_item_icon_size);
- mVolumeGroupListItemHeight = res.getDimensionPixelSize(
- R.dimen.mr_controller_volume_group_list_item_height);
- mVolumeGroupListMaxHeight = res.getDimensionPixelSize(
- R.dimen.mr_controller_volume_group_list_max_height);
-
- // Fetch art icons again for layout changes to resize it accordingly
- mArtIconBitmap = null;
- mArtIconUri = null;
- updateArtIconIfNeeded();
- update(false);
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
- mAttachedToWindow = true;
-
- mRouter.addCallback(MediaRouteSelector.EMPTY, mCallback,
- MediaRouter.CALLBACK_FLAG_UNFILTERED_EVENTS);
- setMediaSession(mRouter.getMediaSessionToken());
- }
-
- @Override
- public void onDetachedFromWindow() {
- mRouter.removeCallback(mCallback);
- setMediaSession(null);
- mAttachedToWindow = false;
- super.onDetachedFromWindow();
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
- || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
- mRoute.requestUpdateVolume(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ? -1 : 1);
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
-
- @Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
- || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
- return true;
- }
- return super.onKeyUp(keyCode, event);
- }
-
- void update(boolean animate) {
- // Defer dialog updates if a user is adjusting a volume in the list
- if (mRouteInVolumeSliderTouched != null) {
- mHasPendingUpdate = true;
- mPendingUpdateAnimationNeeded |= animate;
- return;
- }
- mHasPendingUpdate = false;
- mPendingUpdateAnimationNeeded = false;
- if (!mRoute.isSelected() || mRoute.isDefaultOrBluetooth()) {
- dismiss();
- return;
- }
- if (!mCreated) {
- return;
- }
-
- mRouteNameTextView.setText(mRoute.getName());
- mDisconnectButton.setVisibility(mRoute.canDisconnect() ? View.VISIBLE : View.GONE);
- if (mCustomControlView == null && mArtIconIsLoaded) {
- if (isBitmapRecycled(mArtIconLoadedBitmap)) {
- Log.w(TAG, "Can't set artwork image with recycled bitmap: " + mArtIconLoadedBitmap);
- } else {
- mArtView.setImageBitmap(mArtIconLoadedBitmap);
- mArtView.setBackgroundColor(mArtIconBackgroundColor);
- }
- clearLoadedBitmap();
- }
- updateVolumeControlLayout();
- updatePlaybackControlLayout();
- updateLayoutHeight(animate);
- }
-
- private boolean isBitmapRecycled(Bitmap bitmap) {
- return bitmap != null && bitmap.isRecycled();
- }
-
- private boolean canShowPlaybackControlLayout() {
- return mCustomControlView == null && (mDescription != null || mState != null);
- }
-
- /**
- * Returns the height of main media controller which includes playback control and master
- * volume control.
- */
- private int getMainControllerHeight(boolean showPlaybackControl) {
- int height = 0;
- if (showPlaybackControl || mVolumeControlLayout.getVisibility() == View.VISIBLE) {
- height += mMediaMainControlLayout.getPaddingTop()
- + mMediaMainControlLayout.getPaddingBottom();
- if (showPlaybackControl) {
- height += mPlaybackControlLayout.getMeasuredHeight();
- }
- if (mVolumeControlLayout.getVisibility() == View.VISIBLE) {
- height += mVolumeControlLayout.getMeasuredHeight();
- }
- if (showPlaybackControl && mVolumeControlLayout.getVisibility() == View.VISIBLE) {
- height += mDividerView.getMeasuredHeight();
- }
- }
- return height;
- }
-
- private void updateMediaControlVisibility(boolean canShowPlaybackControlLayout) {
- // TODO: Update the top and bottom padding of the control layout according to the display
- // height.
- mDividerView.setVisibility((mVolumeControlLayout.getVisibility() == View.VISIBLE
- && canShowPlaybackControlLayout) ? View.VISIBLE : View.GONE);
- mMediaMainControlLayout.setVisibility((mVolumeControlLayout.getVisibility() == View.GONE
- && !canShowPlaybackControlLayout) ? View.GONE : View.VISIBLE);
- }
-
- void updateLayoutHeight(final boolean animate) {
- // We need to defer the update until the first layout has occurred, as we don't yet know the
- // overall visible display size in which the window this view is attached to has been
- // positioned in.
- mDefaultControlLayout.requestLayout();
- ViewTreeObserver observer = mDefaultControlLayout.getViewTreeObserver();
- observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- mDefaultControlLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
- if (mIsGroupListAnimating) {
- mIsGroupListAnimationPending = true;
- } else {
- updateLayoutHeightInternal(animate);
- }
- }
- });
- }
-
- /**
- * Updates the height of views and hide artwork or metadata if space is limited.
- */
- void updateLayoutHeightInternal(boolean animate) {
- // Measure the size of widgets and get the height of main components.
- int oldHeight = getLayoutHeight(mMediaMainControlLayout);
- setLayoutHeight(mMediaMainControlLayout, ViewGroup.LayoutParams.MATCH_PARENT);
- updateMediaControlVisibility(canShowPlaybackControlLayout());
- View decorView = getWindow().getDecorView();
- decorView.measure(
- MeasureSpec.makeMeasureSpec(getWindow().getAttributes().width, MeasureSpec.EXACTLY),
- MeasureSpec.UNSPECIFIED);
- setLayoutHeight(mMediaMainControlLayout, oldHeight);
- int artViewHeight = 0;
- if (mCustomControlView == null && mArtView.getDrawable() instanceof BitmapDrawable) {
- Bitmap art = ((BitmapDrawable) mArtView.getDrawable()).getBitmap();
- if (art != null) {
- artViewHeight = getDesiredArtHeight(art.getWidth(), art.getHeight());
- mArtView.setScaleType(art.getWidth() >= art.getHeight()
- ? ImageView.ScaleType.FIT_XY : ImageView.ScaleType.FIT_CENTER);
- }
- }
- int mainControllerHeight = getMainControllerHeight(canShowPlaybackControlLayout());
- int volumeGroupListCount = mGroupMemberRoutes.size();
- // Scale down volume group list items in landscape mode.
- int expandedGroupListHeight = getGroup() == null ? 0 :
- mVolumeGroupListItemHeight * getGroup().getRoutes().size();
- if (volumeGroupListCount > 0) {
- expandedGroupListHeight += mVolumeGroupListPaddingTop;
- }
- expandedGroupListHeight = Math.min(expandedGroupListHeight, mVolumeGroupListMaxHeight);
- int visibleGroupListHeight = mIsGroupExpanded ? expandedGroupListHeight : 0;
-
- int desiredControlLayoutHeight =
- Math.max(artViewHeight, visibleGroupListHeight) + mainControllerHeight;
- Rect visibleRect = new Rect();
- decorView.getWindowVisibleDisplayFrame(visibleRect);
- // Height of non-control views in decor view.
- // This includes title bar, button bar, and dialog's vertical padding which should be
- // always shown.
- int nonControlViewHeight = mDialogAreaLayout.getMeasuredHeight()
- - mDefaultControlLayout.getMeasuredHeight();
- // Maximum allowed height for controls to fit screen.
- int maximumControlViewHeight = visibleRect.height() - nonControlViewHeight;
-
- // Show artwork if it fits the screen.
- if (mCustomControlView == null && artViewHeight > 0
- && desiredControlLayoutHeight <= maximumControlViewHeight) {
- mArtView.setVisibility(View.VISIBLE);
- setLayoutHeight(mArtView, artViewHeight);
- } else {
- if (getLayoutHeight(mVolumeGroupList) + mMediaMainControlLayout.getMeasuredHeight()
- >= mDefaultControlLayout.getMeasuredHeight()) {
- mArtView.setVisibility(View.GONE);
- }
- artViewHeight = 0;
- desiredControlLayoutHeight = visibleGroupListHeight + mainControllerHeight;
- }
- // Show the playback control if it fits the screen.
- if (canShowPlaybackControlLayout()
- && desiredControlLayoutHeight <= maximumControlViewHeight) {
- mPlaybackControlLayout.setVisibility(View.VISIBLE);
- } else {
- mPlaybackControlLayout.setVisibility(View.GONE);
- }
- updateMediaControlVisibility(mPlaybackControlLayout.getVisibility() == View.VISIBLE);
- mainControllerHeight = getMainControllerHeight(
- mPlaybackControlLayout.getVisibility() == View.VISIBLE);
- desiredControlLayoutHeight =
- Math.max(artViewHeight, visibleGroupListHeight) + mainControllerHeight;
-
- // Limit the volume group list height to fit the screen.
- if (desiredControlLayoutHeight > maximumControlViewHeight) {
- visibleGroupListHeight -= (desiredControlLayoutHeight - maximumControlViewHeight);
- desiredControlLayoutHeight = maximumControlViewHeight;
- }
- // Update the layouts with the computed heights.
- mMediaMainControlLayout.clearAnimation();
- mVolumeGroupList.clearAnimation();
- mDefaultControlLayout.clearAnimation();
- if (animate) {
- animateLayoutHeight(mMediaMainControlLayout, mainControllerHeight);
- animateLayoutHeight(mVolumeGroupList, visibleGroupListHeight);
- animateLayoutHeight(mDefaultControlLayout, desiredControlLayoutHeight);
- } else {
- setLayoutHeight(mMediaMainControlLayout, mainControllerHeight);
- setLayoutHeight(mVolumeGroupList, visibleGroupListHeight);
- setLayoutHeight(mDefaultControlLayout, desiredControlLayoutHeight);
- }
- // Maximize the window size with a transparent layout in advance for smooth animation.
- setLayoutHeight(mExpandableAreaLayout, visibleRect.height());
- rebuildVolumeGroupList(animate);
- }
-
- void updateVolumeGroupItemHeight(View item) {
- LinearLayout container = (LinearLayout) item.findViewById(R.id.volume_item_container);
- setLayoutHeight(container, mVolumeGroupListItemHeight);
- View icon = item.findViewById(R.id.mr_volume_item_icon);
- ViewGroup.LayoutParams lp = icon.getLayoutParams();
- lp.width = mVolumeGroupListItemIconSize;
- lp.height = mVolumeGroupListItemIconSize;
- icon.setLayoutParams(lp);
- }
-
- private void animateLayoutHeight(final View view, int targetHeight) {
- final int startValue = getLayoutHeight(view);
- final int endValue = targetHeight;
- Animation anim = new Animation() {
- @Override
- protected void applyTransformation(float interpolatedTime, Transformation t) {
- int height = startValue - (int) ((startValue - endValue) * interpolatedTime);
- setLayoutHeight(view, height);
- }
- };
- anim.setDuration(mGroupListAnimationDurationMs);
- if (android.os.Build.VERSION.SDK_INT >= 21) {
- anim.setInterpolator(mInterpolator);
- }
- view.startAnimation(anim);
- }
-
- void loadInterpolator() {
- mInterpolator =
- mIsGroupExpanded ? mLinearOutSlowInInterpolator : mFastOutSlowInInterpolator;
- }
-
- private void updateVolumeControlLayout() {
- if (isVolumeControlAvailable(mRoute)) {
- if (mVolumeControlLayout.getVisibility() == View.GONE) {
- mVolumeControlLayout.setVisibility(View.VISIBLE);
- mVolumeSlider.setMax(mRoute.getVolumeMax());
- mVolumeSlider.setProgress(mRoute.getVolume());
- mGroupExpandCollapseButton.setVisibility(getGroup() == null ? View.GONE
- : View.VISIBLE);
- }
- } else {
- mVolumeControlLayout.setVisibility(View.GONE);
- }
- }
-
- private void rebuildVolumeGroupList(boolean animate) {
- List<MediaRouter.RouteInfo> routes = getGroup() == null ? null : getGroup().getRoutes();
- if (routes == null) {
- mGroupMemberRoutes.clear();
- mVolumeGroupAdapter.notifyDataSetChanged();
- } else if (MediaRouteDialogHelper.listUnorderedEquals(mGroupMemberRoutes, routes)) {
- mVolumeGroupAdapter.notifyDataSetChanged();
- } else {
- HashMap<MediaRouter.RouteInfo, Rect> previousRouteBoundMap = animate
- ? MediaRouteDialogHelper.getItemBoundMap(mVolumeGroupList, mVolumeGroupAdapter)
- : null;
- HashMap<MediaRouter.RouteInfo, BitmapDrawable> previousRouteBitmapMap = animate
- ? MediaRouteDialogHelper.getItemBitmapMap(mContext, mVolumeGroupList,
- mVolumeGroupAdapter) : null;
- mGroupMemberRoutesAdded =
- MediaRouteDialogHelper.getItemsAdded(mGroupMemberRoutes, routes);
- mGroupMemberRoutesRemoved = MediaRouteDialogHelper.getItemsRemoved(mGroupMemberRoutes,
- routes);
- mGroupMemberRoutes.addAll(0, mGroupMemberRoutesAdded);
- mGroupMemberRoutes.removeAll(mGroupMemberRoutesRemoved);
- mVolumeGroupAdapter.notifyDataSetChanged();
- if (animate && mIsGroupExpanded
- && mGroupMemberRoutesAdded.size() + mGroupMemberRoutesRemoved.size() > 0) {
- animateGroupListItems(previousRouteBoundMap, previousRouteBitmapMap);
- } else {
- mGroupMemberRoutesAdded = null;
- mGroupMemberRoutesRemoved = null;
- }
- }
- }
-
- private void animateGroupListItems(final Map<MediaRouter.RouteInfo, Rect> previousRouteBoundMap,
- final Map<MediaRouter.RouteInfo, BitmapDrawable> previousRouteBitmapMap) {
- mVolumeGroupList.setEnabled(false);
- mVolumeGroupList.requestLayout();
- mIsGroupListAnimating = true;
- ViewTreeObserver observer = mVolumeGroupList.getViewTreeObserver();
- observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- mVolumeGroupList.getViewTreeObserver().removeGlobalOnLayoutListener(this);
- animateGroupListItemsInternal(previousRouteBoundMap, previousRouteBitmapMap);
- }
- });
- }
-
- void animateGroupListItemsInternal(
- Map<MediaRouter.RouteInfo, Rect> previousRouteBoundMap,
- Map<MediaRouter.RouteInfo, BitmapDrawable> previousRouteBitmapMap) {
- if (mGroupMemberRoutesAdded == null || mGroupMemberRoutesRemoved == null) {
- return;
- }
- int groupSizeDelta = mGroupMemberRoutesAdded.size() - mGroupMemberRoutesRemoved.size();
- boolean listenerRegistered = false;
- Animation.AnimationListener listener = new Animation.AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) {
- mVolumeGroupList.startAnimationAll();
- mVolumeGroupList.postDelayed(mGroupListFadeInAnimation,
- mGroupListAnimationDurationMs);
- }
-
- @Override
- public void onAnimationEnd(Animation animation) { }
-
- @Override
- public void onAnimationRepeat(Animation animation) { }
- };
-
- // Animate visible items from previous positions to current positions except routes added
- // just before. Added routes will remain hidden until translate animation finishes.
- int first = mVolumeGroupList.getFirstVisiblePosition();
- for (int i = 0; i < mVolumeGroupList.getChildCount(); ++i) {
- View view = mVolumeGroupList.getChildAt(i);
- int position = first + i;
- MediaRouter.RouteInfo route = mVolumeGroupAdapter.getItem(position);
- Rect previousBounds = previousRouteBoundMap.get(route);
- int currentTop = view.getTop();
- int previousTop = previousBounds != null ? previousBounds.top
- : (currentTop + mVolumeGroupListItemHeight * groupSizeDelta);
- AnimationSet animSet = new AnimationSet(true);
- if (mGroupMemberRoutesAdded != null && mGroupMemberRoutesAdded.contains(route)) {
- previousTop = currentTop;
- Animation alphaAnim = new AlphaAnimation(0.0f, 0.0f);
- alphaAnim.setDuration(mGroupListFadeInDurationMs);
- animSet.addAnimation(alphaAnim);
- }
- Animation translationAnim = new TranslateAnimation(0, 0, previousTop - currentTop, 0);
- translationAnim.setDuration(mGroupListAnimationDurationMs);
- animSet.addAnimation(translationAnim);
- animSet.setFillAfter(true);
- animSet.setFillEnabled(true);
- animSet.setInterpolator(mInterpolator);
- if (!listenerRegistered) {
- listenerRegistered = true;
- animSet.setAnimationListener(listener);
- }
- view.clearAnimation();
- view.startAnimation(animSet);
- previousRouteBoundMap.remove(route);
- previousRouteBitmapMap.remove(route);
- }
-
- // If a member route doesn't exist any longer, it can be either removed or moved out of the
- // ListView layout boundary. In this case, use the previously captured bitmaps for
- // animation.
- for (Map.Entry<MediaRouter.RouteInfo, BitmapDrawable> item
- : previousRouteBitmapMap.entrySet()) {
- final MediaRouter.RouteInfo route = item.getKey();
- final BitmapDrawable bitmap = item.getValue();
- final Rect bounds = previousRouteBoundMap.get(route);
- OverlayObject object = null;
- if (mGroupMemberRoutesRemoved.contains(route)) {
- object = new OverlayObject(bitmap, bounds).setAlphaAnimation(1.0f, 0.0f)
- .setDuration(mGroupListFadeOutDurationMs)
- .setInterpolator(mInterpolator);
- } else {
- int deltaY = groupSizeDelta * mVolumeGroupListItemHeight;
- object = new OverlayObject(bitmap, bounds).setTranslateYAnimation(deltaY)
- .setDuration(mGroupListAnimationDurationMs)
- .setInterpolator(mInterpolator)
- .setAnimationEndListener(new OverlayObject.OnAnimationEndListener() {
- @Override
- public void onAnimationEnd() {
- mGroupMemberRoutesAnimatingWithBitmap.remove(route);
- mVolumeGroupAdapter.notifyDataSetChanged();
- }
- });
- mGroupMemberRoutesAnimatingWithBitmap.add(route);
- }
- mVolumeGroupList.addOverlayObject(object);
- }
- }
-
- void startGroupListFadeInAnimation() {
- clearGroupListAnimation(true);
- mVolumeGroupList.requestLayout();
- ViewTreeObserver observer = mVolumeGroupList.getViewTreeObserver();
- observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- mVolumeGroupList.getViewTreeObserver().removeGlobalOnLayoutListener(this);
- startGroupListFadeInAnimationInternal();
- }
- });
- }
-
- void startGroupListFadeInAnimationInternal() {
- if (mGroupMemberRoutesAdded != null && mGroupMemberRoutesAdded.size() != 0) {
- fadeInAddedRoutes();
- } else {
- finishAnimation(true);
- }
- }
-
- void finishAnimation(boolean animate) {
- mGroupMemberRoutesAdded = null;
- mGroupMemberRoutesRemoved = null;
- mIsGroupListAnimating = false;
- if (mIsGroupListAnimationPending) {
- mIsGroupListAnimationPending = false;
- updateLayoutHeight(animate);
- }
- mVolumeGroupList.setEnabled(true);
- }
-
- private void fadeInAddedRoutes() {
- Animation.AnimationListener listener = new Animation.AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) { }
-
- @Override
- public void onAnimationEnd(Animation animation) {
- finishAnimation(true);
- }
-
- @Override
- public void onAnimationRepeat(Animation animation) { }
- };
- boolean listenerRegistered = false;
- int first = mVolumeGroupList.getFirstVisiblePosition();
- for (int i = 0; i < mVolumeGroupList.getChildCount(); ++i) {
- View view = mVolumeGroupList.getChildAt(i);
- int position = first + i;
- MediaRouter.RouteInfo route = mVolumeGroupAdapter.getItem(position);
- if (mGroupMemberRoutesAdded.contains(route)) {
- Animation alphaAnim = new AlphaAnimation(0.0f, 1.0f);
- alphaAnim.setDuration(mGroupListFadeInDurationMs);
- alphaAnim.setFillEnabled(true);
- alphaAnim.setFillAfter(true);
- if (!listenerRegistered) {
- listenerRegistered = true;
- alphaAnim.setAnimationListener(listener);
- }
- view.clearAnimation();
- view.startAnimation(alphaAnim);
- }
- }
- }
-
- void clearGroupListAnimation(boolean exceptAddedRoutes) {
- int first = mVolumeGroupList.getFirstVisiblePosition();
- for (int i = 0; i < mVolumeGroupList.getChildCount(); ++i) {
- View view = mVolumeGroupList.getChildAt(i);
- int position = first + i;
- MediaRouter.RouteInfo route = mVolumeGroupAdapter.getItem(position);
- if (exceptAddedRoutes && mGroupMemberRoutesAdded != null
- && mGroupMemberRoutesAdded.contains(route)) {
- continue;
- }
- LinearLayout container = (LinearLayout) view.findViewById(R.id.volume_item_container);
- container.setVisibility(View.VISIBLE);
- AnimationSet animSet = new AnimationSet(true);
- Animation alphaAnim = new AlphaAnimation(1.0f, 1.0f);
- alphaAnim.setDuration(0);
- animSet.addAnimation(alphaAnim);
- Animation translationAnim = new TranslateAnimation(0, 0, 0, 0);
- translationAnim.setDuration(0);
- animSet.setFillAfter(true);
- animSet.setFillEnabled(true);
- view.clearAnimation();
- view.startAnimation(animSet);
- }
- mVolumeGroupList.stopAnimationAll();
- if (!exceptAddedRoutes) {
- finishAnimation(false);
- }
- }
-
- private void updatePlaybackControlLayout() {
- if (canShowPlaybackControlLayout()) {
- CharSequence title = mDescription == null ? null : mDescription.getTitle();
- boolean hasTitle = !TextUtils.isEmpty(title);
-
- CharSequence subtitle = mDescription == null ? null : mDescription.getSubtitle();
- boolean hasSubtitle = !TextUtils.isEmpty(subtitle);
-
- boolean showTitle = false;
- boolean showSubtitle = false;
- if (mRoute.getPresentationDisplayId()
- != MediaRouter.RouteInfo.PRESENTATION_DISPLAY_ID_NONE) {
- // The user is currently casting screen.
- mTitleView.setText(ApiHelper.getLibResources(mContext).getString(
- R.string.mr_controller_casting_screen));
- showTitle = true;
- } else if (mState == null || mState.getState() == PlaybackStateCompat.STATE_NONE) {
- // Show "No media selected" as we don't yet know the playback state.
- mTitleView.setText(ApiHelper.getLibResources(mContext).getString(
- R.string.mr_controller_no_media_selected));
- showTitle = true;
- } else if (!hasTitle && !hasSubtitle) {
- mTitleView.setText(ApiHelper.getLibResources(mContext).getString(
- R.string.mr_controller_no_info_available));
- showTitle = true;
- } else {
- if (hasTitle) {
- mTitleView.setText(title);
- showTitle = true;
- }
- if (hasSubtitle) {
- mSubtitleView.setText(subtitle);
- showSubtitle = true;
- }
- }
- mTitleView.setVisibility(showTitle ? View.VISIBLE : View.GONE);
- mSubtitleView.setVisibility(showSubtitle ? View.VISIBLE : View.GONE);
-
- if (mState != null) {
- boolean isPlaying = mState.getState() == PlaybackStateCompat.STATE_BUFFERING
- || mState.getState() == PlaybackStateCompat.STATE_PLAYING;
- Context playbackControlButtonContext = mPlaybackControlButton.getContext();
- boolean visible = true;
- int iconDrawableAttr = 0;
- int iconDescResId = 0;
- if (isPlaying && isPauseActionSupported()) {
- iconDrawableAttr = R.attr.mediaRoutePauseDrawable;
- iconDescResId = R.string.mr_controller_pause;
- } else if (isPlaying && isStopActionSupported()) {
- iconDrawableAttr = R.attr.mediaRouteStopDrawable;
- iconDescResId = R.string.mr_controller_stop;
- } else if (!isPlaying && isPlayActionSupported()) {
- iconDrawableAttr = R.attr.mediaRoutePlayDrawable;
- iconDescResId = R.string.mr_controller_play;
- } else {
- visible = false;
- }
- mPlaybackControlButton.setVisibility(visible ? View.VISIBLE : View.GONE);
- if (visible) {
- mPlaybackControlButton.setImageResource(
- MediaRouterThemeHelper.getThemeResource(
- playbackControlButtonContext, iconDrawableAttr));
- mPlaybackControlButton.setContentDescription(
- playbackControlButtonContext.getResources()
- .getText(iconDescResId));
- }
- }
- }
- }
-
- private boolean isPlayActionSupported() {
- return (mState.getActions() & (ACTION_PLAY | ACTION_PLAY_PAUSE)) != 0;
- }
-
- private boolean isPauseActionSupported() {
- return (mState.getActions() & (ACTION_PAUSE | ACTION_PLAY_PAUSE)) != 0;
- }
-
- private boolean isStopActionSupported() {
- return (mState.getActions() & ACTION_STOP) != 0;
- }
-
- boolean isVolumeControlAvailable(MediaRouter.RouteInfo route) {
- return mVolumeControlEnabled && route.getVolumeHandling()
- == MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE;
- }
-
- private static int getLayoutHeight(View view) {
- return view.getLayoutParams().height;
- }
-
- static void setLayoutHeight(View view, int height) {
- ViewGroup.LayoutParams lp = view.getLayoutParams();
- lp.height = height;
- view.setLayoutParams(lp);
- }
-
- private static boolean uriEquals(Uri uri1, Uri uri2) {
- if (uri1 != null && uri1.equals(uri2)) {
- return true;
- } else if (uri1 == null && uri2 == null) {
- return true;
- }
- return false;
- }
-
- /**
- * Returns desired art height to fit into controller dialog.
- */
- int getDesiredArtHeight(int originalWidth, int originalHeight) {
- if (originalWidth >= originalHeight) {
- // For landscape art, fit width to dialog width.
- return (int) ((float) mDialogContentWidth * originalHeight / originalWidth + 0.5f);
- }
- // For portrait art, fit height to 16:9 ratio case's height.
- return (int) ((float) mDialogContentWidth * 9 / 16 + 0.5f);
- }
-
- void updateArtIconIfNeeded() {
- if (mCustomControlView != null || !isIconChanged()) {
- return;
- }
- if (mFetchArtTask != null) {
- mFetchArtTask.cancel(true);
- }
- mFetchArtTask = new FetchArtTask();
- mFetchArtTask.execute();
- }
-
- /**
- * Clear the bitmap loaded by FetchArtTask. Will be called after the loaded bitmaps are applied
- * to artwork, or no longer valid.
- */
- void clearLoadedBitmap() {
- mArtIconIsLoaded = false;
- mArtIconLoadedBitmap = null;
- mArtIconBackgroundColor = 0;
- }
-
- /**
- * Returns whether a new art image is different from an original art image. Compares
- * Bitmap objects first, and then compares URIs only if bitmap is unchanged with
- * a null value.
- */
- private boolean isIconChanged() {
- Bitmap newBitmap = mDescription == null ? null : mDescription.getIconBitmap();
- Uri newUri = mDescription == null ? null : mDescription.getIconUri();
- Bitmap oldBitmap = mFetchArtTask == null ? mArtIconBitmap : mFetchArtTask.getIconBitmap();
- Uri oldUri = mFetchArtTask == null ? mArtIconUri : mFetchArtTask.getIconUri();
- if (oldBitmap != newBitmap) {
- return true;
- } else if (oldBitmap == null && !uriEquals(oldUri, newUri)) {
- return true;
- }
- return false;
- }
-
- private final class MediaRouterCallback extends MediaRouter.Callback {
- MediaRouterCallback() {
- }
-
- @Override
- public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) {
- update(false);
- }
-
- @Override
- public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo route) {
- update(true);
- }
-
- @Override
- public void onRouteVolumeChanged(MediaRouter router, MediaRouter.RouteInfo route) {
- SeekBar volumeSlider = mVolumeSliderMap.get(route);
- int volume = route.getVolume();
- if (DEBUG) {
- Log.d(TAG, "onRouteVolumeChanged(), route.getVolume:" + volume);
- }
- if (volumeSlider != null && mRouteInVolumeSliderTouched != route) {
- volumeSlider.setProgress(volume);
- }
- }
- }
-
- private final class MediaControllerCallback extends MediaControllerCompat.Callback {
- MediaControllerCallback() {
- }
-
- @Override
- public void onSessionDestroyed() {
- if (mMediaController != null) {
- mMediaController.unregisterCallback(mControllerCallback);
- mMediaController = null;
- }
- }
-
- @Override
- public void onPlaybackStateChanged(PlaybackStateCompat state) {
- mState = state;
- update(false);
- }
-
- @Override
- public void onMetadataChanged(MediaMetadataCompat metadata) {
- mDescription = metadata == null ? null : metadata.getDescription();
- updateArtIconIfNeeded();
- update(false);
- }
- }
-
- private final class ClickListener implements View.OnClickListener {
- ClickListener() {
- }
-
- @Override
- public void onClick(View v) {
- int id = v.getId();
- if (id == BUTTON_STOP_RES_ID || id == BUTTON_DISCONNECT_RES_ID) {
- if (mRoute.isSelected()) {
- mRouter.unselect(id == BUTTON_STOP_RES_ID ?
- MediaRouter.UNSELECT_REASON_STOPPED :
- MediaRouter.UNSELECT_REASON_DISCONNECTED);
- }
- dismiss();
- } else if (id == R.id.mr_control_playback_ctrl) {
- if (mMediaController != null && mState != null) {
- boolean isPlaying = mState.getState() == PlaybackStateCompat.STATE_PLAYING;
- int actionDescResId = 0;
- if (isPlaying && isPauseActionSupported()) {
- mMediaController.getTransportControls().pause();
- actionDescResId = R.string.mr_controller_pause;
- } else if (isPlaying && isStopActionSupported()) {
- mMediaController.getTransportControls().stop();
- actionDescResId = R.string.mr_controller_stop;
- } else if (!isPlaying && isPlayActionSupported()){
- mMediaController.getTransportControls().play();
- actionDescResId = R.string.mr_controller_play;
- }
- // Announce the action for accessibility.
- if (mAccessibilityManager != null && mAccessibilityManager.isEnabled()
- && actionDescResId != 0) {
- AccessibilityEvent event = AccessibilityEvent.obtain(
- AccessibilityEventCompat.TYPE_ANNOUNCEMENT);
- event.setPackageName(mContext.getPackageName());
- event.setClassName(getClass().getName());
- event.getText().add(
- ApiHelper.getLibResources(mContext).getString(actionDescResId));
- mAccessibilityManager.sendAccessibilityEvent(event);
- }
- }
- } else if (id == R.id.mr_close) {
- dismiss();
- }
- }
- }
-
- private class VolumeChangeListener implements SeekBar.OnSeekBarChangeListener {
- private final Runnable mStopTrackingTouch = new Runnable() {
- @Override
- public void run() {
- if (mRouteInVolumeSliderTouched != null) {
- mRouteInVolumeSliderTouched = null;
- if (mHasPendingUpdate) {
- update(mPendingUpdateAnimationNeeded);
- }
- }
- }
- };
-
- VolumeChangeListener() {
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- if (mRouteInVolumeSliderTouched != null) {
- mVolumeSlider.removeCallbacks(mStopTrackingTouch);
- }
- mRouteInVolumeSliderTouched = (MediaRouter.RouteInfo) seekBar.getTag();
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- // Defer resetting mVolumeSliderTouched to allow the media route provider
- // a little time to settle into its new state and publish the final
- // volume update.
- mVolumeSlider.postDelayed(mStopTrackingTouch, VOLUME_UPDATE_DELAY_MILLIS);
- }
-
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- if (fromUser) {
- MediaRouter.RouteInfo route = (MediaRouter.RouteInfo) seekBar.getTag();
- if (DEBUG) {
- Log.d(TAG, "onProgressChanged(): calling "
- + "MediaRouter.RouteInfo.requestSetVolume(" + progress + ")");
- }
- route.requestSetVolume(progress);
- }
- }
- }
-
- private class VolumeGroupAdapter extends ArrayAdapter<MediaRouter.RouteInfo> {
- final float mDisabledAlpha;
-
- public VolumeGroupAdapter(Context context, List<MediaRouter.RouteInfo> objects) {
- super(context, 0, objects);
- mDisabledAlpha = MediaRouterThemeHelper.getDisabledAlpha(context);
- }
-
- @Override
- public boolean isEnabled(int position) {
- return false;
- }
-
- @Override
- public View getView(final int position, View convertView, ViewGroup parent) {
- View v = convertView;
- if (v == null) {
- v = LayoutInflater.from(parent.getContext()).inflate(
- R.layout.mr_controller_volume_item, parent, false);
- } else {
- updateVolumeGroupItemHeight(v);
- }
-
- MediaRouter.RouteInfo route = getItem(position);
- if (route != null) {
- boolean isEnabled = route.isEnabled();
-
- TextView routeName = (TextView) v.findViewById(R.id.mr_name);
- routeName.setEnabled(isEnabled);
- routeName.setText(route.getName());
-
- MediaRouteVolumeSlider volumeSlider =
- (MediaRouteVolumeSlider) v.findViewById(R.id.mr_volume_slider);
- MediaRouterThemeHelper.setVolumeSliderColor(
- parent.getContext(), volumeSlider, mVolumeGroupList);
- volumeSlider.setTag(route);
- mVolumeSliderMap.put(route, volumeSlider);
- volumeSlider.setHideThumb(!isEnabled);
- volumeSlider.setEnabled(isEnabled);
- if (isEnabled) {
- if (isVolumeControlAvailable(route)) {
- volumeSlider.setMax(route.getVolumeMax());
- volumeSlider.setProgress(route.getVolume());
- volumeSlider.setOnSeekBarChangeListener(mVolumeChangeListener);
- } else {
- volumeSlider.setMax(100);
- volumeSlider.setProgress(100);
- volumeSlider.setEnabled(false);
- }
- }
-
- ImageView volumeItemIcon =
- (ImageView) v.findViewById(R.id.mr_volume_item_icon);
- volumeItemIcon.setAlpha(isEnabled ? 0xFF : (int) (0xFF * mDisabledAlpha));
-
- // If overlay bitmap exists, real view should remain hidden until
- // the animation ends.
- LinearLayout container = (LinearLayout) v.findViewById(R.id.volume_item_container);
- container.setVisibility(mGroupMemberRoutesAnimatingWithBitmap.contains(route)
- ? View.INVISIBLE : View.VISIBLE);
-
- // Routes which are being added will be invisible until animation ends.
- if (mGroupMemberRoutesAdded != null && mGroupMemberRoutesAdded.contains(route)) {
- Animation alphaAnim = new AlphaAnimation(0.0f, 0.0f);
- alphaAnim.setDuration(0);
- alphaAnim.setFillEnabled(true);
- alphaAnim.setFillAfter(true);
- v.clearAnimation();
- v.startAnimation(alphaAnim);
- }
- }
- return v;
- }
- }
-
- private class FetchArtTask extends AsyncTask<Void, Void, Bitmap> {
- // Show animation only when fetching takes a long time.
- private static final long SHOW_ANIM_TIME_THRESHOLD_MILLIS = 120L;
-
- private final Bitmap mIconBitmap;
- private final Uri mIconUri;
- private int mBackgroundColor;
- private long mStartTimeMillis;
-
- FetchArtTask() {
- Bitmap bitmap = mDescription == null ? null : mDescription.getIconBitmap();
- if (isBitmapRecycled(bitmap)) {
- Log.w(TAG, "Can't fetch the given art bitmap because it's already recycled.");
- bitmap = null;
- }
- mIconBitmap = bitmap;
- mIconUri = mDescription == null ? null : mDescription.getIconUri();
- }
-
- public Bitmap getIconBitmap() {
- return mIconBitmap;
- }
-
- public Uri getIconUri() {
- return mIconUri;
- }
-
- @Override
- protected void onPreExecute() {
- mStartTimeMillis = SystemClock.uptimeMillis();
- clearLoadedBitmap();
- }
-
- @Override
- protected Bitmap doInBackground(Void... arg) {
- Bitmap art = null;
- if (mIconBitmap != null) {
- art = mIconBitmap;
- } else if (mIconUri != null) {
- InputStream stream = null;
- try {
- if ((stream = openInputStreamByScheme(mIconUri)) == null) {
- Log.w(TAG, "Unable to open: " + mIconUri);
- return null;
- }
- // Query art size.
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true;
- BitmapFactory.decodeStream(stream, null, options);
- if (options.outWidth == 0 || options.outHeight == 0) {
- return null;
- }
- // Rewind the stream in order to restart art decoding.
- try {
- stream.reset();
- } catch (IOException e) {
- // Failed to rewind the stream, try to reopen it.
- stream.close();
- if ((stream = openInputStreamByScheme(mIconUri)) == null) {
- Log.w(TAG, "Unable to open: " + mIconUri);
- return null;
- }
- }
- // Calculate required size to decode the art and possibly resize it.
- options.inJustDecodeBounds = false;
- int reqHeight = getDesiredArtHeight(options.outWidth, options.outHeight);
- int ratio = options.outHeight / reqHeight;
- options.inSampleSize = Math.max(1, Integer.highestOneBit(ratio));
- if (isCancelled()) {
- return null;
- }
- art = BitmapFactory.decodeStream(stream, null, options);
- } catch (IOException e){
- Log.w(TAG, "Unable to open: " + mIconUri, e);
- } finally {
- if (stream != null) {
- try {
- stream.close();
- } catch (IOException e) {
- }
- }
- }
- }
- if (isBitmapRecycled(art)) {
- Log.w(TAG, "Can't use recycled bitmap: " + art);
- return null;
- }
- if (art != null && art.getWidth() < art.getHeight()) {
- // Portrait art requires dominant color as background color.
- Palette palette = new Palette.Builder(art).maximumColorCount(1).generate();
- mBackgroundColor = palette.getSwatches().isEmpty()
- ? 0 : palette.getSwatches().get(0).getRgb();
- }
- return art;
- }
-
- @Override
- protected void onPostExecute(Bitmap art) {
- mFetchArtTask = null;
- if (!ObjectsCompat.equals(mArtIconBitmap, mIconBitmap)
- || !ObjectsCompat.equals(mArtIconUri, mIconUri)) {
- mArtIconBitmap = mIconBitmap;
- mArtIconLoadedBitmap = art;
- mArtIconUri = mIconUri;
- mArtIconBackgroundColor = mBackgroundColor;
- mArtIconIsLoaded = true;
- long elapsedTimeMillis = SystemClock.uptimeMillis() - mStartTimeMillis;
- // Loaded bitmap will be applied on the next update
- update(elapsedTimeMillis > SHOW_ANIM_TIME_THRESHOLD_MILLIS);
- }
- }
-
- private InputStream openInputStreamByScheme(Uri uri) throws IOException {
- String scheme = uri.getScheme().toLowerCase();
- InputStream stream = null;
- if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)
- || ContentResolver.SCHEME_CONTENT.equals(scheme)
- || ContentResolver.SCHEME_FILE.equals(scheme)) {
- stream = mContext.getContentResolver().openInputStream(uri);
- } else {
- URL url = new URL(uri.toString());
- URLConnection conn = url.openConnection();
- conn.setConnectTimeout(CONNECTION_TIMEOUT_MILLIS);
- conn.setReadTimeout(CONNECTION_TIMEOUT_MILLIS);
- stream = conn.getInputStream();
- }
- return (stream == null) ? null : new BufferedInputStream(stream);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteControllerDialogFragment.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteControllerDialogFragment.java
deleted file mode 100644
index 215d74f..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteControllerDialogFragment.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.os.Bundle;
-
-/**
- * Media route controller dialog fragment.
- * <p>
- * Creates a {@link MediaRouteControllerDialog}. The application may subclass
- * this dialog fragment to customize the media route controller dialog.
- * </p>
- */
-public class MediaRouteControllerDialogFragment extends DialogFragment {
- private MediaRouteControllerDialog mDialog;
- /**
- * Creates a media route controller dialog fragment.
- * <p>
- * All subclasses of this class must also possess a default constructor.
- * </p>
- */
- public MediaRouteControllerDialogFragment() {
- setCancelable(true);
- }
-
- /**
- * Called when the controller dialog is being created.
- * <p>
- * Subclasses may override this method to customize the dialog.
- * </p>
- */
- public MediaRouteControllerDialog onCreateControllerDialog(
- Context context, Bundle savedInstanceState) {
- return new MediaRouteControllerDialog(context);
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- mDialog = onCreateControllerDialog(getContext(), savedInstanceState);
- return mDialog;
- }
-
- @Override
- public void onStop() {
- super.onStop();
- if (mDialog != null) {
- mDialog.clearGroupListAnimation(false);
- }
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- if (mDialog != null) {
- mDialog.updateLayout();
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDialogFactory.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDialogFactory.java
deleted file mode 100644
index b5ee63e..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDialogFactory.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import androidx.annotation.NonNull;
-
-/**
- * The media route dialog factory is responsible for creating the media route
- * chooser and controller dialogs as needed.
- * <p>
- * The application can customize the dialogs by providing a subclass of the
- * dialog factory to the {@link MediaRouteButton} using the
- * {@link MediaRouteButton#setDialogFactory setDialogFactory} method.
- * </p>
- */
-public class MediaRouteDialogFactory {
- private static final MediaRouteDialogFactory sDefault = new MediaRouteDialogFactory();
-
- /**
- * Creates a default media route dialog factory.
- */
- public MediaRouteDialogFactory() {
- }
-
- /**
- * Gets the default factory instance.
- *
- * @return The default media route dialog factory, never null.
- */
- @NonNull
- public static MediaRouteDialogFactory getDefault() {
- return sDefault;
- }
-
- /**
- * Called when the chooser dialog is being opened and it is time to create the fragment.
- * <p>
- * Subclasses may override this method to create a customized fragment.
- * </p>
- *
- * @return The media route chooser dialog fragment, must not be null.
- */
- @NonNull
- public MediaRouteChooserDialogFragment onCreateChooserDialogFragment() {
- return new MediaRouteChooserDialogFragment();
- }
-
- /**
- * Called when the controller dialog is being opened and it is time to create the fragment.
- * <p>
- * Subclasses may override this method to create a customized fragment.
- * </p>
- *
- * @return The media route controller dialog fragment, must not be null.
- */
- @NonNull
- public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() {
- return new MediaRouteControllerDialogFragment();
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDialogHelper.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDialogHelper.java
deleted file mode 100644
index 9aabf7b..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDialogHelper.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.util.DisplayMetrics;
-import android.util.TypedValue;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-final class MediaRouteDialogHelper {
- /**
- * The framework should set the dialog width properly, but somehow it doesn't work, hence
- * duplicating a similar logic here to determine the appropriate dialog width.
- */
- public static int getDialogWidth(Context context) {
- DisplayMetrics metrics = ApiHelper.getLibResources(context).getDisplayMetrics();
- boolean isPortrait = metrics.widthPixels < metrics.heightPixels;
-
- TypedValue value = new TypedValue();
- ApiHelper.getLibResources(context).getValue(isPortrait
- ? R.dimen.mr_dialog_fixed_width_minor
- : R.dimen.mr_dialog_fixed_width_major, value, true);
- if (value.type == TypedValue.TYPE_DIMENSION) {
- return (int) value.getDimension(metrics);
- } else if (value.type == TypedValue.TYPE_FRACTION) {
- return (int) value.getFraction(metrics.widthPixels, metrics.widthPixels);
- }
- return ViewGroup.LayoutParams.WRAP_CONTENT;
- }
-
- /**
- * Compares two lists regardless of order.
- *
- * @param list1 A list
- * @param list2 A list to be compared with {@code list1}
- * @return True if two lists have exactly same items regardless of order, false otherwise.
- */
- public static <E> boolean listUnorderedEquals(List<E> list1, List<E> list2) {
- HashSet<E> set1 = new HashSet<>(list1);
- HashSet<E> set2 = new HashSet<>(list2);
- return set1.equals(set2);
- }
-
- /**
- * Compares two lists and returns a set of items which exist
- * after-list but before-list, which means newly added items.
- *
- * @param before A list
- * @param after A list to be compared with {@code before}
- * @return A set of items which contains newly added items while
- * comparing {@code after} to {@code before}.
- */
- public static <E> Set<E> getItemsAdded(List<E> before, List<E> after) {
- HashSet<E> set = new HashSet<>(after);
- set.removeAll(before);
- return set;
- }
-
- /**
- * Compares two lists and returns a set of items which exist
- * before-list but after-list, which means removed items.
- *
- * @param before A list
- * @param after A list to be compared with {@code before}
- * @return A set of items which contains removed items while
- * comparing {@code after} to {@code before}.
- */
- public static <E> Set<E> getItemsRemoved(List<E> before, List<E> after) {
- HashSet<E> set = new HashSet<>(before);
- set.removeAll(after);
- return set;
- }
-
- /**
- * Generates an item-Rect map which indicates where member
- * items are located in the given ListView.
- *
- * @param listView A list view
- * @param adapter An array adapter which contains an array of items.
- * @return A map of items and bounds of their views located in the given list view.
- */
- public static <E> HashMap<E, Rect> getItemBoundMap(ListView listView,
- ArrayAdapter<E> adapter) {
- HashMap<E, Rect> itemBoundMap = new HashMap<>();
- int firstVisiblePosition = listView.getFirstVisiblePosition();
- for (int i = 0; i < listView.getChildCount(); ++i) {
- int position = firstVisiblePosition + i;
- E item = adapter.getItem(position);
- View view = listView.getChildAt(i);
- itemBoundMap.put(item,
- new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()));
- }
- return itemBoundMap;
- }
-
- /**
- * Generates an item-BitmapDrawable map which stores snapshots
- * of member items in the given ListView.
- *
- * @param context A context
- * @param listView A list view
- * @param adapter An array adapter which contains an array of items.
- * @return A map of items and snapshots of their views in the given list view.
- */
- public static <E> HashMap<E, BitmapDrawable> getItemBitmapMap(Context context,
- ListView listView, ArrayAdapter<E> adapter) {
- HashMap<E, BitmapDrawable> itemBitmapMap = new HashMap<>();
- int firstVisiblePosition = listView.getFirstVisiblePosition();
- for (int i = 0; i < listView.getChildCount(); ++i) {
- int position = firstVisiblePosition + i;
- E item = adapter.getItem(position);
- View view = listView.getChildAt(i);
- itemBitmapMap.put(item, getViewBitmap(context, view));
- }
- return itemBitmapMap;
- }
-
- private static BitmapDrawable getViewBitmap(Context context, View view) {
- Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
- Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- view.draw(canvas);
- return new BitmapDrawable(context.getResources(), bitmap);
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDiscoveryFragment.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDiscoveryFragment.java
deleted file mode 100644
index 52aecd88..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteDiscoveryFragment.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.os.Bundle;
-
-import androidx.fragment.app.Fragment;
-
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-/**
- * Media route discovery fragment.
- * <p>
- * This fragment takes care of registering a callback for media route discovery
- * during the {@link Fragment#onStart onStart()} phase
- * and removing it during the {@link Fragment#onStop onStop()} phase.
- * </p><p>
- * The application must supply a route selector to specify the kinds of routes
- * to discover. The application may also override {@link #onCreateCallback} to
- * provide the {@link MediaRouter} callback to register.
- * </p><p>
- * Note that the discovery callback makes the application be connected with all the
- * {@link androidx.mediarouter.media.MediaRouteProviderService media route provider services}
- * while it is registered.
- * </p>
- */
-public class MediaRouteDiscoveryFragment extends Fragment {
- private final String ARGUMENT_SELECTOR = "selector";
-
- private MediaRouter mRouter;
- private MediaRouteSelector mSelector;
- private MediaRouter.Callback mCallback;
-
- public MediaRouteDiscoveryFragment() {
- }
-
- /**
- * Gets the media router instance.
- */
- public MediaRouter getMediaRouter() {
- ensureRouter();
- return mRouter;
- }
-
- private void ensureRouter() {
- if (mRouter == null) {
- mRouter = MediaRouter.getInstance(getContext());
- }
- }
-
- /**
- * Gets the media route selector for filtering the routes to be discovered.
- *
- * @return The selector, never null.
- */
- public MediaRouteSelector getRouteSelector() {
- ensureRouteSelector();
- return mSelector;
- }
-
- /**
- * Sets the media route selector for filtering the routes to be discovered.
- * This method must be called before the fragment is added.
- *
- * @param selector The selector to set.
- */
- public void setRouteSelector(MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- ensureRouteSelector();
- if (!mSelector.equals(selector)) {
- mSelector = selector;
-
- Bundle args = getArguments();
- if (args == null) {
- args = new Bundle();
- }
- args.putBundle(ARGUMENT_SELECTOR, selector.asBundle());
- setArguments(args);
-
- if (mCallback != null) {
- mRouter.removeCallback(mCallback);
- mRouter.addCallback(mSelector, mCallback, onPrepareCallbackFlags());
- }
- }
- }
-
- private void ensureRouteSelector() {
- if (mSelector == null) {
- Bundle args = getArguments();
- if (args != null) {
- mSelector = MediaRouteSelector.fromBundle(args.getBundle(ARGUMENT_SELECTOR));
- }
- if (mSelector == null) {
- mSelector = MediaRouteSelector.EMPTY;
- }
- }
- }
-
- /**
- * Called to create the {@link androidx.mediarouter.media.MediaRouter.Callback callback}
- * that will be registered.
- * <p>
- * The default callback does nothing. The application may override this method to
- * supply its own callback.
- * </p>
- *
- * @return The new callback, or null if no callback should be registered.
- */
- public MediaRouter.Callback onCreateCallback() {
- return new MediaRouter.Callback() { };
- }
-
- /**
- * Called to prepare the callback flags that will be used when the
- * {@link androidx.mediarouter.media.MediaRouter.Callback callback} is registered.
- * <p>
- * The default implementation returns {@link MediaRouter#CALLBACK_FLAG_REQUEST_DISCOVERY}.
- * </p>
- *
- * @return The desired callback flags.
- */
- public int onPrepareCallbackFlags() {
- return MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY;
- }
-
- @Override
- public void onStart() {
- super.onStart();
-
- ensureRouteSelector();
- ensureRouter();
- mCallback = onCreateCallback();
- if (mCallback != null) {
- mRouter.addCallback(mSelector, mCallback, onPrepareCallbackFlags());
- }
- }
-
- @Override
- public void onStop() {
- if (mCallback != null) {
- mRouter.removeCallback(mCallback);
- mCallback = null;
- }
-
- super.onStop();
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteExpandCollapseButton.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteExpandCollapseButton.java
deleted file mode 100644
index dcca6a0..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteExpandCollapseButton.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.content.Context;
-import android.graphics.ColorFilter;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.graphics.drawable.AnimationDrawable;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.ImageButton;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-
-/**
- * Chevron/Caret button to expand/collapse group volume list with animation.
- */
-public class MediaRouteExpandCollapseButton extends ImageButton {
- final AnimationDrawable mExpandAnimationDrawable;
- final AnimationDrawable mCollapseAnimationDrawable;
- final String mExpandGroupDescription;
- final String mCollapseGroupDescription;
- boolean mIsGroupExpanded;
- OnClickListener mListener;
-
- public MediaRouteExpandCollapseButton(Context context) {
- this(context, null);
- }
-
- public MediaRouteExpandCollapseButton(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public MediaRouteExpandCollapseButton(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- mExpandAnimationDrawable = (AnimationDrawable)
- ApiHelper.getLibResources(context).getDrawable(R.drawable.mr_group_expand);
- mCollapseAnimationDrawable = (AnimationDrawable)
- ApiHelper.getLibResources(context).getDrawable(R.drawable.mr_group_collapse);
-
- ColorFilter filter = new PorterDuffColorFilter(
- MediaRouterThemeHelper.getControllerColor(context, defStyleAttr),
- PorterDuff.Mode.SRC_IN);
- mExpandAnimationDrawable.setColorFilter(filter);
- mCollapseAnimationDrawable.setColorFilter(filter);
-
- mExpandGroupDescription =
- ApiHelper.getLibResources(context).getString(R.string.mr_controller_expand_group);
- mCollapseGroupDescription =
- ApiHelper.getLibResources(context).getString(R.string.mr_controller_collapse_group);
-
- setImageDrawable(mExpandAnimationDrawable.getFrame(0));
- setContentDescription(mExpandGroupDescription);
-
- super.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- mIsGroupExpanded = !mIsGroupExpanded;
- if (mIsGroupExpanded) {
- setImageDrawable(mExpandAnimationDrawable);
- mExpandAnimationDrawable.start();
- setContentDescription(mCollapseGroupDescription);
- } else {
- setImageDrawable(mCollapseAnimationDrawable);
- mCollapseAnimationDrawable.start();
- setContentDescription(mExpandGroupDescription);
- }
- if (mListener != null) {
- mListener.onClick(view);
- }
- }
- });
- }
-
- @Override
- public void setOnClickListener(OnClickListener listener) {
- mListener = listener;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteVolumeSlider.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteVolumeSlider.java
deleted file mode 100644
index d05d20e..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouteVolumeSlider.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.SeekBar;
-
-/**
- * Volume slider with showing, hiding, and applying alpha supports to the thumb.
- */
-public class MediaRouteVolumeSlider extends SeekBar {
- private static final String TAG = "MediaRouteVolumeSlider";
-
- private final float mDisabledAlpha;
-
- private boolean mHideThumb;
- private Drawable mThumb;
- private int mColor;
-
- public MediaRouteVolumeSlider(Context context) {
- this(context, null);
- }
-
- public MediaRouteVolumeSlider(Context context, AttributeSet attrs) {
- super(context, attrs);
- mDisabledAlpha = MediaRouterThemeHelper.getDisabledAlpha(context);
- }
-
- public MediaRouteVolumeSlider(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- mDisabledAlpha = MediaRouterThemeHelper.getDisabledAlpha(context);
- }
-
- @Override
- protected void drawableStateChanged() {
- super.drawableStateChanged();
- int alpha = isEnabled() ? 0xFF : (int) (0xFF * mDisabledAlpha);
-
- // The thumb drawable is a collection of drawables and its current drawables are changed per
- // state. Apply the color filter and alpha on every state change.
- if (mThumb != null) {
- mThumb.setColorFilter(mColor, PorterDuff.Mode.SRC_IN);
- mThumb.setAlpha(alpha);
- }
-
- getProgressDrawable().setColorFilter(mColor, PorterDuff.Mode.SRC_IN);
- getProgressDrawable().setAlpha(alpha);
- }
-
- @Override
- public void setThumb(Drawable thumb) {
- mThumb = thumb;
- super.setThumb(mHideThumb ? null : mThumb);
- }
-
- /**
- * Sets whether to show or hide thumb.
- */
- public void setHideThumb(boolean hideThumb) {
- if (mHideThumb == hideThumb) {
- return;
- }
- mHideThumb = hideThumb;
- super.setThumb(mHideThumb ? null : mThumb);
- }
-
- /**
- * Sets the volume slider color. The change takes effect next time drawable state is changed.
- * <p>
- * The color cannot be translucent, otherwise the underlying progress bar will be seen through
- * the thumb.
- * </p>
- */
- public void setColor(int color) {
- if (mColor == color) {
- return;
- }
- if (Color.alpha(color) != 0xFF) {
- Log.e(TAG, "Volume slider color cannot be translucent: #" + Integer.toHexString(color));
- }
- mColor = color;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouterThemeHelper.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouterThemeHelper.java
deleted file mode 100644
index b4bf8d1..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/MediaRouterThemeHelper.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Color;
-import android.util.TypedValue;
-import android.view.ContextThemeWrapper;
-import android.view.View;
-
-import androidx.annotation.IntDef;
-import androidx.core.graphics.ColorUtils;
-
-import com.android.media.update.R;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-final class MediaRouterThemeHelper {
- private static final float MIN_CONTRAST = 3.0f;
-
- @IntDef({COLOR_DARK_ON_LIGHT_BACKGROUND, COLOR_WHITE_ON_DARK_BACKGROUND})
- @Retention(RetentionPolicy.SOURCE)
- private @interface ControllerColorType {}
-
- static final int COLOR_DARK_ON_LIGHT_BACKGROUND = 0xDE000000; /* Opacity of 87% */
- static final int COLOR_WHITE_ON_DARK_BACKGROUND = Color.WHITE;
-
- private MediaRouterThemeHelper() {
- }
-
- static Context createThemedButtonContext(Context context) {
- // Apply base Media Router theme.
- context = new ContextThemeWrapper(context, getRouterThemeId(context));
-
- // Apply custom Media Router theme.
- int style = getThemeResource(context, R.attr.mediaRouteTheme);
- if (style != 0) {
- context = new ContextThemeWrapper(context, style);
- }
-
- return context;
- }
-
- /*
- * The following two methods are to be used in conjunction. They should be used to prepare
- * the context and theme for a super class constructor (the latter method relies on the
- * former method to properly prepare the context):
- * super(context = createThemedDialogContext(context, theme),
- * createThemedDialogStyle(context));
- *
- * It will apply theme in the following order (style lookups will be done in reverse):
- * 1) Current theme
- * 2) Supplied theme
- * 3) Base Media Router theme
- * 4) Custom Media Router theme, if provided
- */
- static Context createThemedDialogContext(Context context, int theme, boolean alertDialog) {
- // 1) Current theme is already applied to the context
-
- // 2) If no theme is supplied, look it up from the context (dialogTheme/alertDialogTheme)
- if (theme == 0) {
- theme = getThemeResource(context,
- !alertDialog ? android.R.attr.dialogTheme : android.R.attr.alertDialogTheme);
- }
- // Apply it
- context = new ContextThemeWrapper(context, theme);
-
- // 3) If a custom Media Router theme is provided then apply the base theme
- if (getThemeResource(context, R.attr.mediaRouteTheme) != 0) {
- context = new ContextThemeWrapper(context, getRouterThemeId(context));
- }
-
- return context;
- }
- // This method should be used in conjunction with the previous method.
- static int createThemedDialogStyle(Context context) {
- // 4) Apply the custom Media Router theme
- int theme = getThemeResource(context, R.attr.mediaRouteTheme);
- if (theme == 0) {
- // 3) No custom MediaRouter theme was provided so apply the base theme instead
- theme = getRouterThemeId(context);
- }
-
- return theme;
- }
- // END. Previous two methods should be used in conjunction.
-
- static int getThemeResource(Context context, int attr) {
- TypedValue value = new TypedValue();
- return context.getTheme().resolveAttribute(attr, value, true) ? value.resourceId : 0;
- }
-
- static float getDisabledAlpha(Context context) {
- TypedValue value = new TypedValue();
- return context.getTheme().resolveAttribute(android.R.attr.disabledAlpha, value, true)
- ? value.getFloat() : 0.5f;
- }
-
- static @ControllerColorType int getControllerColor(Context context, int style) {
- int primaryColor = getThemeColor(context, style, android.R.attr.colorPrimary);
- if (primaryColor == 0) {
- primaryColor = getThemeColor(context, style, android.R.attr.colorPrimary);
- if (primaryColor == 0) {
- primaryColor = 0xFF000000;
- }
- }
- if (ColorUtils.calculateContrast(COLOR_WHITE_ON_DARK_BACKGROUND, primaryColor)
- >= MIN_CONTRAST) {
- return COLOR_WHITE_ON_DARK_BACKGROUND;
- }
- return COLOR_DARK_ON_LIGHT_BACKGROUND;
- }
-
- static int getButtonTextColor(Context context) {
- int primaryColor = getThemeColor(context, 0, android.R.attr.colorPrimary);
- int backgroundColor = getThemeColor(context, 0, android.R.attr.colorBackground);
-
- if (ColorUtils.calculateContrast(primaryColor, backgroundColor) < MIN_CONTRAST) {
- // Default to colorAccent if the contrast ratio is low.
- return getThemeColor(context, 0, android.R.attr.colorAccent);
- }
- return primaryColor;
- }
-
- static void setMediaControlsBackgroundColor(
- Context context, View mainControls, View groupControls, boolean hasGroup) {
- int primaryColor = getThemeColor(context, 0, android.R.attr.colorPrimary);
- int primaryDarkColor = getThemeColor(context, 0, android.R.attr.colorPrimaryDark);
- if (hasGroup && getControllerColor(context, 0) == COLOR_DARK_ON_LIGHT_BACKGROUND) {
- // Instead of showing dark controls in a possibly dark (i.e. the primary dark), model
- // the white dialog and use the primary color for the group controls.
- primaryDarkColor = primaryColor;
- primaryColor = Color.WHITE;
- }
- mainControls.setBackgroundColor(primaryColor);
- groupControls.setBackgroundColor(primaryDarkColor);
- // Also store the background colors to the view tags. They are used in
- // setVolumeSliderColor() below.
- mainControls.setTag(primaryColor);
- groupControls.setTag(primaryDarkColor);
- }
-
- static void setVolumeSliderColor(
- Context context, MediaRouteVolumeSlider volumeSlider, View backgroundView) {
- int controllerColor = getControllerColor(context, 0);
- if (Color.alpha(controllerColor) != 0xFF) {
- // Composite with the background in order not to show the underlying progress bar
- // through the thumb.
- int backgroundColor = (int) backgroundView.getTag();
- controllerColor = ColorUtils.compositeColors(controllerColor, backgroundColor);
- }
- volumeSlider.setColor(controllerColor);
- }
-
- private static boolean isLightTheme(Context context) {
- TypedValue value = new TypedValue();
- // TODO(sungsoo): Switch to com.android.internal.R.attr.isLightTheme
- return context.getTheme().resolveAttribute(androidx.appcompat.R.attr.isLightTheme,
- value, true) && value.data != 0;
- }
-
- private static int getThemeColor(Context context, int style, int attr) {
- if (style != 0) {
- int[] attrs = { attr };
- TypedArray ta = context.obtainStyledAttributes(style, attrs);
- int color = ta.getColor(0, 0);
- ta.recycle();
- if (color != 0) {
- return color;
- }
- }
- TypedValue value = new TypedValue();
- context.getTheme().resolveAttribute(attr, value, true);
- if (value.resourceId != 0) {
- return context.getResources().getColor(value.resourceId);
- }
- return value.data;
- }
-
- static int getRouterThemeId(Context context) {
- int themeId;
- if (isLightTheme(context)) {
- if (getControllerColor(context, 0) == COLOR_DARK_ON_LIGHT_BACKGROUND) {
- themeId = R.style.Theme_MediaRouter_Light;
- } else {
- themeId = R.style.Theme_MediaRouter_Light_DarkControlPanel;
- }
- } else {
- if (getControllerColor(context, 0) == COLOR_DARK_ON_LIGHT_BACKGROUND) {
- themeId = R.style.Theme_MediaRouter_LightControlPanel;
- } else {
- themeId = R.style.Theme_MediaRouter;
- }
- }
- return themeId;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/app/OverlayListView.java b/packages/MediaComponents/src/com/android/support/mediarouter/app/OverlayListView.java
deleted file mode 100644
index b00dee2..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/app/OverlayListView.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.app;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.util.AttributeSet;
-import android.view.animation.Interpolator;
-import android.widget.ListView;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A ListView which has an additional overlay layer. {@link BitmapDrawable}
- * can be added to the layer and can be animated.
- */
-public final class OverlayListView extends ListView {
- private final List<OverlayObject> mOverlayObjects = new ArrayList<>();
-
- public OverlayListView(Context context) {
- super(context);
- }
-
- public OverlayListView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public OverlayListView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- /**
- * Adds an object to the overlay layer.
- *
- * @param object An object to be added.
- */
- public void addOverlayObject(OverlayObject object) {
- mOverlayObjects.add(object);
- }
-
- /**
- * Starts all animations of objects in the overlay layer.
- */
- public void startAnimationAll() {
- for (OverlayObject object : mOverlayObjects) {
- if (!object.isAnimationStarted()) {
- object.startAnimation(getDrawingTime());
- }
- }
- }
-
- /**
- * Stops all animations of objects in the overlay layer.
- */
- public void stopAnimationAll() {
- for (OverlayObject object : mOverlayObjects) {
- object.stopAnimation();
- }
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- if (mOverlayObjects.size() > 0) {
- Iterator<OverlayObject> it = mOverlayObjects.iterator();
- while (it.hasNext()) {
- OverlayObject object = it.next();
- BitmapDrawable bitmap = object.getBitmapDrawable();
- if (bitmap != null) {
- bitmap.draw(canvas);
- }
- if (!object.update(getDrawingTime())) {
- it.remove();
- }
- }
- }
- }
-
- /**
- * A class that represents an object to be shown in the overlay layer.
- */
- public static class OverlayObject {
- private BitmapDrawable mBitmap;
- private float mCurrentAlpha = 1.0f;
- private Rect mCurrentBounds;
- private Interpolator mInterpolator;
- private long mDuration;
- private Rect mStartRect;
- private int mDeltaY;
- private float mStartAlpha = 1.0f;
- private float mEndAlpha = 1.0f;
- private long mStartTime;
- private boolean mIsAnimationStarted;
- private boolean mIsAnimationEnded;
- private OnAnimationEndListener mListener;
-
- public OverlayObject(BitmapDrawable bitmap, Rect startRect) {
- mBitmap = bitmap;
- mStartRect = startRect;
- mCurrentBounds = new Rect(startRect);
- if (mBitmap != null && mCurrentBounds != null) {
- mBitmap.setAlpha((int) (mCurrentAlpha * 255));
- mBitmap.setBounds(mCurrentBounds);
- }
- }
-
- /**
- * Returns the bitmap that this object represents.
- *
- * @return BitmapDrawable that this object has.
- */
- public BitmapDrawable getBitmapDrawable() {
- return mBitmap;
- }
-
- /**
- * Returns the started status of the animation.
- *
- * @return True if the animation has started, false otherwise.
- */
- public boolean isAnimationStarted() {
- return mIsAnimationStarted;
- }
-
- /**
- * Sets animation for varying alpha.
- *
- * @param startAlpha Starting alpha value for the animation, where 1.0 means
- * fully opaque and 0.0 means fully transparent.
- * @param endAlpha Ending alpha value for the animation.
- * @return This OverlayObject to allow for chaining of calls.
- */
- public OverlayObject setAlphaAnimation(float startAlpha, float endAlpha) {
- mStartAlpha = startAlpha;
- mEndAlpha = endAlpha;
- return this;
- }
-
- /**
- * Sets animation for moving objects vertically.
- *
- * @param deltaY Distance to move in pixels.
- * @return This OverlayObject to allow for chaining of calls.
- */
- public OverlayObject setTranslateYAnimation(int deltaY) {
- mDeltaY = deltaY;
- return this;
- }
-
- /**
- * Sets how long the animation will last.
- *
- * @param duration Duration in milliseconds
- * @return This OverlayObject to allow for chaining of calls.
- */
- public OverlayObject setDuration(long duration) {
- mDuration = duration;
- return this;
- }
-
- /**
- * Sets the acceleration curve for this animation.
- *
- * @param interpolator The interpolator which defines the acceleration curve
- * @return This OverlayObject to allow for chaining of calls.
- */
- public OverlayObject setInterpolator(Interpolator interpolator) {
- mInterpolator = interpolator;
- return this;
- }
-
- /**
- * Binds an animation end listener to the animation.
- *
- * @param listener the animation end listener to be notified.
- * @return This OverlayObject to allow for chaining of calls.
- */
- public OverlayObject setAnimationEndListener(OnAnimationEndListener listener) {
- mListener = listener;
- return this;
- }
-
- /**
- * Starts the animation and sets the start time.
- *
- * @param startTime Start time to be set in Millis
- */
- public void startAnimation(long startTime) {
- mStartTime = startTime;
- mIsAnimationStarted = true;
- }
-
- /**
- * Stops the animation.
- */
- public void stopAnimation() {
- mIsAnimationStarted = true;
- mIsAnimationEnded = true;
- if (mListener != null) {
- mListener.onAnimationEnd();
- }
- }
-
- /**
- * Calculates and updates current bounds and alpha value.
- *
- * @param currentTime Current time.in millis
- */
- public boolean update(long currentTime) {
- if (mIsAnimationEnded) {
- return false;
- }
- float normalizedTime = (currentTime - mStartTime) / (float) mDuration;
- normalizedTime = Math.max(0.0f, Math.min(1.0f, normalizedTime));
- if (!mIsAnimationStarted) {
- normalizedTime = 0.0f;
- }
- float interpolatedTime = (mInterpolator == null) ? normalizedTime
- : mInterpolator.getInterpolation(normalizedTime);
- int deltaY = (int) (mDeltaY * interpolatedTime);
- mCurrentBounds.top = mStartRect.top + deltaY;
- mCurrentBounds.bottom = mStartRect.bottom + deltaY;
- mCurrentAlpha = mStartAlpha + (mEndAlpha - mStartAlpha) * interpolatedTime;
- if (mBitmap != null && mCurrentBounds != null) {
- mBitmap.setAlpha((int) (mCurrentAlpha * 255));
- mBitmap.setBounds(mCurrentBounds);
- }
- if (mIsAnimationStarted && normalizedTime >= 1.0f) {
- mIsAnimationEnded = true;
- if (mListener != null) {
- mListener.onAnimationEnd();
- }
- }
- return !mIsAnimationEnded;
- }
-
- /**
- * An animation listener that receives notifications when the animation ends.
- */
- public interface OnAnimationEndListener {
- /**
- * Notifies the end of the animation.
- */
- public void onAnimationEnd();
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/jellybean-mr1/MediaRouterJellybeanMr1.java b/packages/MediaComponents/src/com/android/support/mediarouter/jellybean-mr1/MediaRouterJellybeanMr1.java
deleted file mode 100644
index 5a0bc95..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/jellybean-mr1/MediaRouterJellybeanMr1.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.content.Context;
-import android.hardware.display.DisplayManager;
-import android.os.Build;
-import android.os.Handler;
-import android.util.Log;
-import android.view.Display;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-// @@RequiresApi(17)
-final class MediaRouterJellybeanMr1 {
- private static final String TAG = "MediaRouterJellybeanMr1";
-
- public static Object createCallback(Callback callback) {
- return new CallbackProxy<Callback>(callback);
- }
-
- public static final class RouteInfo {
- public static boolean isEnabled(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).isEnabled();
- }
-
- public static Display getPresentationDisplay(Object routeObj) {
- // android.media.MediaRouter.RouteInfo.getPresentationDisplay() was
- // added in API 17. However, some factory releases of JB MR1 missed it.
- try {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getPresentationDisplay();
- } catch (NoSuchMethodError ex) {
- Log.w(TAG, "Cannot get presentation display for the route.", ex);
- }
- return null;
- }
- }
-
- public static interface Callback extends MediaRouterJellybean.Callback {
- public void onRoutePresentationDisplayChanged(Object routeObj);
- }
-
- /**
- * Workaround the fact that the version of MediaRouter.addCallback() that accepts a
- * flag to perform an active scan does not exist in JB MR1 so we need to force
- * wifi display scans directly through the DisplayManager.
- * Do not use on JB MR2 and above.
- */
- public static final class ActiveScanWorkaround implements Runnable {
- // Time between wifi display scans when actively scanning in milliseconds.
- private static final int WIFI_DISPLAY_SCAN_INTERVAL = 15000;
-
- private final DisplayManager mDisplayManager;
- private final Handler mHandler;
- private Method mScanWifiDisplaysMethod;
-
- private boolean mActivelyScanningWifiDisplays;
-
- public ActiveScanWorkaround(Context context, Handler handler) {
- if (Build.VERSION.SDK_INT != 17) {
- throw new UnsupportedOperationException();
- }
-
- mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
- mHandler = handler;
- try {
- mScanWifiDisplaysMethod = DisplayManager.class.getMethod("scanWifiDisplays");
- } catch (NoSuchMethodException ex) {
- }
- }
-
- public void setActiveScanRouteTypes(int routeTypes) {
- // On JB MR1, there is no API to scan wifi display routes.
- // Instead we must make a direct call into the DisplayManager to scan
- // wifi displays on this version but only when live video routes are requested.
- // See also the JellybeanMr2Impl implementation of this method.
- // This was fixed in JB MR2 by adding a new overload of addCallback() to
- // enable active scanning on request.
- if ((routeTypes & MediaRouterJellybean.ROUTE_TYPE_LIVE_VIDEO) != 0) {
- if (!mActivelyScanningWifiDisplays) {
- if (mScanWifiDisplaysMethod != null) {
- mActivelyScanningWifiDisplays = true;
- mHandler.post(this);
- } else {
- Log.w(TAG, "Cannot scan for wifi displays because the "
- + "DisplayManager.scanWifiDisplays() method is "
- + "not available on this device.");
- }
- }
- } else {
- if (mActivelyScanningWifiDisplays) {
- mActivelyScanningWifiDisplays = false;
- mHandler.removeCallbacks(this);
- }
- }
- }
-
- @Override
- public void run() {
- if (mActivelyScanningWifiDisplays) {
- try {
- mScanWifiDisplaysMethod.invoke(mDisplayManager);
- } catch (IllegalAccessException ex) {
- Log.w(TAG, "Cannot scan for wifi displays.", ex);
- } catch (InvocationTargetException ex) {
- Log.w(TAG, "Cannot scan for wifi displays.", ex);
- }
- mHandler.postDelayed(this, WIFI_DISPLAY_SCAN_INTERVAL);
- }
- }
- }
-
- /**
- * Workaround the fact that the isConnecting() method does not exist in JB MR1.
- * Do not use on JB MR2 and above.
- */
- public static final class IsConnectingWorkaround {
- private Method mGetStatusCodeMethod;
- private int mStatusConnecting;
-
- public IsConnectingWorkaround() {
- if (Build.VERSION.SDK_INT != 17) {
- throw new UnsupportedOperationException();
- }
-
- try {
- Field statusConnectingField =
- android.media.MediaRouter.RouteInfo.class.getField("STATUS_CONNECTING");
- mStatusConnecting = statusConnectingField.getInt(null);
- mGetStatusCodeMethod =
- android.media.MediaRouter.RouteInfo.class.getMethod("getStatusCode");
- } catch (NoSuchFieldException ex) {
- } catch (NoSuchMethodException ex) {
- } catch (IllegalAccessException ex) {
- }
- }
-
- public boolean isConnecting(Object routeObj) {
- android.media.MediaRouter.RouteInfo route =
- (android.media.MediaRouter.RouteInfo)routeObj;
-
- if (mGetStatusCodeMethod != null) {
- try {
- int statusCode = (Integer)mGetStatusCodeMethod.invoke(route);
- return statusCode == mStatusConnecting;
- } catch (IllegalAccessException ex) {
- } catch (InvocationTargetException ex) {
- }
- }
-
- // Assume not connecting.
- return false;
- }
- }
-
- static class CallbackProxy<T extends Callback>
- extends MediaRouterJellybean.CallbackProxy<T> {
- public CallbackProxy(T callback) {
- super(callback);
- }
-
- @Override
- public void onRoutePresentationDisplayChanged(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route) {
- mCallback.onRoutePresentationDisplayChanged(route);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/jellybean-mr2/MediaRouterJellybeanMr2.java b/packages/MediaComponents/src/com/android/support/mediarouter/jellybean-mr2/MediaRouterJellybeanMr2.java
deleted file mode 100644
index 1103549..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/jellybean-mr2/MediaRouterJellybeanMr2.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-// @@RequiresApi(18)
-final class MediaRouterJellybeanMr2 {
- public static Object getDefaultRoute(Object routerObj) {
- return ((android.media.MediaRouter)routerObj).getDefaultRoute();
- }
-
- public static void addCallback(Object routerObj, int types, Object callbackObj, int flags) {
- ((android.media.MediaRouter)routerObj).addCallback(types,
- (android.media.MediaRouter.Callback)callbackObj, flags);
- }
-
- public static final class RouteInfo {
- public static CharSequence getDescription(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getDescription();
- }
-
- public static boolean isConnecting(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).isConnecting();
- }
- }
-
- public static final class UserRouteInfo {
- public static void setDescription(Object routeObj, CharSequence description) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setDescription(description);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/jellybean/MediaRouterJellybean.java b/packages/MediaComponents/src/com/android/support/mediarouter/jellybean/MediaRouterJellybean.java
deleted file mode 100644
index 0bb59b8..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/jellybean/MediaRouterJellybean.java
+++ /dev/null
@@ -1,462 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
-import android.os.Build;
-import android.util.Log;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-// @@RequiresApi(16)
-final class MediaRouterJellybean {
- private static final String TAG = "MediaRouterJellybean";
-
- // android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP = 0x80;
- // android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100;
- // android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200;
- public static final int DEVICE_OUT_BLUETOOTH = 0x80 | 0x100 | 0x200;
-
- public static final int ROUTE_TYPE_LIVE_AUDIO = 0x1;
- public static final int ROUTE_TYPE_LIVE_VIDEO = 0x2;
- public static final int ROUTE_TYPE_USER = 0x00800000;
-
- public static final int ALL_ROUTE_TYPES =
- MediaRouterJellybean.ROUTE_TYPE_LIVE_AUDIO
- | MediaRouterJellybean.ROUTE_TYPE_LIVE_VIDEO
- | MediaRouterJellybean.ROUTE_TYPE_USER;
-
- public static Object getMediaRouter(Context context) {
- return context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public static List getRoutes(Object routerObj) {
- final android.media.MediaRouter router = (android.media.MediaRouter)routerObj;
- final int count = router.getRouteCount();
- List out = new ArrayList(count);
- for (int i = 0; i < count; i++) {
- out.add(router.getRouteAt(i));
- }
- return out;
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public static List getCategories(Object routerObj) {
- final android.media.MediaRouter router = (android.media.MediaRouter)routerObj;
- final int count = router.getCategoryCount();
- List out = new ArrayList(count);
- for (int i = 0; i < count; i++) {
- out.add(router.getCategoryAt(i));
- }
- return out;
- }
-
- public static Object getSelectedRoute(Object routerObj, int type) {
- return ((android.media.MediaRouter)routerObj).getSelectedRoute(type);
- }
-
- public static void selectRoute(Object routerObj, int types, Object routeObj) {
- ((android.media.MediaRouter)routerObj).selectRoute(types,
- (android.media.MediaRouter.RouteInfo)routeObj);
- }
-
- public static void addCallback(Object routerObj, int types, Object callbackObj) {
- ((android.media.MediaRouter)routerObj).addCallback(types,
- (android.media.MediaRouter.Callback)callbackObj);
- }
-
- public static void removeCallback(Object routerObj, Object callbackObj) {
- ((android.media.MediaRouter)routerObj).removeCallback(
- (android.media.MediaRouter.Callback)callbackObj);
- }
-
- public static Object createRouteCategory(Object routerObj,
- String name, boolean isGroupable) {
- return ((android.media.MediaRouter)routerObj).createRouteCategory(name, isGroupable);
- }
-
- public static Object createUserRoute(Object routerObj, Object categoryObj) {
- return ((android.media.MediaRouter)routerObj).createUserRoute(
- (android.media.MediaRouter.RouteCategory)categoryObj);
- }
-
- public static void addUserRoute(Object routerObj, Object routeObj) {
- ((android.media.MediaRouter)routerObj).addUserRoute(
- (android.media.MediaRouter.UserRouteInfo)routeObj);
- }
-
- public static void removeUserRoute(Object routerObj, Object routeObj) {
- ((android.media.MediaRouter)routerObj).removeUserRoute(
- (android.media.MediaRouter.UserRouteInfo)routeObj);
- }
-
- public static Object createCallback(Callback callback) {
- return new CallbackProxy<Callback>(callback);
- }
-
- public static Object createVolumeCallback(VolumeCallback callback) {
- return new VolumeCallbackProxy<VolumeCallback>(callback);
- }
-
- static boolean checkRoutedToBluetooth(Context context) {
- try {
- AudioManager audioManager = (AudioManager) context.getSystemService(
- Context.AUDIO_SERVICE);
- Method method = audioManager.getClass().getDeclaredMethod(
- "getDevicesForStream", int.class);
- int device = (Integer) method.invoke(audioManager, AudioManager.STREAM_MUSIC);
- return (device & DEVICE_OUT_BLUETOOTH) != 0;
- } catch (Exception e) {
- return false;
- }
- }
-
- public static final class RouteInfo {
- public static CharSequence getName(Object routeObj, Context context) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getName(context);
- }
-
- public static CharSequence getStatus(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getStatus();
- }
-
- public static int getSupportedTypes(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getSupportedTypes();
- }
-
- public static Object getCategory(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getCategory();
- }
-
- public static Drawable getIconDrawable(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getIconDrawable();
- }
-
- public static int getPlaybackType(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getPlaybackType();
- }
-
- public static int getPlaybackStream(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getPlaybackStream();
- }
-
- public static int getVolume(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getVolume();
- }
-
- public static int getVolumeMax(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getVolumeMax();
- }
-
- public static int getVolumeHandling(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getVolumeHandling();
- }
-
- public static Object getTag(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getTag();
- }
-
- public static void setTag(Object routeObj, Object tag) {
- ((android.media.MediaRouter.RouteInfo)routeObj).setTag(tag);
- }
-
- public static void requestSetVolume(Object routeObj, int volume) {
- ((android.media.MediaRouter.RouteInfo)routeObj).requestSetVolume(volume);
- }
-
- public static void requestUpdateVolume(Object routeObj, int direction) {
- ((android.media.MediaRouter.RouteInfo)routeObj).requestUpdateVolume(direction);
- }
-
- public static Object getGroup(Object routeObj) {
- return ((android.media.MediaRouter.RouteInfo)routeObj).getGroup();
- }
-
- public static boolean isGroup(Object routeObj) {
- return routeObj instanceof android.media.MediaRouter.RouteGroup;
- }
- }
-
- public static final class RouteGroup {
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public static List getGroupedRoutes(Object groupObj) {
- final android.media.MediaRouter.RouteGroup group =
- (android.media.MediaRouter.RouteGroup)groupObj;
- final int count = group.getRouteCount();
- List out = new ArrayList(count);
- for (int i = 0; i < count; i++) {
- out.add(group.getRouteAt(i));
- }
- return out;
- }
- }
-
- public static final class UserRouteInfo {
- public static void setName(Object routeObj, CharSequence name) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setName(name);
- }
-
- public static void setStatus(Object routeObj, CharSequence status) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setStatus(status);
- }
-
- public static void setIconDrawable(Object routeObj, Drawable icon) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setIconDrawable(icon);
- }
-
- public static void setPlaybackType(Object routeObj, int type) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setPlaybackType(type);
- }
-
- public static void setPlaybackStream(Object routeObj, int stream) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setPlaybackStream(stream);
- }
-
- public static void setVolume(Object routeObj, int volume) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolume(volume);
- }
-
- public static void setVolumeMax(Object routeObj, int volumeMax) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeMax(volumeMax);
- }
-
- public static void setVolumeHandling(Object routeObj, int volumeHandling) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeHandling(volumeHandling);
- }
-
- public static void setVolumeCallback(Object routeObj, Object volumeCallbackObj) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeCallback(
- (android.media.MediaRouter.VolumeCallback)volumeCallbackObj);
- }
-
- public static void setRemoteControlClient(Object routeObj, Object rccObj) {
- ((android.media.MediaRouter.UserRouteInfo)routeObj).setRemoteControlClient(
- (android.media.RemoteControlClient)rccObj);
- }
- }
-
- public static final class RouteCategory {
- public static CharSequence getName(Object categoryObj, Context context) {
- return ((android.media.MediaRouter.RouteCategory)categoryObj).getName(context);
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public static List getRoutes(Object categoryObj) {
- ArrayList out = new ArrayList();
- ((android.media.MediaRouter.RouteCategory)categoryObj).getRoutes(out);
- return out;
- }
-
- public static int getSupportedTypes(Object categoryObj) {
- return ((android.media.MediaRouter.RouteCategory)categoryObj).getSupportedTypes();
- }
-
- public static boolean isGroupable(Object categoryObj) {
- return ((android.media.MediaRouter.RouteCategory)categoryObj).isGroupable();
- }
- }
-
- public static interface Callback {
- public void onRouteSelected(int type, Object routeObj);
- public void onRouteUnselected(int type, Object routeObj);
- public void onRouteAdded(Object routeObj);
- public void onRouteRemoved(Object routeObj);
- public void onRouteChanged(Object routeObj);
- public void onRouteGrouped(Object routeObj, Object groupObj, int index);
- public void onRouteUngrouped(Object routeObj, Object groupObj);
- public void onRouteVolumeChanged(Object routeObj);
- }
-
- public static interface VolumeCallback {
- public void onVolumeSetRequest(Object routeObj, int volume);
- public void onVolumeUpdateRequest(Object routeObj, int direction);
- }
-
- /**
- * Workaround for limitations of selectRoute() on JB and JB MR1.
- * Do not use on JB MR2 and above.
- */
- public static final class SelectRouteWorkaround {
- private Method mSelectRouteIntMethod;
-
- public SelectRouteWorkaround() {
- if (Build.VERSION.SDK_INT < 16 || Build.VERSION.SDK_INT > 17) {
- throw new UnsupportedOperationException();
- }
- try {
- mSelectRouteIntMethod = android.media.MediaRouter.class.getMethod(
- "selectRouteInt", int.class, android.media.MediaRouter.RouteInfo.class);
- } catch (NoSuchMethodException ex) {
- }
- }
-
- public void selectRoute(Object routerObj, int types, Object routeObj) {
- android.media.MediaRouter router = (android.media.MediaRouter)routerObj;
- android.media.MediaRouter.RouteInfo route =
- (android.media.MediaRouter.RouteInfo)routeObj;
-
- int routeTypes = route.getSupportedTypes();
- if ((routeTypes & ROUTE_TYPE_USER) == 0) {
- // Handle non-user routes.
- // On JB and JB MR1, the selectRoute() API only supports programmatically
- // selecting user routes. So instead we rely on the hidden selectRouteInt()
- // method on these versions of the platform.
- // This limitation was removed in JB MR2.
- if (mSelectRouteIntMethod != null) {
- try {
- mSelectRouteIntMethod.invoke(router, types, route);
- return; // success!
- } catch (IllegalAccessException ex) {
- Log.w(TAG, "Cannot programmatically select non-user route. "
- + "Media routing may not work.", ex);
- } catch (InvocationTargetException ex) {
- Log.w(TAG, "Cannot programmatically select non-user route. "
- + "Media routing may not work.", ex);
- }
- } else {
- Log.w(TAG, "Cannot programmatically select non-user route "
- + "because the platform is missing the selectRouteInt() "
- + "method. Media routing may not work.");
- }
- }
-
- // Default handling.
- router.selectRoute(types, route);
- }
- }
-
- /**
- * Workaround the fact that the getDefaultRoute() method does not exist in JB and JB MR1.
- * Do not use on JB MR2 and above.
- */
- public static final class GetDefaultRouteWorkaround {
- private Method mGetSystemAudioRouteMethod;
-
- public GetDefaultRouteWorkaround() {
- if (Build.VERSION.SDK_INT < 16 || Build.VERSION.SDK_INT > 17) {
- throw new UnsupportedOperationException();
- }
- try {
- mGetSystemAudioRouteMethod =
- android.media.MediaRouter.class.getMethod("getSystemAudioRoute");
- } catch (NoSuchMethodException ex) {
- }
- }
-
- public Object getDefaultRoute(Object routerObj) {
- android.media.MediaRouter router = (android.media.MediaRouter)routerObj;
-
- if (mGetSystemAudioRouteMethod != null) {
- try {
- return mGetSystemAudioRouteMethod.invoke(router);
- } catch (IllegalAccessException ex) {
- } catch (InvocationTargetException ex) {
- }
- }
-
- // Could not find the method or it does not work.
- // Return the first route and hope for the best.
- return router.getRouteAt(0);
- }
- }
-
- static class CallbackProxy<T extends Callback>
- extends android.media.MediaRouter.Callback {
- protected final T mCallback;
-
- public CallbackProxy(T callback) {
- mCallback = callback;
- }
-
- @Override
- public void onRouteSelected(android.media.MediaRouter router,
- int type, android.media.MediaRouter.RouteInfo route) {
- mCallback.onRouteSelected(type, route);
- }
-
- @Override
- public void onRouteUnselected(android.media.MediaRouter router,
- int type, android.media.MediaRouter.RouteInfo route) {
- mCallback.onRouteUnselected(type, route);
- }
-
- @Override
- public void onRouteAdded(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route) {
- mCallback.onRouteAdded(route);
- }
-
- @Override
- public void onRouteRemoved(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route) {
- mCallback.onRouteRemoved(route);
- }
-
- @Override
- public void onRouteChanged(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route) {
- mCallback.onRouteChanged(route);
- }
-
- @Override
- public void onRouteGrouped(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route,
- android.media.MediaRouter.RouteGroup group, int index) {
- mCallback.onRouteGrouped(route, group, index);
- }
-
- @Override
- public void onRouteUngrouped(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route,
- android.media.MediaRouter.RouteGroup group) {
- mCallback.onRouteUngrouped(route, group);
- }
-
- @Override
- public void onRouteVolumeChanged(android.media.MediaRouter router,
- android.media.MediaRouter.RouteInfo route) {
- mCallback.onRouteVolumeChanged(route);
- }
- }
-
- static class VolumeCallbackProxy<T extends VolumeCallback>
- extends android.media.MediaRouter.VolumeCallback {
- protected final T mCallback;
-
- public VolumeCallbackProxy(T callback) {
- mCallback = callback;
- }
-
- @Override
- public void onVolumeSetRequest(android.media.MediaRouter.RouteInfo route,
- int volume) {
- mCallback.onVolumeSetRequest(route, volume);
- }
-
- @Override
- public void onVolumeUpdateRequest(android.media.MediaRouter.RouteInfo route,
- int direction) {
- mCallback.onVolumeUpdateRequest(route, direction);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaControlIntent.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaControlIntent.java
deleted file mode 100644
index 1d9e777..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaControlIntent.java
+++ /dev/null
@@ -1,1228 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.app.PendingIntent;
-import android.content.Intent;
-import android.net.Uri;
-
-/**
- * Constants for media control intents.
- * <p>
- * This class declares a set of standard media control intent categories and actions that
- * applications can use to identify the capabilities of media routes and control them.
- * </p>
- *
- * <h3>Media control intent categories</h3>
- * <p>
- * Media control intent categories specify means by which applications can
- * send media to the destination of a media route. Categories are sometimes referred
- * to as describing "types" or "kinds" of routes.
- * </p><p>
- * For example, if a route supports the {@link #CATEGORY_REMOTE_PLAYBACK remote playback category},
- * then an application can ask it to play media remotely by sending a
- * {@link #ACTION_PLAY play} or {@link #ACTION_ENQUEUE enqueue} intent with the Uri of the
- * media content to play. Such a route may then be referred to as
- * a "remote playback route" because it supports remote playback requests. It is common
- * for a route to support multiple categories of requests at the same time, such as
- * live audio and live video.
- * </p><p>
- * The following standard route categories are defined.
- * </p><ul>
- * <li>{@link #CATEGORY_LIVE_AUDIO Live audio}: The route supports streaming live audio
- * from the device to the destination. Live audio routes include local speakers
- * and Bluetooth headsets.
- * <li>{@link #CATEGORY_LIVE_VIDEO Live video}: The route supports streaming live video
- * from the device to the destination. Live video routes include local displays
- * and wireless displays that support mirroring and
- * {@link android.app.Presentation presentations}. Live video routes typically also
- * support live audio capabilities.
- * <li>{@link #CATEGORY_REMOTE_PLAYBACK Remote playback}: The route supports sending
- * remote playback requests for media content to the destination. The content to be
- * played is identified by a Uri and mime-type.
- * </ul><p>
- * Media route providers may define custom media control intent categories of their own in
- * addition to the standard ones. Custom categories can be used to provide a variety
- * of features to applications that recognize and know how to use them. For example,
- * a media route provider might define a custom category to indicate that its routes
- * support a special device-specific control interface in addition to other
- * standard features.
- * </p><p>
- * Applications can determine which categories a route supports by using the
- * {@link MediaRouter.RouteInfo#supportsControlCategory MediaRouter.RouteInfo.supportsControlCategory}
- * or {@link MediaRouter.RouteInfo#getControlFilters MediaRouter.RouteInfo.getControlFilters}
- * methods. Applications can also specify the types of routes that they want to use by
- * creating {@link MediaRouteSelector media route selectors} that contain the desired
- * categories and are used to filter routes in several parts of the media router API.
- * </p>
- *
- * <h3>Media control intent actions</h3>
- * <p>
- * Media control intent actions specify particular functions that applications
- * can ask the destination of a media route to perform. Media route control requests
- * take the form of intents in a similar manner to other intents used to start activities
- * or send broadcasts. The difference is that media control intents are directed to
- * routes rather than activity or broadcast receiver components.
- * </p><p>
- * Each media route control intent specifies an action, a category and some number of parameters
- * that are supplied as extras. Applications send media control requests to routes using the
- * {@link MediaRouter.RouteInfo#sendControlRequest MediaRouter.RouteInfo.sendControlRequest}
- * method and receive results via a callback.
- * </p><p>
- * All media control intent actions are associated with the media control intent categories
- * that support them. Thus only remote playback routes may perform remote playback actions.
- * The documentation of each action specifies the category to which the action belongs,
- * the parameters it requires, and the results it returns.
- * </p>
- *
- * <h3>Live audio and live video routes</h3>
- * <p>
- * {@link #CATEGORY_LIVE_AUDIO Live audio} and {@link #CATEGORY_LIVE_VIDEO live video}
- * routes present media using standard system interfaces such as audio streams,
- * {@link android.app.Presentation presentations} or display mirroring. These routes are
- * the easiest to use because applications simply render content locally on the device
- * and the system streams it to the route destination automatically.
- * </p><p>
- * In most cases, applications can stream content to live audio and live video routes in
- * the same way they would play the content locally without any modification. However,
- * applications may also be able to take advantage of more sophisticated features such
- * as second-screen presentation APIs that are particular to these routes.
- * </p>
- *
- * <h3>Remote playback routes</h3>
- * <p>
- * {@link #CATEGORY_REMOTE_PLAYBACK Remote playback} routes present media remotely
- * by playing content from a Uri.
- * These routes destinations take responsibility for fetching and rendering content
- * on their own. Applications do not render the content themselves; instead, applications
- * send control requests to initiate play, pause, resume, or stop media items and receive
- * status updates as they change state.
- * </p>
- *
- * <h4>Sessions</h4>
- * <p>
- * Each remote media playback action is conducted within the scope of a session.
- * Sessions are used to prevent applications from accidentally interfering with one
- * another because at most one session can be valid at a time.
- * </p><p>
- * A session can be created using the {@link #ACTION_START_SESSION start session action}
- * and terminated using the {@link #ACTION_END_SESSION end session action} when the
- * route provides explicit session management features.
- * </p><p>
- * Explicit session management was added in a later revision of the protocol so not
- * all routes support it. If the route does not support explicit session management
- * then implicit session management may still be used. Implicit session management
- * relies on the use of the {@link #ACTION_PLAY play} and {@link #ACTION_ENQUEUE enqueue}
- * actions which have the side-effect of creating a new session if none is provided
- * as argument.
- * </p><p>
- * When a new session is created, the previous session is invalidated and any ongoing
- * media playback is stopped before the requested action is performed. Any attempt
- * to use an invalidated session will result in an error. (Protocol implementations
- * are encouraged to aggressively discard information associated with invalidated sessions
- * since it is no longer of use.)
- * </p><p>
- * Each session is identified by a unique session id that may be used to control
- * the session using actions such as pause, resume, stop and end session.
- * </p>
- *
- * <h4>Media items</h4>
- * <p>
- * Each successful {@link #ACTION_PLAY play} or {@link #ACTION_ENQUEUE enqueue} action
- * returns a unique media item id that an application can use to monitor and control
- * playback. The media item id may be passed to other actions such as
- * {@link #ACTION_SEEK seek} or {@link #ACTION_GET_STATUS get status}. It will also appear
- * as a parameter in status update broadcasts to identify the associated playback request.
- * </p><p>
- * Each media item is scoped to the session in which it was created. Therefore media item
- * ids are only ever used together with session ids. Media item ids are meaningless
- * on their own. When the session is invalidated, all of its media items are also
- * invalidated.
- * </p>
- *
- * <h4>The playback queue</h4>
- * <p>
- * Each session has its own playback queue that consists of the media items that
- * are pending, playing, buffering or paused. Items are added to the queue when
- * a playback request is issued. Items are removed from the queue when they are no
- * longer eligible for playback (enter terminal states).
- * </p><p>
- * As described in the {@link MediaItemStatus} class, media items initially
- * start in a pending state, transition to the playing (or buffering or paused) state
- * during playback, and end in a finished, canceled, invalidated or error state.
- * Once the current item enters a terminal state, playback proceeds on to the
- * next item.
- * </p><p>
- * The application should determine whether the route supports queuing by checking
- * whether the {@link #ACTION_ENQUEUE} action is declared in the route's control filter
- * using {@link MediaRouter.RouteInfo#supportsControlRequest RouteInfo.supportsControlRequest}.
- * </p><p>
- * If the {@link #ACTION_ENQUEUE} action is supported by the route, then the route promises
- * to allow at least two items (possibly more) to be enqueued at a time. Enqueued items play
- * back to back one after the other as the previous item completes. Ideally there should
- * be no audible pause between items for standard audio content types.
- * </p><p>
- * If the {@link #ACTION_ENQUEUE} action is not supported by the route, then the queue
- * effectively contains at most one item at a time. Each play action has the effect of
- * clearing the queue and resetting its state before the next item is played.
- * </p>
- *
- * <h4>Impact of pause, resume, stop and play actions on the playback queue</h4>
- * <p>
- * The pause, resume and stop actions affect the session's whole queue. Pause causes
- * the playback queue to be suspended no matter which item is currently playing.
- * Resume reverses the effects of pause. Stop clears the queue and also resets
- * the pause flag just like resume.
- * </p><p>
- * As described earlier, the play action has the effect of clearing the queue
- * and completely resetting its state (like the stop action) then enqueuing a
- * new media item to be played immediately. Play is therefore equivalent
- * to stop followed by an action to enqueue an item.
- * </p><p>
- * The play action is also special in that it can be used to create new sessions.
- * An application with simple needs may find that it only needs to use play
- * (and occasionally stop) to control playback.
- * </p>
- *
- * <h4>Resolving conflicts between applications</h4>
- * <p>
- * When an application has a valid session, it is essentially in control of remote playback
- * on the route. No other application can view or modify the remote playback state
- * of that application's session without knowing its id.
- * </p><p>
- * However, other applications can perform actions that have the effect of stopping
- * playback and invalidating the current session. When this occurs, the former application
- * will be informed that it has lost control by way of individual media item status
- * update broadcasts that indicate that its queued media items have become
- * {@link MediaItemStatus#PLAYBACK_STATE_INVALIDATED invalidated}. This broadcast
- * implies that playback was terminated abnormally by an external cause.
- * </p><p>
- * Applications should handle conflicts conservatively to allow other applications to
- * smoothly assume control over the route. When a conflict occurs, the currently playing
- * application should release its session and allow the new application to use the
- * route until such time as the user intervenes to take over the route again and begin
- * a new playback session.
- * </p>
- *
- * <h4>Basic actions</h4>
- * <p>
- * The following basic actions must be supported (all or nothing) by all remote
- * playback routes. These actions form the basis of the remote playback protocol
- * and are required in all implementations.
- * </p><ul>
- * <li>{@link #ACTION_PLAY Play}: Starts playing content specified by a given Uri
- * and returns a new media item id to describe the request. Implicitly creates a new
- * session if no session id was specified as a parameter.
- * <li>{@link #ACTION_SEEK Seek}: Sets the content playback position of a specific media item.
- * <li>{@link #ACTION_GET_STATUS Get status}: Gets the status of a media item
- * including the item's current playback position and progress.
- * <li>{@link #ACTION_PAUSE Pause}: Pauses playback of the queue.
- * <li>{@link #ACTION_RESUME Resume}: Resumes playback of the queue.
- * <li>{@link #ACTION_STOP Stop}: Stops playback, clears the queue, and resets the
- * pause state.
- * </ul>
- *
- * <h4>Queue actions</h4>
- * <p>
- * The following queue actions must be supported (all or nothing) by remote
- * playback routes that offer optional queuing capabilities.
- * </p><ul>
- * <li>{@link #ACTION_ENQUEUE Enqueue}: Enqueues content specified by a given Uri
- * and returns a new media item id to describe the request. Implicitly creates a new
- * session if no session id was specified as a parameter.
- * <li>{@link #ACTION_REMOVE Remove}: Removes a specified media item from the queue.
- * </ul>
- *
- * <h4>Session actions</h4>
- * <p>
- * The following session actions must be supported (all or nothing) by remote
- * playback routes that offer optional session management capabilities.
- * </p><ul>
- * <li>{@link #ACTION_START_SESSION Start session}: Starts a new session explicitly.
- * <li>{@link #ACTION_GET_SESSION_STATUS Get session status}: Gets the status of a session.
- * <li>{@link #ACTION_END_SESSION End session}: Ends a session explicitly.
- * </ul>
- *
- * <h4>Implementation note</h4>
- * <p>
- * Implementations of the remote playback protocol must implement <em>all</em> of the
- * documented actions, parameters and results. Note that the documentation is written from
- * the perspective of a client of the protocol. In particular, whenever a parameter
- * is described as being "optional", it is only from the perspective of the client.
- * Compliant media route provider implementations of this protocol must support all
- * of the features described herein.
- * </p>
- */
-public final class MediaControlIntent {
- /* Route categories. */
-
- /**
- * Media control category: Live audio.
- * <p>
- * A route that supports live audio routing will allow the media audio stream
- * to be sent to supported destinations. This can include internal speakers or
- * audio jacks on the device itself, A2DP devices, and more.
- * </p><p>
- * When a live audio route is selected, audio routing is transparent to the application.
- * All audio played on the media stream will be routed to the selected destination.
- * </p><p>
- * Refer to the class documentation for details about live audio routes.
- * </p>
- */
- public static final String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
-
- /**
- * Media control category: Live video.
- * <p>
- * A route that supports live video routing will allow a mirrored version
- * of the device's primary display or a customized
- * {@link android.app.Presentation Presentation} to be sent to supported
- * destinations.
- * </p><p>
- * When a live video route is selected, audio and video routing is transparent
- * to the application. By default, audio and video is routed to the selected
- * destination. For certain live video routes, the application may also use a
- * {@link android.app.Presentation Presentation} to replace the mirrored view
- * on the external display with different content.
- * </p><p>
- * Refer to the class documentation for details about live video routes.
- * </p>
- *
- * @see MediaRouter.RouteInfo#getPresentationDisplay()
- * @see android.app.Presentation
- */
- public static final String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
-
- /**
- * Media control category: Remote playback.
- * <p>
- * A route that supports remote playback routing will allow an application to send
- * requests to play content remotely to supported destinations.
- * </p><p>
- * Remote playback routes destinations operate independently of the local device.
- * When a remote playback route is selected, the application can control the content
- * playing on the destination by sending media control actions to the route.
- * The application may also receive status updates from the route regarding
- * remote playback.
- * </p><p>
- * Refer to the class documentation for details about remote playback routes.
- * </p>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- */
- public static final String CATEGORY_REMOTE_PLAYBACK =
- "android.media.intent.category.REMOTE_PLAYBACK";
-
- /* Remote playback actions that affect individual items. */
-
- /**
- * Remote playback media control action: Play media item.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes a remote playback route to start playing content with
- * the {@link Uri} specified in the {@link Intent}'s {@link Intent#getData() data uri}.
- * The action returns a media session id and media item id which can be used
- * to control playback using other remote playback actions.
- * </p><p>
- * Once initiated, playback of the specified content will be managed independently
- * by the destination. The application will receive status updates as the state
- * of the media item changes.
- * </p><p>
- * If the data uri specifies an HTTP or HTTPS scheme, then the destination is
- * responsible for following HTTP redirects to a reasonable depth of at least 3
- * levels as might typically be handled by a web browser. If an HTTP error
- * occurs, then the destination should send a {@link MediaItemStatus status update}
- * back to the client indicating the {@link MediaItemStatus#PLAYBACK_STATE_ERROR error}
- * {@link MediaItemStatus#getPlaybackState() playback state}.
- * </p>
- *
- * <h3>One item at a time</h3>
- * <p>
- * Each successful play action <em>replaces</em> the previous play action.
- * If an item is already playing, then it is canceled, the session's playback queue
- * is cleared and the new item begins playing immediately (regardless of
- * whether the previously playing item had been paused).
- * </p><p>
- * Play is therefore equivalent to {@link #ACTION_STOP stop} followed by an action
- * to enqueue a new media item to be played immediately.
- * </p>
- *
- * <h3>Sessions</h3>
- * <p>
- * This request has the effect of implicitly creating a media session whenever the
- * application does not specify the {@link #EXTRA_SESSION_ID session id} parameter.
- * Because there can only be at most one valid session at a time, creating a new session
- * has the side-effect of invalidating any existing sessions and their media items,
- * then handling the playback request with a new session.
- * </p><p>
- * If the application specifies an invalid session id, then an error is returned.
- * When this happens, the application should assume that its session
- * is no longer valid. To obtain a new session, the application may try again
- * and omit the session id parameter. However, the application should
- * only retry requests due to an explicit action performed by the user,
- * such as the user clicking on a "play" button in the UI, since another
- * application may be trying to take control of the route and the former
- * application should try to stay out of its way.
- * </p><p>
- * For more information on sessions, queues and media items, please refer to the
- * class documentation.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(optional)</em>: Specifies the session id of the
- * session to which the playback request belongs. If omitted, a new session
- * is created implicitly.
- * <li>{@link #EXTRA_ITEM_CONTENT_POSITION} <em>(optional)</em>: Specifies the initial
- * content playback position as a long integer number of milliseconds from
- * the beginning of the content.
- * <li>{@link #EXTRA_ITEM_METADATA} <em>(optional)</em>: Specifies metadata associated
- * with the content such as the title of a song.
- * <li>{@link #EXTRA_ITEM_STATUS_UPDATE_RECEIVER} <em>(optional)</em>: Specifies a
- * {@link PendingIntent} for a broadcast receiver that will receive status updates
- * about the media item.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(always returned)</em>: Specifies the session id of the
- * session that was affected by the request. This will be a new session in
- * the case where no session id was supplied as a parameter.
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * <li>{@link #EXTRA_ITEM_ID} <em>(always returned)</em>: Specifies an opaque string identifier
- * to use to refer to the media item in subsequent requests such as
- * {@link #ACTION_GET_STATUS}.
- * <li>{@link #EXTRA_ITEM_STATUS} <em>(always returned)</em>: Specifies the initial status of
- * the new media item.
- * </ul>
- *
- * <h3>Status updates</h3>
- * <p>
- * If the client supplies an
- * {@link #EXTRA_ITEM_STATUS_UPDATE_RECEIVER item status update receiver}
- * then the media route provider is responsible for sending status updates to the receiver
- * when significant media item state changes occur such as when playback starts or
- * stops. The receiver will not be invoked for content playback position changes.
- * The application may retrieve the current playback position when necessary
- * using the {@link #ACTION_GET_STATUS} request.
- * </p><p>
- * Refer to {@link MediaItemStatus} for details.
- * </p>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if a session id was provided but is unknown or
- * no longer valid, if the item Uri or content type is not supported, or if
- * any other arguments are invalid.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * <h3>Example</h3>
- * <pre>
- * MediaRouter mediaRouter = MediaRouter.getInstance(context);
- * MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute();
- * Intent intent = new Intent(MediaControlIntent.ACTION_PLAY);
- * intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
- * intent.setDataAndType("http://example.com/videos/movie.mp4", "video/mp4");
- * if (route.supportsControlRequest(intent)) {
- * MediaRouter.ControlRequestCallback callback = new MediaRouter.ControlRequestCallback() {
- * public void onResult(Bundle data) {
- * // The request succeeded.
- * // Playback may be controlled using the returned session and item id.
- * String sessionId = data.getString(MediaControlIntent.EXTRA_SESSION_ID);
- * String itemId = data.getString(MediaControlIntent.EXTRA_ITEM_ID);
- * MediaItemStatus status = MediaItemStatus.fromBundle(data.getBundle(
- * MediaControlIntent.EXTRA_ITEM_STATUS));
- * // ...
- * }
- *
- * public void onError(String message, Bundle data) {
- * // An error occurred!
- * }
- * };
- * route.sendControlRequest(intent, callback);
- * }</pre>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- * @see #ACTION_SEEK
- * @see #ACTION_GET_STATUS
- * @see #ACTION_PAUSE
- * @see #ACTION_RESUME
- * @see #ACTION_STOP
- */
- public static final String ACTION_PLAY = "android.media.intent.action.PLAY";
-
- /**
- * Remote playback media control action: Enqueue media item.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action works just like {@link #ACTION_PLAY play} except that it does
- * not clear the queue or reset the pause state when it enqueues the
- * new media item into the session's playback queue. This action only
- * enqueues a media item with no other side-effects on the queue.
- * </p><p>
- * If the queue is currently empty and then the item will play immediately
- * (assuming the queue is not paused). Otherwise, the item will play
- * after all earlier items in the queue have finished or been removed.
- * </p><p>
- * The enqueue action can be used to create new sessions just like play.
- * Its parameters and results are also the same. Only the queuing behavior
- * is different.
- * </p>
- *
- * @see #ACTION_PLAY
- */
- public static final String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
-
- /**
- * Remote playback media control action: Seek media item to a new playback position.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes a remote playback route to modify the current playback position
- * of the specified media item.
- * </p><p>
- * This action only affects the playback position of the media item; not its playback state.
- * If the playback queue is paused, then seeking sets the position but the item
- * remains paused. Likewise if the item is playing, then seeking will cause playback
- * to jump to the new position and continue playing from that point. If the item has
- * not yet started playing, then the new playback position is remembered by the
- * queue and used as the item's initial content position when playback eventually begins.
- * </p><p>
- * If successful, the media item's playback position is changed.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the session
- * to which the media item belongs.
- * <li>{@link #EXTRA_ITEM_ID} <em>(required)</em>: Specifies the media item id of
- * the media item to seek.
- * <li>{@link #EXTRA_ITEM_CONTENT_POSITION} <em>(required)</em>: Specifies the new
- * content position for playback as a long integer number of milliseconds from
- * the beginning of the content.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * <li>{@link #EXTRA_ITEM_STATUS} <em>(always returned)</em>: Specifies the new status of
- * the media item.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id or media item id are unknown
- * or no longer valid, if the content position is invalid, or if the media item
- * is in a terminal state.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- */
- public static final String ACTION_SEEK = "android.media.intent.action.SEEK";
-
- /**
- * Remote playback media control action: Get media item playback status
- * and progress information.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action asks a remote playback route to provide updated playback status and progress
- * information about the specified media item.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the session
- * to which the media item belongs.
- * <li>{@link #EXTRA_ITEM_ID} <em>(required)</em>: Specifies the media item id of
- * the media item to query.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * <li>{@link #EXTRA_ITEM_STATUS} <em>(always returned)</em>: Specifies the current status of
- * the media item.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id or media item id are unknown
- * or no longer valid.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- * @see #EXTRA_ITEM_STATUS_UPDATE_RECEIVER
- */
- public static final String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
-
- /**
- * Remote playback media control action: Remove media item from session's queue.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action asks a remote playback route to remove the specified media item
- * from the session's playback queue. If the current item is removed, then
- * playback will proceed to the next media item (assuming the queue has not been
- * paused).
- * </p><p>
- * This action does not affect the pause state of the queue. If the queue was paused
- * then it remains paused (even if it is now empty) until a resume, stop or play
- * action is issued that causes the pause state to be cleared.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the session
- * to which the media item belongs.
- * <li>{@link #EXTRA_ITEM_ID} <em>(required)</em>: Specifies the media item id of
- * the media item to remove.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * <li>{@link #EXTRA_ITEM_STATUS} <em>(always returned)</em>: Specifies the new status of
- * the media item.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id or media item id are unknown
- * or no longer valid, or if the media item is in a terminal state (and therefore
- * no longer in the queue).
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- */
- public static final String ACTION_REMOVE = "android.media.intent.action.REMOVE";
-
- /* Remote playback actions that affect the whole playback queue. */
-
- /**
- * Remote playback media control action: Pause media playback.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes the playback queue of the specified session to be paused.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the session
- * whose playback queue is to be paused.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id is unknown or no longer valid.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- * @see #ACTION_RESUME
- */
- public static final String ACTION_PAUSE = "android.media.intent.action.PAUSE";
-
- /**
- * Remote playback media control action: Resume media playback (unpause).
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes the playback queue of the specified session to be resumed.
- * Reverses the effects of {@link #ACTION_PAUSE}.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the session
- * whose playback queue is to be resumed.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id is unknown or no longer valid.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- * @see #ACTION_PAUSE
- */
- public static final String ACTION_RESUME = "android.media.intent.action.RESUME";
-
- /**
- * Remote playback media control action: Stop media playback (clear queue and unpause).
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes a remote playback route to stop playback, cancel and remove
- * all media items from the session's media item queue and, reset the queue's
- * pause state.
- * </p><p>
- * If successful, the status of all media items in the queue is set to
- * {@link MediaItemStatus#PLAYBACK_STATE_CANCELED canceled} and a status update is sent
- * to the appropriate status update receivers indicating the new status of each item.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of
- * the session whose playback queue is to be stopped (cleared and unpaused).
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id is unknown or no longer valid.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- */
- public static final String ACTION_STOP = "android.media.intent.action.STOP";
-
- /**
- * Remote playback media control action: Start session.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes a remote playback route to invalidate the current session
- * and start a new session. The new session initially has an empty queue.
- * </p><p>
- * If successful, the status of all media items in the previous session's queue is set to
- * {@link MediaItemStatus#PLAYBACK_STATE_INVALIDATED invalidated} and a status update
- * is sent to the appropriate status update receivers indicating the new status
- * of each item. The previous session becomes no longer valid and the new session
- * takes control of the route.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS_UPDATE_RECEIVER} <em>(optional)</em>: Specifies a
- * {@link PendingIntent} for a broadcast receiver that will receive status updates
- * about the media session.
- * <li>{@link #EXTRA_MESSAGE_RECEIVER} <em>(optional)</em>: Specifies a
- * {@link PendingIntent} for a broadcast receiver that will receive messages from
- * the media session.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(always returned)</em>: Specifies the session id of the
- * session that was started by the request. This will always be a brand new session
- * distinct from any other previously created sessions.
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(always returned)</em>: Specifies the
- * status of the media session.
- * </ul>
- *
- * <h3>Status updates</h3>
- * <p>
- * If the client supplies a
- * {@link #EXTRA_SESSION_STATUS_UPDATE_RECEIVER status update receiver}
- * then the media route provider is responsible for sending status updates to the receiver
- * when significant media session state changes occur such as when the session's
- * queue is paused or resumed or when the session is terminated or invalidated.
- * </p><p>
- * Refer to {@link MediaSessionStatus} for details.
- * </p>
- *
- * <h3>Custom messages</h3>
- * <p>
- * If the client supplies a {@link #EXTRA_MESSAGE_RECEIVER message receiver}
- * then the media route provider is responsible for sending messages to the receiver
- * when the session has any messages to send.
- * </p><p>
- * Refer to {@link #EXTRA_MESSAGE} for details.
- * </p>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session could not be created.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- */
- public static final String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
-
- /**
- * Remote playback media control action: Get media session status information.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action asks a remote playback route to provide updated status information
- * about the specified media session.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the
- * session whose status is to be retrieved.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(always returned)</em>: Specifies the
- * current status of the media session.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id is unknown or no longer valid.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- * @see #EXTRA_SESSION_STATUS_UPDATE_RECEIVER
- */
- public static final String ACTION_GET_SESSION_STATUS =
- "android.media.intent.action.GET_SESSION_STATUS";
-
- /**
- * Remote playback media control action: End session.
- * <p>
- * Used with routes that support {@link #CATEGORY_REMOTE_PLAYBACK remote playback}
- * media control.
- * </p><p>
- * This action causes a remote playback route to end the specified session.
- * The session becomes no longer valid and the route ceases to be under control
- * of the session.
- * </p><p>
- * If successful, the status of the session is set to
- * {@link MediaSessionStatus#SESSION_STATE_ENDED} and a status update is sent to
- * the session's status update receiver.
- * </p><p>
- * Additionally, the status of all media items in the queue is set to
- * {@link MediaItemStatus#PLAYBACK_STATE_CANCELED canceled} and a status update is sent
- * to the appropriate status update receivers indicating the new status of each item.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of
- * the session to end.
- * </ul>
- *
- * <h3>Result data</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(always returned)</em>: Specifies the
- * status of the media session.
- * </ul>
- *
- * <h3>Errors</h3>
- * <p>
- * This action returns an error if the session id is unknown or no longer valid.
- * In other words, it is an error to attempt to end a session other than the
- * current session.
- * </p><ul>
- * <li>{@link #EXTRA_ERROR_CODE} <em>(optional)</em>: Specifies the cause of the error.
- * </ul>
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- * @see #CATEGORY_REMOTE_PLAYBACK
- */
- public static final String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
-
- /**
- * Custom media control action: Send {@link #EXTRA_MESSAGE}.
- * <p>
- * This action asks a route to handle a message described by EXTRA_MESSAGE.
- * </p>
- *
- * <h3>Request parameters</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of the session
- * to which will handle this message.
- * <li>{@link #EXTRA_MESSAGE} <em>(required)</em>: Specifies the message to send.
- * </ul>
- *
- * <h3>Result data</h3>
- * Any messages defined by each media route provider.
- *
- * <h3>Errors</h3>
- * Any error messages defined by each media route provider.
- *
- * @see MediaRouter.RouteInfo#sendControlRequest
- */
- public static final String ACTION_SEND_MESSAGE = "android.media.intent.action.SEND_MESSAGE";
-
- /* Extras and related constants. */
-
- /**
- * Bundle extra: Media session id.
- * <p>
- * An opaque unique identifier that identifies the remote playback media session.
- * </p><p>
- * Used with various actions to specify the id of the media session to be controlled.
- * </p><p>
- * Included in broadcast intents sent to
- * {@link #EXTRA_ITEM_STATUS_UPDATE_RECEIVER item status update receivers} to identify
- * the session to which the item in question belongs.
- * </p><p>
- * Included in broadcast intents sent to
- * {@link #EXTRA_SESSION_STATUS_UPDATE_RECEIVER session status update receivers} to identify
- * the session.
- * </p><p>
- * The value is a unique string value generated by the media route provider
- * to represent one particular media session.
- * </p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_SEEK
- * @see #ACTION_GET_STATUS
- * @see #ACTION_PAUSE
- * @see #ACTION_RESUME
- * @see #ACTION_STOP
- * @see #ACTION_START_SESSION
- * @see #ACTION_GET_SESSION_STATUS
- * @see #ACTION_END_SESSION
- */
- public static final String EXTRA_SESSION_ID =
- "android.media.intent.extra.SESSION_ID";
-
- /**
- * Bundle extra: Media session status.
- * <p>
- * Returned as a result from media session actions such as {@link #ACTION_START_SESSION},
- * {@link #ACTION_PAUSE}, and {@link #ACTION_GET_SESSION_STATUS}
- * to describe the status of the specified media session.
- * </p><p>
- * Included in broadcast intents sent to
- * {@link #EXTRA_SESSION_STATUS_UPDATE_RECEIVER session status update receivers} to provide
- * updated status information.
- * </p><p>
- * The value is a {@link android.os.Bundle} of data that can be converted into
- * a {@link MediaSessionStatus} object using
- * {@link MediaSessionStatus#fromBundle MediaSessionStatus.fromBundle}.
- * </p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_SEEK
- * @see #ACTION_GET_STATUS
- * @see #ACTION_PAUSE
- * @see #ACTION_RESUME
- * @see #ACTION_STOP
- * @see #ACTION_START_SESSION
- * @see #ACTION_GET_SESSION_STATUS
- * @see #ACTION_END_SESSION
- */
- public static final String EXTRA_SESSION_STATUS =
- "android.media.intent.extra.SESSION_STATUS";
-
- /**
- * Bundle extra: Media session status update receiver.
- * <p>
- * Used with {@link #ACTION_START_SESSION} to specify a {@link PendingIntent} for a
- * broadcast receiver that will receive status updates about the media session.
- * </p><p>
- * Whenever the status of the media session changes, the media route provider will
- * send a broadcast to the pending intent with extras that identify the session
- * id and its updated status.
- * </p><p>
- * The value is a {@link PendingIntent}.
- * </p>
- *
- * <h3>Broadcast extras</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of
- * the session.
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(required)</em>: Specifies the status of the
- * session as a bundle that can be decoded into a {@link MediaSessionStatus} object.
- * </ul>
- *
- * @see #ACTION_START_SESSION
- */
- public static final String EXTRA_SESSION_STATUS_UPDATE_RECEIVER =
- "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
-
- /**
- * Bundle extra: Media message receiver.
- * <p>
- * Used with {@link #ACTION_START_SESSION} to specify a {@link PendingIntent} for a
- * broadcast receiver that will receive messages from the media session.
- * </p><p>
- * When the media session has a message to send, the media route provider will
- * send a broadcast to the pending intent with extras that identify the session
- * id and its message.
- * </p><p>
- * The value is a {@link PendingIntent}.
- * </p>
- *
- * <h3>Broadcast extras</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of
- * the session.
- * <li>{@link #EXTRA_MESSAGE} <em>(required)</em>: Specifies the message from
- * the session as a bundle object.
- * </ul>
- *
- * @see #ACTION_START_SESSION
- */
- public static final String EXTRA_MESSAGE_RECEIVER =
- "android.media.intent.extra.MESSAGE_RECEIVER";
-
- /**
- * Bundle extra: Media item id.
- * <p>
- * An opaque unique identifier returned as a result from {@link #ACTION_PLAY} or
- * {@link #ACTION_ENQUEUE} that represents the media item that was created by the
- * playback request.
- * </p><p>
- * Used with various actions to specify the id of the media item to be controlled.
- * </p><p>
- * Included in broadcast intents sent to
- * {@link #EXTRA_ITEM_STATUS_UPDATE_RECEIVER status update receivers} to identify
- * the item in question.
- * </p><p>
- * The value is a unique string value generated by the media route provider
- * to represent one particular media item.
- * </p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_ENQUEUE
- * @see #ACTION_SEEK
- * @see #ACTION_GET_STATUS
- */
- public static final String EXTRA_ITEM_ID =
- "android.media.intent.extra.ITEM_ID";
-
- /**
- * Bundle extra: Media item status.
- * <p>
- * Returned as a result from media item actions such as {@link #ACTION_PLAY},
- * {@link #ACTION_ENQUEUE}, {@link #ACTION_SEEK}, and {@link #ACTION_GET_STATUS}
- * to describe the status of the specified media item.
- * </p><p>
- * Included in broadcast intents sent to
- * {@link #EXTRA_ITEM_STATUS_UPDATE_RECEIVER item status update receivers} to provide
- * updated status information.
- * </p><p>
- * The value is a {@link android.os.Bundle} of data that can be converted into
- * a {@link MediaItemStatus} object using
- * {@link MediaItemStatus#fromBundle MediaItemStatus.fromBundle}.
- * </p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_ENQUEUE
- * @see #ACTION_SEEK
- * @see #ACTION_GET_STATUS
- */
- public static final String EXTRA_ITEM_STATUS =
- "android.media.intent.extra.ITEM_STATUS";
-
- /**
- * Long extra: Media item content position.
- * <p>
- * Used with {@link #ACTION_PLAY} or {@link #ACTION_ENQUEUE} to specify the
- * starting playback position.
- * </p><p>
- * Used with {@link #ACTION_SEEK} to set a new playback position.
- * </p><p>
- * The value is a long integer number of milliseconds from the beginning of the content.
- * <p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_ENQUEUE
- * @see #ACTION_SEEK
- */
- public static final String EXTRA_ITEM_CONTENT_POSITION =
- "android.media.intent.extra.ITEM_POSITION";
-
- /**
- * Bundle extra: Media item metadata.
- * <p>
- * Used with {@link #ACTION_PLAY} or {@link #ACTION_ENQUEUE} to specify metadata
- * associated with the content of a media item.
- * </p><p>
- * The value is a {@link android.os.Bundle} of metadata key-value pairs as defined
- * in {@link MediaItemMetadata}.
- * </p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_ENQUEUE
- */
- public static final String EXTRA_ITEM_METADATA =
- "android.media.intent.extra.ITEM_METADATA";
-
- /**
- * Bundle extra: HTTP request headers.
- * <p>
- * Used with {@link #ACTION_PLAY} or {@link #ACTION_ENQUEUE} to specify HTTP request
- * headers to be included when fetching to the content indicated by the media
- * item's data Uri.
- * </p><p>
- * This extra may be used to provide authentication tokens and other
- * parameters to the server separately from the media item's data Uri.
- * </p><p>
- * The value is a {@link android.os.Bundle} of string based key-value pairs
- * that describe the HTTP request headers.
- * </p>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_ENQUEUE
- */
- public static final String EXTRA_ITEM_HTTP_HEADERS =
- "android.media.intent.extra.HTTP_HEADERS";
-
- /**
- * Bundle extra: Media item status update receiver.
- * <p>
- * Used with {@link #ACTION_PLAY} or {@link #ACTION_ENQUEUE} to specify
- * a {@link PendingIntent} for a
- * broadcast receiver that will receive status updates about a particular
- * media item.
- * </p><p>
- * Whenever the status of the media item changes, the media route provider will
- * send a broadcast to the pending intent with extras that identify the session
- * to which the item belongs, the session status, the item's id
- * and the item's updated status.
- * </p><p>
- * The same pending intent and broadcast receiver may be shared by any number of
- * media items since the broadcast intent includes the media session id
- * and media item id.
- * </p><p>
- * The value is a {@link PendingIntent}.
- * </p>
- *
- * <h3>Broadcast extras</h3>
- * <ul>
- * <li>{@link #EXTRA_SESSION_ID} <em>(required)</em>: Specifies the session id of
- * the session to which the item in question belongs.
- * <li>{@link #EXTRA_SESSION_STATUS} <em>(optional, old implementations may
- * omit this key)</em>: Specifies the status of the media session.
- * <li>{@link #EXTRA_ITEM_ID} <em>(required)</em>: Specifies the media item id of the
- * media item in question.
- * <li>{@link #EXTRA_ITEM_STATUS} <em>(required)</em>: Specifies the status of the
- * item as a bundle that can be decoded into a {@link MediaItemStatus} object.
- * </ul>
- *
- * @see #ACTION_PLAY
- * @see #ACTION_ENQUEUE
- */
- public static final String EXTRA_ITEM_STATUS_UPDATE_RECEIVER =
- "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
-
- /**
- * Bundle extra: Message.
- * <p>
- * Used with {@link #ACTION_SEND_MESSAGE}, and included in broadcast intents sent to
- * {@link #EXTRA_MESSAGE_RECEIVER message receivers} to describe a message between a
- * session and a media route provider.
- * </p><p>
- * The value is a {@link android.os.Bundle}.
- * </p>
- */
- public static final String EXTRA_MESSAGE = "android.media.intent.extra.MESSAGE";
-
- /**
- * Integer extra: Error code.
- * <p>
- * Used with all media control requests to describe the cause of an error.
- * This extra may be omitted when the error is unknown.
- * </p><p>
- * The value is one of: {@link #ERROR_UNKNOWN}, {@link #ERROR_UNSUPPORTED_OPERATION},
- * {@link #ERROR_INVALID_SESSION_ID}, {@link #ERROR_INVALID_ITEM_ID}.
- * </p>
- */
- public static final String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
-
- /**
- * Error code: An unknown error occurred.
- *
- * @see #EXTRA_ERROR_CODE
- */
- public static final int ERROR_UNKNOWN = 0;
-
- /**
- * Error code: The operation is not supported.
- *
- * @see #EXTRA_ERROR_CODE
- */
- public static final int ERROR_UNSUPPORTED_OPERATION = 1;
-
- /**
- * Error code: The session id specified in the request was invalid.
- *
- * @see #EXTRA_ERROR_CODE
- */
- public static final int ERROR_INVALID_SESSION_ID = 2;
-
- /**
- * Error code: The item id specified in the request was invalid.
- *
- * @see #EXTRA_ERROR_CODE
- */
- public static final int ERROR_INVALID_ITEM_ID = 3;
-
- private MediaControlIntent() {
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaItemMetadata.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaItemMetadata.java
deleted file mode 100644
index d52ddb6..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaItemMetadata.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.os.Bundle;
-
-/**
- * Constants for specifying metadata about a media item as a {@link Bundle}.
- * <p>
- * This class is part of the remote playback protocol described by the
- * {@link MediaControlIntent MediaControlIntent} class.
- * </p><p>
- * Media item metadata is described as a bundle of key/value pairs as defined
- * in this class. The documentation specifies the type of value associated
- * with each key.
- * </p><p>
- * An application may specify additional custom metadata keys but there is no guarantee
- * that they will be recognized by the destination.
- * </p>
- */
-public final class MediaItemMetadata {
- /*
- * Note: MediaMetadataRetriever also defines a collection of metadata keys that can be
- * retrieved from a content stream although the representation is somewhat different here
- * since we are sending the data to a remote endpoint.
- */
-
- private MediaItemMetadata() {
- }
-
- /**
- * String key: Album artist name.
- * <p>
- * The value is a string suitable for display.
- * </p>
- */
- public static final String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-
- /**
- * String key: Album title.
- * <p>
- * The value is a string suitable for display.
- * </p>
- */
- public static final String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
-
- /**
- * String key: Artwork Uri.
- * <p>
- * The value is a string URI for an image file associated with the media item,
- * such as album or cover art.
- * </p>
- */
- public static final String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
-
- /**
- * String key: Artist name.
- * <p>
- * The value is a string suitable for display.
- * </p>
- */
- public static final String KEY_ARTIST = "android.media.metadata.ARTIST";
-
- /**
- * String key: Author name.
- * <p>
- * The value is a string suitable for display.
- * </p>
- */
- public static final String KEY_AUTHOR = "android.media.metadata.AUTHOR";
-
- /**
- * String key: Composer name.
- * <p>
- * The value is a string suitable for display.
- * </p>
- */
- public static final String KEY_COMPOSER = "android.media.metadata.COMPOSER";
-
- /**
- * String key: Track title.
- * <p>
- * The value is a string suitable for display.
- * </p>
- */
- public static final String KEY_TITLE = "android.media.metadata.TITLE";
-
- /**
- * Integer key: Year of publication.
- * <p>
- * The value is an integer year number.
- * </p>
- */
- public static final String KEY_YEAR = "android.media.metadata.YEAR";
-
- /**
- * Integer key: Track number (such as a track on a CD).
- * <p>
- * The value is a one-based integer track number.
- * </p>
- */
- public static final String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-
- /**
- * Integer key: Disc number within a collection.
- * <p>
- * The value is a one-based integer disc number.
- * </p>
- */
- public static final String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-
- /**
- * Long key: Item playback duration in milliseconds.
- * <p>
- * The value is a <code>long</code> number of milliseconds.
- * </p><p>
- * The duration metadata is only a hint to enable a remote media player to
- * guess the duration of the content before it actually opens the media stream.
- * The remote media player should still determine the actual content duration from
- * the media stream itself independent of the value that may be specified by this key.
- * </p>
- */
- public static final String KEY_DURATION = "android.media.metadata.DURATION";
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaItemStatus.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaItemStatus.java
deleted file mode 100644
index 92f608b..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaItemStatus.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.app.PendingIntent;
-import android.os.Bundle;
-import android.os.SystemClock;
-
-import androidx.core.util.TimeUtils;
-
-/**
- * Describes the playback status of a media item.
- * <p>
- * This class is part of the remote playback protocol described by the
- * {@link MediaControlIntent MediaControlIntent} class.
- * </p><p>
- * As a media item is played, it transitions through a sequence of states including:
- * {@link #PLAYBACK_STATE_PENDING pending}, {@link #PLAYBACK_STATE_BUFFERING buffering},
- * {@link #PLAYBACK_STATE_PLAYING playing}, {@link #PLAYBACK_STATE_PAUSED paused},
- * {@link #PLAYBACK_STATE_FINISHED finished}, {@link #PLAYBACK_STATE_CANCELED canceled},
- * {@link #PLAYBACK_STATE_INVALIDATED invalidated}, and
- * {@link #PLAYBACK_STATE_ERROR error}. Refer to the documentation of each state
- * for an explanation of its meaning.
- * </p><p>
- * While the item is playing, the playback status may also include progress information
- * about the {@link #getContentPosition content position} and
- * {@link #getContentDuration content duration} although not all route destinations
- * will report it.
- * </p><p>
- * To monitor playback status, the application should supply a {@link PendingIntent} to use as the
- * {@link MediaControlIntent#EXTRA_ITEM_STATUS_UPDATE_RECEIVER item status update receiver}
- * for a given {@link MediaControlIntent#ACTION_PLAY playback request}. Note that
- * the status update receiver will only be invoked for major status changes such as a
- * transition from playing to finished.
- * </p><p class="note">
- * The status update receiver will not be invoked for minor progress updates such as
- * changes to playback position or duration. If the application wants to monitor
- * playback progress, then it must use the
- * {@link MediaControlIntent#ACTION_GET_STATUS get status request} to poll for changes
- * periodically and estimate the playback position while playing. Note that there may
- * be a significant power impact to polling so the application is advised only
- * to poll when the screen is on and never more than about once every 5 seconds or so.
- * </p><p>
- * This object is immutable once created using a {@link Builder} instance.
- * </p>
- */
-public final class MediaItemStatus {
- static final String KEY_TIMESTAMP = "timestamp";
- static final String KEY_PLAYBACK_STATE = "playbackState";
- static final String KEY_CONTENT_POSITION = "contentPosition";
- static final String KEY_CONTENT_DURATION = "contentDuration";
- static final String KEY_EXTRAS = "extras";
-
- final Bundle mBundle;
-
- /**
- * Playback state: Pending.
- * <p>
- * Indicates that the media item has not yet started playback but will be played eventually.
- * </p>
- */
- public static final int PLAYBACK_STATE_PENDING = 0;
-
- /**
- * Playback state: Playing.
- * <p>
- * Indicates that the media item is currently playing.
- * </p>
- */
- public static final int PLAYBACK_STATE_PLAYING = 1;
-
- /**
- * Playback state: Paused.
- * <p>
- * Indicates that playback of the media item has been paused. Playback can be
- * resumed using the {@link MediaControlIntent#ACTION_RESUME resume} action.
- * </p>
- */
- public static final int PLAYBACK_STATE_PAUSED = 2;
-
- /**
- * Playback state: Buffering or seeking to a new position.
- * <p>
- * Indicates that the media item has been temporarily interrupted
- * to fetch more content. Playback will continue automatically
- * when enough content has been buffered.
- * </p>
- */
- public static final int PLAYBACK_STATE_BUFFERING = 3;
-
- /**
- * Playback state: Finished.
- * <p>
- * Indicates that the media item played to the end of the content and finished normally.
- * </p><p>
- * A finished media item cannot be resumed. To play the content again, the application
- * must send a new {@link MediaControlIntent#ACTION_PLAY play} or
- * {@link MediaControlIntent#ACTION_ENQUEUE enqueue} action.
- * </p>
- */
- public static final int PLAYBACK_STATE_FINISHED = 4;
-
- /**
- * Playback state: Canceled.
- * <p>
- * Indicates that the media item was explicitly removed from the queue by the
- * application. Items may be canceled and removed from the queue using
- * the {@link MediaControlIntent#ACTION_REMOVE remove} or
- * {@link MediaControlIntent#ACTION_STOP stop} action or by issuing
- * another {@link MediaControlIntent#ACTION_PLAY play} action that has the
- * side-effect of clearing the queue.
- * </p><p>
- * A canceled media item cannot be resumed. To play the content again, the
- * application must send a new {@link MediaControlIntent#ACTION_PLAY play} or
- * {@link MediaControlIntent#ACTION_ENQUEUE enqueue} action.
- * </p>
- */
- public static final int PLAYBACK_STATE_CANCELED = 5;
-
- /**
- * Playback state: Invalidated.
- * <p>
- * Indicates that the media item was invalidated permanently and involuntarily.
- * This state is used to indicate that the media item was invalidated and removed
- * from the queue because the session to which it belongs was invalidated
- * (typically by another application taking control of the route).
- * </p><p>
- * When invalidation occurs, the application should generally wait for the user
- * to perform an explicit action, such as clicking on a play button in the UI,
- * before creating a new media session to avoid unnecessarily interrupting
- * another application that may have just started using the route.
- * </p><p>
- * An invalidated media item cannot be resumed. To play the content again, the application
- * must send a new {@link MediaControlIntent#ACTION_PLAY play} or
- * {@link MediaControlIntent#ACTION_ENQUEUE enqueue} action.
- * </p>
- */
- public static final int PLAYBACK_STATE_INVALIDATED = 6;
-
- /**
- * Playback state: Playback halted or aborted due to an error.
- * <p>
- * Examples of errors are no network connectivity when attempting to retrieve content
- * from a server, or expired user credentials when trying to play subscription-based
- * content.
- * </p><p>
- * A media item in the error state cannot be resumed. To play the content again,
- * the application must send a new {@link MediaControlIntent#ACTION_PLAY play} or
- * {@link MediaControlIntent#ACTION_ENQUEUE enqueue} action.
- * </p>
- */
- public static final int PLAYBACK_STATE_ERROR = 7;
-
- /**
- * Integer extra: HTTP status code.
- * <p>
- * Specifies the HTTP status code that was encountered when the content
- * was requested after all redirects were followed. This key only needs to
- * specified when the content uri uses the HTTP or HTTPS scheme and an error
- * occurred. This key may be omitted if the content was able to be played
- * successfully; there is no need to report a 200 (OK) status code.
- * </p><p>
- * The value is an integer HTTP status code, such as 401 (Unauthorized),
- * 404 (Not Found), or 500 (Server Error), or 0 if none.
- * </p>
- */
- public static final String EXTRA_HTTP_STATUS_CODE =
- "android.media.status.extra.HTTP_STATUS_CODE";
-
- /**
- * Bundle extra: HTTP response headers.
- * <p>
- * Specifies the HTTP response headers that were returned when the content was
- * requested from the network. The headers may include additional information
- * about the content or any errors conditions that were encountered while
- * trying to fetch the content.
- * </p><p>
- * The value is a {@link android.os.Bundle} of string based key-value pairs
- * that describe the HTTP response headers.
- * </p>
- */
- public static final String EXTRA_HTTP_RESPONSE_HEADERS =
- "android.media.status.extra.HTTP_RESPONSE_HEADERS";
-
- MediaItemStatus(Bundle bundle) {
- mBundle = bundle;
- }
-
- /**
- * Gets the timestamp associated with the status information in
- * milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base.
- *
- * @return The status timestamp in the {@link SystemClock#elapsedRealtime()} time base.
- */
- public long getTimestamp() {
- return mBundle.getLong(KEY_TIMESTAMP);
- }
-
- /**
- * Gets the playback state of the media item.
- *
- * @return The playback state. One of {@link #PLAYBACK_STATE_PENDING},
- * {@link #PLAYBACK_STATE_PLAYING}, {@link #PLAYBACK_STATE_PAUSED},
- * {@link #PLAYBACK_STATE_BUFFERING}, {@link #PLAYBACK_STATE_FINISHED},
- * {@link #PLAYBACK_STATE_CANCELED}, {@link #PLAYBACK_STATE_INVALIDATED},
- * or {@link #PLAYBACK_STATE_ERROR}.
- */
- public int getPlaybackState() {
- return mBundle.getInt(KEY_PLAYBACK_STATE, PLAYBACK_STATE_ERROR);
- }
-
- /**
- * Gets the content playback position as a long integer number of milliseconds
- * from the beginning of the content.
- *
- * @return The content playback position in milliseconds, or -1 if unknown.
- */
- public long getContentPosition() {
- return mBundle.getLong(KEY_CONTENT_POSITION, -1);
- }
-
- /**
- * Gets the total duration of the content to be played as a long integer number of
- * milliseconds.
- *
- * @return The content duration in milliseconds, or -1 if unknown.
- */
- public long getContentDuration() {
- return mBundle.getLong(KEY_CONTENT_DURATION, -1);
- }
-
- /**
- * Gets a bundle of extras for this status object.
- * The extras will be ignored by the media router but they may be used
- * by applications.
- */
- public Bundle getExtras() {
- return mBundle.getBundle(KEY_EXTRAS);
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append("MediaItemStatus{ ");
- result.append("timestamp=");
- TimeUtils.formatDuration(SystemClock.elapsedRealtime() - getTimestamp(), result);
- result.append(" ms ago");
- result.append(", playbackState=").append(playbackStateToString(getPlaybackState()));
- result.append(", contentPosition=").append(getContentPosition());
- result.append(", contentDuration=").append(getContentDuration());
- result.append(", extras=").append(getExtras());
- result.append(" }");
- return result.toString();
- }
-
- private static String playbackStateToString(int playbackState) {
- switch (playbackState) {
- case PLAYBACK_STATE_PENDING:
- return "pending";
- case PLAYBACK_STATE_BUFFERING:
- return "buffering";
- case PLAYBACK_STATE_PLAYING:
- return "playing";
- case PLAYBACK_STATE_PAUSED:
- return "paused";
- case PLAYBACK_STATE_FINISHED:
- return "finished";
- case PLAYBACK_STATE_CANCELED:
- return "canceled";
- case PLAYBACK_STATE_INVALIDATED:
- return "invalidated";
- case PLAYBACK_STATE_ERROR:
- return "error";
- }
- return Integer.toString(playbackState);
- }
-
- /**
- * Converts this object to a bundle for serialization.
- *
- * @return The contents of the object represented as a bundle.
- */
- public Bundle asBundle() {
- return mBundle;
- }
-
- /**
- * Creates an instance from a bundle.
- *
- * @param bundle The bundle, or null if none.
- * @return The new instance, or null if the bundle was null.
- */
- public static MediaItemStatus fromBundle(Bundle bundle) {
- return bundle != null ? new MediaItemStatus(bundle) : null;
- }
-
- /**
- * Builder for {@link MediaItemStatus media item status objects}.
- */
- public static final class Builder {
- private final Bundle mBundle;
-
- /**
- * Creates a media item status builder using the current time as the
- * reference timestamp.
- *
- * @param playbackState The item playback state.
- */
- public Builder(int playbackState) {
- mBundle = new Bundle();
- setTimestamp(SystemClock.elapsedRealtime());
- setPlaybackState(playbackState);
- }
-
- /**
- * Creates a media item status builder whose initial contents are
- * copied from an existing status.
- */
- public Builder(MediaItemStatus status) {
- if (status == null) {
- throw new IllegalArgumentException("status must not be null");
- }
-
- mBundle = new Bundle(status.mBundle);
- }
-
- /**
- * Sets the timestamp associated with the status information in
- * milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base.
- */
- public Builder setTimestamp(long elapsedRealtimeTimestamp) {
- mBundle.putLong(KEY_TIMESTAMP, elapsedRealtimeTimestamp);
- return this;
- }
-
- /**
- * Sets the playback state of the media item.
- */
- public Builder setPlaybackState(int playbackState) {
- mBundle.putInt(KEY_PLAYBACK_STATE, playbackState);
- return this;
- }
-
- /**
- * Sets the content playback position as a long integer number of milliseconds
- * from the beginning of the content.
- */
- public Builder setContentPosition(long positionMilliseconds) {
- mBundle.putLong(KEY_CONTENT_POSITION, positionMilliseconds);
- return this;
- }
-
- /**
- * Sets the total duration of the content to be played as a long integer number
- * of milliseconds.
- */
- public Builder setContentDuration(long durationMilliseconds) {
- mBundle.putLong(KEY_CONTENT_DURATION, durationMilliseconds);
- return this;
- }
-
- /**
- * Sets a bundle of extras for this status object.
- * The extras will be ignored by the media router but they may be used
- * by applications.
- */
- public Builder setExtras(Bundle extras) {
- mBundle.putBundle(KEY_EXTRAS, extras);
- return this;
- }
-
- /**
- * Builds the {@link MediaItemStatus media item status object}.
- */
- public MediaItemStatus build() {
- return new MediaItemStatus(mBundle);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteDescriptor.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteDescriptor.java
deleted file mode 100644
index 6bc84fc..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteDescriptor.java
+++ /dev/null
@@ -1,693 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.support.mediarouter.media;
-
-import android.content.IntentFilter;
-import android.content.IntentSender;
-import android.net.Uri;
-import android.os.Bundle;
-import android.text.TextUtils;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Describes the properties of a route.
- * <p>
- * Each route is uniquely identified by an opaque id string. This token
- * may take any form as long as it is unique within the media route provider.
- * </p><p>
- * This object is immutable once created using a {@link Builder} instance.
- * </p>
- */
-public final class MediaRouteDescriptor {
- static final String KEY_ID = "id";
- static final String KEY_GROUP_MEMBER_IDS = "groupMemberIds";
- static final String KEY_NAME = "name";
- static final String KEY_DESCRIPTION = "status";
- static final String KEY_ICON_URI = "iconUri";
- static final String KEY_ENABLED = "enabled";
- static final String KEY_CONNECTING = "connecting";
- static final String KEY_CONNECTION_STATE = "connectionState";
- static final String KEY_CONTROL_FILTERS = "controlFilters";
- static final String KEY_PLAYBACK_TYPE = "playbackType";
- static final String KEY_PLAYBACK_STREAM = "playbackStream";
- static final String KEY_DEVICE_TYPE = "deviceType";
- static final String KEY_VOLUME = "volume";
- static final String KEY_VOLUME_MAX = "volumeMax";
- static final String KEY_VOLUME_HANDLING = "volumeHandling";
- static final String KEY_PRESENTATION_DISPLAY_ID = "presentationDisplayId";
- static final String KEY_EXTRAS = "extras";
- static final String KEY_CAN_DISCONNECT = "canDisconnect";
- static final String KEY_SETTINGS_INTENT = "settingsIntent";
- static final String KEY_MIN_CLIENT_VERSION = "minClientVersion";
- static final String KEY_MAX_CLIENT_VERSION = "maxClientVersion";
-
- final Bundle mBundle;
- List<IntentFilter> mControlFilters;
-
- MediaRouteDescriptor(Bundle bundle, List<IntentFilter> controlFilters) {
- mBundle = bundle;
- mControlFilters = controlFilters;
- }
-
- /**
- * Gets the unique id of the route.
- * <p>
- * The route id associated with a route descriptor functions as a stable
- * identifier for the route and must be unique among all routes offered
- * by the provider.
- * </p>
- */
- public String getId() {
- return mBundle.getString(KEY_ID);
- }
-
- /**
- * Gets the group member ids of the route.
- * <p>
- * A route descriptor that has one or more group member route ids
- * represents a route group. A member route may belong to another group.
- * </p>
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public List<String> getGroupMemberIds() {
- return mBundle.getStringArrayList(KEY_GROUP_MEMBER_IDS);
- }
-
- /**
- * Gets the user-visible name of the route.
- * <p>
- * The route name identifies the destination represented by the route.
- * It may be a user-supplied name, an alias, or device serial number.
- * </p>
- */
- public String getName() {
- return mBundle.getString(KEY_NAME);
- }
-
- /**
- * Gets the user-visible description of the route.
- * <p>
- * The route description describes the kind of destination represented by the route.
- * It may be a user-supplied string, a model number or brand of device.
- * </p>
- */
- public String getDescription() {
- return mBundle.getString(KEY_DESCRIPTION);
- }
-
- /**
- * Gets the URI of the icon representing this route.
- * <p>
- * This icon will be used in picker UIs if available.
- * </p>
- */
- public Uri getIconUri() {
- String iconUri = mBundle.getString(KEY_ICON_URI);
- return iconUri == null ? null : Uri.parse(iconUri);
- }
-
- /**
- * Gets whether the route is enabled.
- */
- public boolean isEnabled() {
- return mBundle.getBoolean(KEY_ENABLED, true);
- }
-
- /**
- * Gets whether the route is connecting.
- * @deprecated Use {@link #getConnectionState} instead
- */
- @Deprecated
- public boolean isConnecting() {
- return mBundle.getBoolean(KEY_CONNECTING, false);
- }
-
- /**
- * Gets the connection state of the route.
- *
- * @return The connection state of this route:
- * {@link MediaRouter.RouteInfo#CONNECTION_STATE_DISCONNECTED},
- * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTING}, or
- * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTED}.
- */
- public int getConnectionState() {
- return mBundle.getInt(KEY_CONNECTION_STATE,
- MediaRouter.RouteInfo.CONNECTION_STATE_DISCONNECTED);
- }
-
- /**
- * Gets whether the route can be disconnected without stopping playback.
- * <p>
- * The route can normally be disconnected without stopping playback when
- * the destination device on the route is connected to two or more source
- * devices. The route provider should update the route immediately when the
- * number of connected devices changes.
- * </p><p>
- * To specify that the route should disconnect without stopping use
- * {@link MediaRouter#unselect(int)} with
- * {@link MediaRouter#UNSELECT_REASON_DISCONNECTED}.
- * </p>
- */
- public boolean canDisconnectAndKeepPlaying() {
- return mBundle.getBoolean(KEY_CAN_DISCONNECT, false);
- }
-
- /**
- * Gets an {@link IntentSender} for starting a settings activity for this
- * route. The activity may have specific route settings or general settings
- * for the connected device or route provider.
- *
- * @return An {@link IntentSender} to start a settings activity.
- */
- public IntentSender getSettingsActivity() {
- return mBundle.getParcelable(KEY_SETTINGS_INTENT);
- }
-
- /**
- * Gets the route's {@link MediaControlIntent media control intent} filters.
- */
- public List<IntentFilter> getControlFilters() {
- ensureControlFilters();
- return mControlFilters;
- }
-
- void ensureControlFilters() {
- if (mControlFilters == null) {
- mControlFilters = mBundle.<IntentFilter>getParcelableArrayList(KEY_CONTROL_FILTERS);
- if (mControlFilters == null) {
- mControlFilters = Collections.<IntentFilter>emptyList();
- }
- }
- }
-
- /**
- * Gets the type of playback associated with this route.
- *
- * @return The type of playback associated with this route:
- * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_LOCAL} or
- * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_REMOTE}.
- */
- public int getPlaybackType() {
- return mBundle.getInt(KEY_PLAYBACK_TYPE, MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE);
- }
-
- /**
- * Gets the route's playback stream.
- */
- public int getPlaybackStream() {
- return mBundle.getInt(KEY_PLAYBACK_STREAM, -1);
- }
-
- /**
- * Gets the type of the receiver device associated with this route.
- *
- * @return The type of the receiver device associated with this route:
- * {@link MediaRouter.RouteInfo#DEVICE_TYPE_TV} or
- * {@link MediaRouter.RouteInfo#DEVICE_TYPE_SPEAKER}.
- */
- public int getDeviceType() {
- return mBundle.getInt(KEY_DEVICE_TYPE);
- }
-
- /**
- * Gets the route's current volume, or 0 if unknown.
- */
- public int getVolume() {
- return mBundle.getInt(KEY_VOLUME);
- }
-
- /**
- * Gets the route's maximum volume, or 0 if unknown.
- */
- public int getVolumeMax() {
- return mBundle.getInt(KEY_VOLUME_MAX);
- }
-
- /**
- * Gets information about how volume is handled on the route.
- *
- * @return How volume is handled on the route:
- * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_FIXED} or
- * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_VARIABLE}.
- */
- public int getVolumeHandling() {
- return mBundle.getInt(KEY_VOLUME_HANDLING,
- MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED);
- }
-
- /**
- * Gets the route's presentation display id, or -1 if none.
- */
- public int getPresentationDisplayId() {
- return mBundle.getInt(
- KEY_PRESENTATION_DISPLAY_ID, MediaRouter.RouteInfo.PRESENTATION_DISPLAY_ID_NONE);
- }
-
- /**
- * Gets a bundle of extras for this route descriptor.
- * The extras will be ignored by the media router but they may be used
- * by applications.
- */
- public Bundle getExtras() {
- return mBundle.getBundle(KEY_EXTRAS);
- }
-
- /**
- * Gets the minimum client version required for this route.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public int getMinClientVersion() {
- return mBundle.getInt(KEY_MIN_CLIENT_VERSION,
- MediaRouteProviderProtocol.CLIENT_VERSION_START);
- }
-
- /**
- * Gets the maximum client version required for this route.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public int getMaxClientVersion() {
- return mBundle.getInt(KEY_MAX_CLIENT_VERSION, Integer.MAX_VALUE);
- }
-
- /**
- * Returns true if the route descriptor has all of the required fields.
- */
- public boolean isValid() {
- ensureControlFilters();
- if (TextUtils.isEmpty(getId())
- || TextUtils.isEmpty(getName())
- || mControlFilters.contains(null)) {
- return false;
- }
- return true;
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append("MediaRouteDescriptor{ ");
- result.append("id=").append(getId());
- result.append(", groupMemberIds=").append(getGroupMemberIds());
- result.append(", name=").append(getName());
- result.append(", description=").append(getDescription());
- result.append(", iconUri=").append(getIconUri());
- result.append(", isEnabled=").append(isEnabled());
- result.append(", isConnecting=").append(isConnecting());
- result.append(", connectionState=").append(getConnectionState());
- result.append(", controlFilters=").append(Arrays.toString(getControlFilters().toArray()));
- result.append(", playbackType=").append(getPlaybackType());
- result.append(", playbackStream=").append(getPlaybackStream());
- result.append(", deviceType=").append(getDeviceType());
- result.append(", volume=").append(getVolume());
- result.append(", volumeMax=").append(getVolumeMax());
- result.append(", volumeHandling=").append(getVolumeHandling());
- result.append(", presentationDisplayId=").append(getPresentationDisplayId());
- result.append(", extras=").append(getExtras());
- result.append(", isValid=").append(isValid());
- result.append(", minClientVersion=").append(getMinClientVersion());
- result.append(", maxClientVersion=").append(getMaxClientVersion());
- result.append(" }");
- return result.toString();
- }
-
- /**
- * Converts this object to a bundle for serialization.
- *
- * @return The contents of the object represented as a bundle.
- */
- public Bundle asBundle() {
- return mBundle;
- }
-
- /**
- * Creates an instance from a bundle.
- *
- * @param bundle The bundle, or null if none.
- * @return The new instance, or null if the bundle was null.
- */
- public static MediaRouteDescriptor fromBundle(Bundle bundle) {
- return bundle != null ? new MediaRouteDescriptor(bundle, null) : null;
- }
-
- /**
- * Builder for {@link MediaRouteDescriptor media route descriptors}.
- */
- public static final class Builder {
- private final Bundle mBundle;
- private ArrayList<String> mGroupMemberIds;
- private ArrayList<IntentFilter> mControlFilters;
-
- /**
- * Creates a media route descriptor builder.
- *
- * @param id The unique id of the route.
- * @param name The user-visible name of the route.
- */
- public Builder(String id, String name) {
- mBundle = new Bundle();
- setId(id);
- setName(name);
- }
-
- /**
- * Creates a media route descriptor builder whose initial contents are
- * copied from an existing descriptor.
- */
- public Builder(MediaRouteDescriptor descriptor) {
- if (descriptor == null) {
- throw new IllegalArgumentException("descriptor must not be null");
- }
-
- mBundle = new Bundle(descriptor.mBundle);
-
- descriptor.ensureControlFilters();
- if (!descriptor.mControlFilters.isEmpty()) {
- mControlFilters = new ArrayList<IntentFilter>(descriptor.mControlFilters);
- }
- }
-
- /**
- * Sets the unique id of the route.
- * <p>
- * The route id associated with a route descriptor functions as a stable
- * identifier for the route and must be unique among all routes offered
- * by the provider.
- * </p>
- */
- public Builder setId(String id) {
- mBundle.putString(KEY_ID, id);
- return this;
- }
-
- /**
- * Adds a group member id of the route.
- * <p>
- * A route descriptor that has one or more group member route ids
- * represents a route group. A member route may belong to another group.
- * </p>
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public Builder addGroupMemberId(String groupMemberId) {
- if (TextUtils.isEmpty(groupMemberId)) {
- throw new IllegalArgumentException("groupMemberId must not be empty");
- }
-
- if (mGroupMemberIds == null) {
- mGroupMemberIds = new ArrayList<>();
- }
- if (!mGroupMemberIds.contains(groupMemberId)) {
- mGroupMemberIds.add(groupMemberId);
- }
- return this;
- }
-
- /**
- * Adds a list of group member ids of the route.
- * <p>
- * A route descriptor that has one or more group member route ids
- * represents a route group. A member route may belong to another group.
- * </p>
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public Builder addGroupMemberIds(Collection<String> groupMemberIds) {
- if (groupMemberIds == null) {
- throw new IllegalArgumentException("groupMemberIds must not be null");
- }
-
- if (!groupMemberIds.isEmpty()) {
- for (String groupMemberId : groupMemberIds) {
- addGroupMemberId(groupMemberId);
- }
- }
- return this;
- }
-
- /**
- * Sets the user-visible name of the route.
- * <p>
- * The route name identifies the destination represented by the route.
- * It may be a user-supplied name, an alias, or device serial number.
- * </p>
- */
- public Builder setName(String name) {
- mBundle.putString(KEY_NAME, name);
- return this;
- }
-
- /**
- * Sets the user-visible description of the route.
- * <p>
- * The route description describes the kind of destination represented by the route.
- * It may be a user-supplied string, a model number or brand of device.
- * </p>
- */
- public Builder setDescription(String description) {
- mBundle.putString(KEY_DESCRIPTION, description);
- return this;
- }
-
- /**
- * Sets the URI of the icon representing this route.
- * <p>
- * This icon will be used in picker UIs if available.
- * </p><p>
- * The URI must be one of the following formats:
- * <ul>
- * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
- * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})
- * </li>
- * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li>
- * </ul>
- * </p>
- */
- public Builder setIconUri(Uri iconUri) {
- if (iconUri == null) {
- throw new IllegalArgumentException("iconUri must not be null");
- }
- mBundle.putString(KEY_ICON_URI, iconUri.toString());
- return this;
- }
-
- /**
- * Sets whether the route is enabled.
- * <p>
- * Disabled routes represent routes that a route provider knows about, such as paired
- * Wifi Display receivers, but that are not currently available for use.
- * </p>
- */
- public Builder setEnabled(boolean enabled) {
- mBundle.putBoolean(KEY_ENABLED, enabled);
- return this;
- }
-
- /**
- * Sets whether the route is in the process of connecting and is not yet
- * ready for use.
- * @deprecated Use {@link #setConnectionState} instead.
- */
- @Deprecated
- public Builder setConnecting(boolean connecting) {
- mBundle.putBoolean(KEY_CONNECTING, connecting);
- return this;
- }
-
- /**
- * Sets the route's connection state.
- *
- * @param connectionState The connection state of the route:
- * {@link MediaRouter.RouteInfo#CONNECTION_STATE_DISCONNECTED},
- * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTING}, or
- * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTED}.
- */
- public Builder setConnectionState(int connectionState) {
- mBundle.putInt(KEY_CONNECTION_STATE, connectionState);
- return this;
- }
-
- /**
- * Sets whether the route can be disconnected without stopping playback.
- */
- public Builder setCanDisconnect(boolean canDisconnect) {
- mBundle.putBoolean(KEY_CAN_DISCONNECT, canDisconnect);
- return this;
- }
-
- /**
- * Sets an intent sender for launching the settings activity for this
- * route.
- */
- public Builder setSettingsActivity(IntentSender is) {
- mBundle.putParcelable(KEY_SETTINGS_INTENT, is);
- return this;
- }
-
- /**
- * Adds a {@link MediaControlIntent media control intent} filter for the route.
- */
- public Builder addControlFilter(IntentFilter filter) {
- if (filter == null) {
- throw new IllegalArgumentException("filter must not be null");
- }
-
- if (mControlFilters == null) {
- mControlFilters = new ArrayList<IntentFilter>();
- }
- if (!mControlFilters.contains(filter)) {
- mControlFilters.add(filter);
- }
- return this;
- }
-
- /**
- * Adds a list of {@link MediaControlIntent media control intent} filters for the route.
- */
- public Builder addControlFilters(Collection<IntentFilter> filters) {
- if (filters == null) {
- throw new IllegalArgumentException("filters must not be null");
- }
-
- if (!filters.isEmpty()) {
- for (IntentFilter filter : filters) {
- addControlFilter(filter);
- }
- }
- return this;
- }
-
- /**
- * Sets the route's playback type.
- *
- * @param playbackType The playback type of the route:
- * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_LOCAL} or
- * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_REMOTE}.
- */
- public Builder setPlaybackType(int playbackType) {
- mBundle.putInt(KEY_PLAYBACK_TYPE, playbackType);
- return this;
- }
-
- /**
- * Sets the route's playback stream.
- */
- public Builder setPlaybackStream(int playbackStream) {
- mBundle.putInt(KEY_PLAYBACK_STREAM, playbackStream);
- return this;
- }
-
- /**
- * Sets the route's receiver device type.
- *
- * @param deviceType The receive device type of the route:
- * {@link MediaRouter.RouteInfo#DEVICE_TYPE_TV} or
- * {@link MediaRouter.RouteInfo#DEVICE_TYPE_SPEAKER}.
- */
- public Builder setDeviceType(int deviceType) {
- mBundle.putInt(KEY_DEVICE_TYPE, deviceType);
- return this;
- }
-
- /**
- * Sets the route's current volume, or 0 if unknown.
- */
- public Builder setVolume(int volume) {
- mBundle.putInt(KEY_VOLUME, volume);
- return this;
- }
-
- /**
- * Sets the route's maximum volume, or 0 if unknown.
- */
- public Builder setVolumeMax(int volumeMax) {
- mBundle.putInt(KEY_VOLUME_MAX, volumeMax);
- return this;
- }
-
- /**
- * Sets the route's volume handling.
- *
- * @param volumeHandling how volume is handled on the route:
- * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_FIXED} or
- * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_VARIABLE}.
- */
- public Builder setVolumeHandling(int volumeHandling) {
- mBundle.putInt(KEY_VOLUME_HANDLING, volumeHandling);
- return this;
- }
-
- /**
- * Sets the route's presentation display id, or -1 if none.
- */
- public Builder setPresentationDisplayId(int presentationDisplayId) {
- mBundle.putInt(KEY_PRESENTATION_DISPLAY_ID, presentationDisplayId);
- return this;
- }
-
- /**
- * Sets a bundle of extras for this route descriptor.
- * The extras will be ignored by the media router but they may be used
- * by applications.
- */
- public Builder setExtras(Bundle extras) {
- mBundle.putBundle(KEY_EXTRAS, extras);
- return this;
- }
-
- /**
- * Sets the route's minimum client version.
- * A router whose version is lower than this will not be able to connect to this route.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public Builder setMinClientVersion(int minVersion) {
- mBundle.putInt(KEY_MIN_CLIENT_VERSION, minVersion);
- return this;
- }
-
- /**
- * Sets the route's maximum client version.
- * A router whose version is higher than this will not be able to connect to this route.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public Builder setMaxClientVersion(int maxVersion) {
- mBundle.putInt(KEY_MAX_CLIENT_VERSION, maxVersion);
- return this;
- }
-
- /**
- * Builds the {@link MediaRouteDescriptor media route descriptor}.
- */
- public MediaRouteDescriptor build() {
- if (mControlFilters != null) {
- mBundle.putParcelableArrayList(KEY_CONTROL_FILTERS, mControlFilters);
- }
- if (mGroupMemberIds != null) {
- mBundle.putStringArrayList(KEY_GROUP_MEMBER_IDS, mGroupMemberIds);
- }
- return new MediaRouteDescriptor(mBundle, mControlFilters);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteDiscoveryRequest.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteDiscoveryRequest.java
deleted file mode 100644
index 039627f..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteDiscoveryRequest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.support.mediarouter.media;
-
-import android.os.Bundle;
-
-/**
- * Describes the kinds of routes that the media router would like to discover
- * and whether to perform active scanning.
- * <p>
- * This object is immutable once created.
- * </p>
- */
-public final class MediaRouteDiscoveryRequest {
- private static final String KEY_SELECTOR = "selector";
- private static final String KEY_ACTIVE_SCAN = "activeScan";
-
- private final Bundle mBundle;
- private MediaRouteSelector mSelector;
-
- /**
- * Creates a media route discovery request.
- *
- * @param selector The route selector that specifies the kinds of routes to discover.
- * @param activeScan True if active scanning should be performed.
- */
- public MediaRouteDiscoveryRequest(MediaRouteSelector selector, boolean activeScan) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- mBundle = new Bundle();
- mSelector = selector;
- mBundle.putBundle(KEY_SELECTOR, selector.asBundle());
- mBundle.putBoolean(KEY_ACTIVE_SCAN, activeScan);
- }
-
- private MediaRouteDiscoveryRequest(Bundle bundle) {
- mBundle = bundle;
- }
-
- /**
- * Gets the route selector that specifies the kinds of routes to discover.
- */
- public MediaRouteSelector getSelector() {
- ensureSelector();
- return mSelector;
- }
-
- private void ensureSelector() {
- if (mSelector == null) {
- mSelector = MediaRouteSelector.fromBundle(mBundle.getBundle(KEY_SELECTOR));
- if (mSelector == null) {
- mSelector = MediaRouteSelector.EMPTY;
- }
- }
- }
-
- /**
- * Returns true if active scanning should be performed.
- *
- * @see MediaRouter#CALLBACK_FLAG_PERFORM_ACTIVE_SCAN
- */
- public boolean isActiveScan() {
- return mBundle.getBoolean(KEY_ACTIVE_SCAN);
- }
-
- /**
- * Returns true if the discovery request has all of the required fields.
- */
- public boolean isValid() {
- ensureSelector();
- return mSelector.isValid();
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof MediaRouteDiscoveryRequest) {
- MediaRouteDiscoveryRequest other = (MediaRouteDiscoveryRequest)o;
- return getSelector().equals(other.getSelector())
- && isActiveScan() == other.isActiveScan();
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return getSelector().hashCode() ^ (isActiveScan() ? 1 : 0);
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append("DiscoveryRequest{ selector=").append(getSelector());
- result.append(", activeScan=").append(isActiveScan());
- result.append(", isValid=").append(isValid());
- result.append(" }");
- return result.toString();
- }
-
- /**
- * Converts this object to a bundle for serialization.
- *
- * @return The contents of the object represented as a bundle.
- */
- public Bundle asBundle() {
- return mBundle;
- }
-
- /**
- * Creates an instance from a bundle.
- *
- * @param bundle The bundle, or null if none.
- * @return The new instance, or null if the bundle was null.
- */
- public static MediaRouteDiscoveryRequest fromBundle(Bundle bundle) {
- return bundle != null ? new MediaRouteDiscoveryRequest(bundle) : null;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProvider.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProvider.java
deleted file mode 100644
index 7ea328c..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProvider.java
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Handler;
-import android.os.Message;
-
-import androidx.core.util.ObjectsCompat;
-
-import com.android.support.mediarouter.media.MediaRouter.ControlRequestCallback;
-
-/**
- * Media route providers are used to publish additional media routes for
- * use within an application. Media route providers may also be declared
- * as a service to publish additional media routes to all applications
- * in the system.
- * <p>
- * The purpose of a media route provider is to discover media routes that satisfy
- * the criteria specified by the current {@link MediaRouteDiscoveryRequest} and publish a
- * {@link MediaRouteProviderDescriptor} with information about each route by calling
- * {@link #setDescriptor} to notify the currently registered {@link Callback}.
- * </p><p>
- * The provider should watch for changes to the discovery request by implementing
- * {@link #onDiscoveryRequestChanged} and updating the set of routes that it is
- * attempting to discover. It should also handle route control requests such
- * as volume changes or {@link MediaControlIntent media control intents}
- * by implementing {@link #onCreateRouteController} to return a {@link RouteController}
- * for a particular route.
- * </p><p>
- * A media route provider may be used privately within the scope of a single
- * application process by calling {@link MediaRouter#addProvider MediaRouter.addProvider}
- * to add it to the local {@link MediaRouter}. A media route provider may also be made
- * available globally to all applications by registering a {@link MediaRouteProviderService}
- * in the provider's manifest. When the media route provider is registered
- * as a service, all applications that use the media router API will be able to
- * discover and used the provider's routes without having to install anything else.
- * </p><p>
- * This object must only be accessed on the main thread.
- * </p>
- */
-public abstract class MediaRouteProvider {
- static final int MSG_DELIVER_DESCRIPTOR_CHANGED = 1;
- static final int MSG_DELIVER_DISCOVERY_REQUEST_CHANGED = 2;
-
- private final Context mContext;
- private final ProviderMetadata mMetadata;
- private final ProviderHandler mHandler = new ProviderHandler();
-
- private Callback mCallback;
-
- private MediaRouteDiscoveryRequest mDiscoveryRequest;
- private boolean mPendingDiscoveryRequestChange;
-
- private MediaRouteProviderDescriptor mDescriptor;
- private boolean mPendingDescriptorChange;
-
- /**
- * Creates a media route provider.
- *
- * @param context The context.
- */
- public MediaRouteProvider(@NonNull Context context) {
- this(context, null);
- }
-
- MediaRouteProvider(Context context, ProviderMetadata metadata) {
- if (context == null) {
- throw new IllegalArgumentException("context must not be null");
- }
-
- mContext = context;
- if (metadata == null) {
- mMetadata = new ProviderMetadata(new ComponentName(context, getClass()));
- } else {
- mMetadata = metadata;
- }
- }
-
- /**
- * Gets the context of the media route provider.
- */
- public final Context getContext() {
- return mContext;
- }
-
- /**
- * Gets the provider's handler which is associated with the main thread.
- */
- public final Handler getHandler() {
- return mHandler;
- }
-
- /**
- * Gets some metadata about the provider's implementation.
- */
- public final ProviderMetadata getMetadata() {
- return mMetadata;
- }
-
- /**
- * Sets a callback to invoke when the provider's descriptor changes.
- *
- * @param callback The callback to use, or null if none.
- */
- public final void setCallback(@Nullable Callback callback) {
- MediaRouter.checkCallingThread();
- mCallback = callback;
- }
-
- /**
- * Gets the current discovery request which informs the provider about the
- * kinds of routes to discover and whether to perform active scanning.
- *
- * @return The current discovery request, or null if no discovery is needed at this time.
- *
- * @see #onDiscoveryRequestChanged
- */
- @Nullable
- public final MediaRouteDiscoveryRequest getDiscoveryRequest() {
- return mDiscoveryRequest;
- }
-
- /**
- * Sets a discovery request to inform the provider about the kinds of
- * routes that its clients would like to discover and whether to perform active scanning.
- *
- * @param request The discovery request, or null if no discovery is needed at this time.
- *
- * @see #onDiscoveryRequestChanged
- */
- public final void setDiscoveryRequest(MediaRouteDiscoveryRequest request) {
- MediaRouter.checkCallingThread();
-
- if (ObjectsCompat.equals(mDiscoveryRequest, request)) {
- return;
- }
-
- mDiscoveryRequest = request;
- if (!mPendingDiscoveryRequestChange) {
- mPendingDiscoveryRequestChange = true;
- mHandler.sendEmptyMessage(MSG_DELIVER_DISCOVERY_REQUEST_CHANGED);
- }
- }
-
- void deliverDiscoveryRequestChanged() {
- mPendingDiscoveryRequestChange = false;
- onDiscoveryRequestChanged(mDiscoveryRequest);
- }
-
- /**
- * Called by the media router when the {@link MediaRouteDiscoveryRequest discovery request}
- * has changed.
- * <p>
- * Whenever an applications calls {@link MediaRouter#addCallback} to register
- * a callback, it also provides a selector to specify the kinds of routes that
- * it is interested in. The media router combines all of these selectors together
- * to generate a {@link MediaRouteDiscoveryRequest} and notifies each provider when a change
- * occurs by calling {@link #setDiscoveryRequest} which posts a message to invoke
- * this method asynchronously.
- * </p><p>
- * The provider should examine the {@link MediaControlIntent media control categories}
- * in the discovery request's {@link MediaRouteSelector selector} to determine what
- * kinds of routes it should try to discover and whether it should perform active
- * or passive scans. In many cases, the provider may be able to save power by
- * determining that the selector does not contain any categories that it supports
- * and it can therefore avoid performing any scans at all.
- * </p>
- *
- * @param request The new discovery request, or null if no discovery is needed at this time.
- *
- * @see MediaRouter#addCallback
- */
- public void onDiscoveryRequestChanged(@Nullable MediaRouteDiscoveryRequest request) {
- }
-
- /**
- * Gets the provider's descriptor.
- * <p>
- * The descriptor describes the state of the media route provider and
- * the routes that it publishes. Watch for changes to the descriptor
- * by registering a {@link Callback callback} with {@link #setCallback}.
- * </p>
- *
- * @return The media route provider descriptor, or null if none.
- *
- * @see Callback#onDescriptorChanged
- */
- @Nullable
- public final MediaRouteProviderDescriptor getDescriptor() {
- return mDescriptor;
- }
-
- /**
- * Sets the provider's descriptor.
- * <p>
- * The provider must call this method to notify the currently registered
- * {@link Callback callback} about the change to the provider's descriptor.
- * </p>
- *
- * @param descriptor The updated route provider descriptor, or null if none.
- *
- * @see Callback#onDescriptorChanged
- */
- public final void setDescriptor(@Nullable MediaRouteProviderDescriptor descriptor) {
- MediaRouter.checkCallingThread();
-
- if (mDescriptor != descriptor) {
- mDescriptor = descriptor;
- if (!mPendingDescriptorChange) {
- mPendingDescriptorChange = true;
- mHandler.sendEmptyMessage(MSG_DELIVER_DESCRIPTOR_CHANGED);
- }
- }
- }
-
- void deliverDescriptorChanged() {
- mPendingDescriptorChange = false;
-
- if (mCallback != null) {
- mCallback.onDescriptorChanged(this, mDescriptor);
- }
- }
-
- /**
- * Called by the media router to obtain a route controller for a particular route.
- * <p>
- * The media router will invoke the {@link RouteController#onRelease} method of the route
- * controller when it is no longer needed to allow it to free its resources.
- * </p>
- *
- * @param routeId The unique id of the route.
- * @return The route controller. Returns null if there is no such route or if the route
- * cannot be controlled using the route controller interface.
- */
- @Nullable
- public RouteController onCreateRouteController(@NonNull String routeId) {
- if (routeId == null) {
- throw new IllegalArgumentException("routeId cannot be null");
- }
- return null;
- }
-
- /**
- * Called by the media router to obtain a route controller for a particular route which is a
- * member of {@link MediaRouter.RouteGroup}.
- * <p>
- * The media router will invoke the {@link RouteController#onRelease} method of the route
- * controller when it is no longer needed to allow it to free its resources.
- * </p>
- *
- * @param routeId The unique id of the member route.
- * @param routeGroupId The unique id of the route group.
- * @return The route controller. Returns null if there is no such route or if the route
- * cannot be controlled using the route controller interface.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- @Nullable
- public RouteController onCreateRouteController(@NonNull String routeId,
- @NonNull String routeGroupId) {
- if (routeId == null) {
- throw new IllegalArgumentException("routeId cannot be null");
- }
- if (routeGroupId == null) {
- throw new IllegalArgumentException("routeGroupId cannot be null");
- }
- return onCreateRouteController(routeId);
- }
-
- /**
- * Describes properties of the route provider's implementation.
- * <p>
- * This object is immutable once created.
- * </p>
- */
- public static final class ProviderMetadata {
- private final ComponentName mComponentName;
-
- ProviderMetadata(ComponentName componentName) {
- if (componentName == null) {
- throw new IllegalArgumentException("componentName must not be null");
- }
- mComponentName = componentName;
- }
-
- /**
- * Gets the provider's package name.
- */
- public String getPackageName() {
- return mComponentName.getPackageName();
- }
-
- /**
- * Gets the provider's component name.
- */
- public ComponentName getComponentName() {
- return mComponentName;
- }
-
- @Override
- public String toString() {
- return "ProviderMetadata{ componentName="
- + mComponentName.flattenToShortString() + " }";
- }
- }
-
- /**
- * Provides control over a particular route.
- * <p>
- * The media router obtains a route controller for a route whenever it needs
- * to control a route. When a route is selected, the media router invokes
- * the {@link #onSelect} method of its route controller. While selected,
- * the media router may call other methods of the route controller to
- * request that it perform certain actions to the route. When a route is
- * unselected, the media router invokes the {@link #onUnselect} method of its
- * route controller. When the media route no longer needs the route controller
- * it will invoke the {@link #onRelease} method to allow the route controller
- * to free its resources.
- * </p><p>
- * There may be multiple route controllers simultaneously active for the
- * same route. Each route controller will be released separately.
- * </p><p>
- * All operations on the route controller are asynchronous and
- * results are communicated via callbacks.
- * </p>
- */
- public static abstract class RouteController {
- /**
- * Releases the route controller, allowing it to free its resources.
- */
- public void onRelease() {
- }
-
- /**
- * Selects the route.
- */
- public void onSelect() {
- }
-
- /**
- * Unselects the route.
- */
- public void onUnselect() {
- }
-
- /**
- * Unselects the route and provides a reason. The default implementation
- * calls {@link #onUnselect()}.
- * <p>
- * The reason provided will be one of the following:
- * <ul>
- * <li>{@link MediaRouter#UNSELECT_REASON_UNKNOWN}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_DISCONNECTED}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_STOPPED}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_ROUTE_CHANGED}</li>
- * </ul>
- *
- * @param reason The reason for unselecting the route.
- */
- public void onUnselect(int reason) {
- onUnselect();
- }
-
- /**
- * Requests to set the volume of the route.
- *
- * @param volume The new volume value between 0 and {@link MediaRouteDescriptor#getVolumeMax}.
- */
- public void onSetVolume(int volume) {
- }
-
- /**
- * Requests an incremental volume update for the route.
- *
- * @param delta The delta to add to the current volume.
- */
- public void onUpdateVolume(int delta) {
- }
-
- /**
- * Performs a {@link MediaControlIntent media control} request
- * asynchronously on behalf of the route.
- *
- * @param intent A {@link MediaControlIntent media control intent}.
- * @param callback A {@link ControlRequestCallback} to invoke with the result
- * of the request, or null if no result is required.
- * @return True if the controller intends to handle the request and will
- * invoke the callback when finished. False if the controller will not
- * handle the request and will not invoke the callback.
- *
- * @see MediaControlIntent
- */
- public boolean onControlRequest(Intent intent, @Nullable ControlRequestCallback callback) {
- return false;
- }
- }
-
- /**
- * Callback which is invoked when route information becomes available or changes.
- */
- public static abstract class Callback {
- /**
- * Called when information about a route provider and its routes changes.
- *
- * @param provider The media route provider that changed, never null.
- * @param descriptor The new media route provider descriptor, or null if none.
- */
- public void onDescriptorChanged(@NonNull MediaRouteProvider provider,
- @Nullable MediaRouteProviderDescriptor descriptor) {
- }
- }
-
- private final class ProviderHandler extends Handler {
- ProviderHandler() {
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_DELIVER_DESCRIPTOR_CHANGED:
- deliverDescriptorChanged();
- break;
- case MSG_DELIVER_DISCOVERY_REQUEST_CHANGED:
- deliverDiscoveryRequestChanged();
- break;
- }
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderDescriptor.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderDescriptor.java
deleted file mode 100644
index eb1ce09..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderDescriptor.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.support.mediarouter.media;
-
-import android.os.Bundle;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Describes the state of a media route provider and the routes that it publishes.
- * <p>
- * This object is immutable once created using a {@link Builder} instance.
- * </p>
- */
-public final class MediaRouteProviderDescriptor {
- private static final String KEY_ROUTES = "routes";
-
- private final Bundle mBundle;
- private List<MediaRouteDescriptor> mRoutes;
-
- private MediaRouteProviderDescriptor(Bundle bundle, List<MediaRouteDescriptor> routes) {
- mBundle = bundle;
- mRoutes = routes;
- }
-
- /**
- * Gets the list of all routes that this provider has published.
- */
- public List<MediaRouteDescriptor> getRoutes() {
- ensureRoutes();
- return mRoutes;
- }
-
- private void ensureRoutes() {
- if (mRoutes == null) {
- ArrayList<Bundle> routeBundles = mBundle.<Bundle>getParcelableArrayList(KEY_ROUTES);
- if (routeBundles == null || routeBundles.isEmpty()) {
- mRoutes = Collections.<MediaRouteDescriptor>emptyList();
- } else {
- final int count = routeBundles.size();
- mRoutes = new ArrayList<MediaRouteDescriptor>(count);
- for (int i = 0; i < count; i++) {
- mRoutes.add(MediaRouteDescriptor.fromBundle(routeBundles.get(i)));
- }
- }
- }
- }
-
- /**
- * Returns true if the route provider descriptor and all of the routes that
- * it contains have all of the required fields.
- * <p>
- * This verification is deep. If the provider descriptor is known to be
- * valid then it is not necessary to call {@link #isValid} on each of its routes.
- * </p>
- */
- public boolean isValid() {
- ensureRoutes();
- final int routeCount = mRoutes.size();
- for (int i = 0; i < routeCount; i++) {
- MediaRouteDescriptor route = mRoutes.get(i);
- if (route == null || !route.isValid()) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append("MediaRouteProviderDescriptor{ ");
- result.append("routes=").append(
- Arrays.toString(getRoutes().toArray()));
- result.append(", isValid=").append(isValid());
- result.append(" }");
- return result.toString();
- }
-
- /**
- * Converts this object to a bundle for serialization.
- *
- * @return The contents of the object represented as a bundle.
- */
- public Bundle asBundle() {
- return mBundle;
- }
-
- /**
- * Creates an instance from a bundle.
- *
- * @param bundle The bundle, or null if none.
- * @return The new instance, or null if the bundle was null.
- */
- public static MediaRouteProviderDescriptor fromBundle(Bundle bundle) {
- return bundle != null ? new MediaRouteProviderDescriptor(bundle, null) : null;
- }
-
- /**
- * Builder for {@link MediaRouteProviderDescriptor media route provider descriptors}.
- */
- public static final class Builder {
- private final Bundle mBundle;
- private ArrayList<MediaRouteDescriptor> mRoutes;
-
- /**
- * Creates an empty media route provider descriptor builder.
- */
- public Builder() {
- mBundle = new Bundle();
- }
-
- /**
- * Creates a media route provider descriptor builder whose initial contents are
- * copied from an existing descriptor.
- */
- public Builder(MediaRouteProviderDescriptor descriptor) {
- if (descriptor == null) {
- throw new IllegalArgumentException("descriptor must not be null");
- }
-
- mBundle = new Bundle(descriptor.mBundle);
-
- descriptor.ensureRoutes();
- if (!descriptor.mRoutes.isEmpty()) {
- mRoutes = new ArrayList<MediaRouteDescriptor>(descriptor.mRoutes);
- }
- }
-
- /**
- * Adds a route.
- */
- public Builder addRoute(MediaRouteDescriptor route) {
- if (route == null) {
- throw new IllegalArgumentException("route must not be null");
- }
-
- if (mRoutes == null) {
- mRoutes = new ArrayList<MediaRouteDescriptor>();
- } else if (mRoutes.contains(route)) {
- throw new IllegalArgumentException("route descriptor already added");
- }
- mRoutes.add(route);
- return this;
- }
-
- /**
- * Adds a list of routes.
- */
- public Builder addRoutes(Collection<MediaRouteDescriptor> routes) {
- if (routes == null) {
- throw new IllegalArgumentException("routes must not be null");
- }
-
- if (!routes.isEmpty()) {
- for (MediaRouteDescriptor route : routes) {
- addRoute(route);
- }
- }
- return this;
- }
-
- /**
- * Sets the list of routes.
- */
- Builder setRoutes(Collection<MediaRouteDescriptor> routes) {
- if (routes == null || routes.isEmpty()) {
- mRoutes = null;
- mBundle.remove(KEY_ROUTES);
- } else {
- mRoutes = new ArrayList<>(routes);
- }
- return this;
- }
-
- /**
- * Builds the {@link MediaRouteProviderDescriptor media route provider descriptor}.
- */
- public MediaRouteProviderDescriptor build() {
- if (mRoutes != null) {
- final int count = mRoutes.size();
- ArrayList<Bundle> routeBundles = new ArrayList<Bundle>(count);
- for (int i = 0; i < count; i++) {
- routeBundles.add(mRoutes.get(i).asBundle());
- }
- mBundle.putParcelableArrayList(KEY_ROUTES, routeBundles);
- }
- return new MediaRouteProviderDescriptor(mBundle, mRoutes);
- }
- }
-}
\ No newline at end of file
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderProtocol.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderProtocol.java
deleted file mode 100644
index 6be9343..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderProtocol.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.content.Intent;
-import android.os.Messenger;
-
-/**
- * Defines the communication protocol for media route provider services.
- */
-abstract class MediaRouteProviderProtocol {
- /**
- * The {@link Intent} that must be declared as handled by the service.
- * Put this in your manifest.
- */
- public static final String SERVICE_INTERFACE =
- "android.media.MediaRouteProviderService";
-
- /*
- * Messages sent from the client to the service.
- * DO NOT RENUMBER THESE!
- */
-
- /** (client v1)
- * Register client.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : client version
- */
- public static final int CLIENT_MSG_REGISTER = 1;
-
- /** (client v1)
- * Unregister client.
- * - replyTo : client messenger
- * - arg1 : request id
- */
- public static final int CLIENT_MSG_UNREGISTER = 2;
-
- /** (client v1)
- * Create route controller.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- * - CLIENT_DATA_ROUTE_ID : route id string
- */
- public static final int CLIENT_MSG_CREATE_ROUTE_CONTROLLER = 3;
-
- /** (client v1)
- * Release route controller.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- */
- public static final int CLIENT_MSG_RELEASE_ROUTE_CONTROLLER = 4;
-
- /** (client v1)
- * Select route.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- */
- public static final int CLIENT_MSG_SELECT_ROUTE = 5;
-
- /** (client v1)
- * Unselect route.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- */
- public static final int CLIENT_MSG_UNSELECT_ROUTE = 6;
-
- /** (client v1)
- * Set route volume.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- * - CLIENT_DATA_VOLUME : volume integer
- */
- public static final int CLIENT_MSG_SET_ROUTE_VOLUME = 7;
-
- /** (client v1)
- * Update route volume.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- * - CLIENT_DATA_VOLUME : volume delta integer
- */
- public static final int CLIENT_MSG_UPDATE_ROUTE_VOLUME = 8;
-
- /** (client v1)
- * Route control request.
- * - replyTo : client messenger
- * - arg1 : request id
- * - arg2 : route controller id
- * - obj : media control intent
- */
- public static final int CLIENT_MSG_ROUTE_CONTROL_REQUEST = 9;
-
- /** (client v1)
- * Sets the discovery request.
- * - replyTo : client messenger
- * - arg1 : request id
- * - obj : discovery request bundle, or null if none
- */
- public static final int CLIENT_MSG_SET_DISCOVERY_REQUEST = 10;
-
- public static final String CLIENT_DATA_ROUTE_ID = "routeId";
- public static final String CLIENT_DATA_ROUTE_LIBRARY_GROUP = "routeGroupId";
- public static final String CLIENT_DATA_VOLUME = "volume";
- public static final String CLIENT_DATA_UNSELECT_REASON = "unselectReason";
-
- /*
- * Messages sent from the service to the client.
- * DO NOT RENUMBER THESE!
- */
-
- /** (service v1)
- * Generic failure sent in response to any unrecognized or malformed request.
- * - arg1 : request id
- */
- public static final int SERVICE_MSG_GENERIC_FAILURE = 0;
-
- /** (service v1)
- * Generic failure sent in response to a successful message.
- * - arg1 : request id
- */
- public static final int SERVICE_MSG_GENERIC_SUCCESS = 1;
-
- /** (service v1)
- * Registration succeeded.
- * - arg1 : request id
- * - arg2 : server version
- * - obj : route provider descriptor bundle, or null
- */
- public static final int SERVICE_MSG_REGISTERED = 2;
-
- /** (service v1)
- * Route control request success result.
- * - arg1 : request id
- * - obj : result data bundle, or null
- */
- public static final int SERVICE_MSG_CONTROL_REQUEST_SUCCEEDED = 3;
-
- /** (service v1)
- * Route control request failure result.
- * - arg1 : request id
- * - obj : result data bundle, or null
- * - SERVICE_DATA_ERROR: error message
- */
- public static final int SERVICE_MSG_CONTROL_REQUEST_FAILED = 4;
-
- /** (service v1)
- * Route provider descriptor changed. (unsolicited event)
- * - arg1 : reserved (0)
- * - obj : route provider descriptor bundle, or null
- */
- public static final int SERVICE_MSG_DESCRIPTOR_CHANGED = 5;
-
- public static final String SERVICE_DATA_ERROR = "error";
-
- /*
- * Recognized client version numbers. (Reserved for future use.)
- * DO NOT RENUMBER THESE!
- */
-
- /**
- * The client version used from the beginning.
- */
- public static final int CLIENT_VERSION_1 = 1;
-
- /**
- * The client version used from support library v24.1.0.
- */
- public static final int CLIENT_VERSION_2 = 2;
-
- /**
- * The current client version.
- */
- public static final int CLIENT_VERSION_CURRENT = CLIENT_VERSION_2;
-
- /*
- * Recognized server version numbers. (Reserved for future use.)
- * DO NOT RENUMBER THESE!
- */
-
- /**
- * The service version used from the beginning.
- */
- public static final int SERVICE_VERSION_1 = 1;
-
- /**
- * The current service version.
- */
- public static final int SERVICE_VERSION_CURRENT = SERVICE_VERSION_1;
-
- static final int CLIENT_VERSION_START = CLIENT_VERSION_1;
-
- /**
- * Returns true if the messenger object is valid.
- * <p>
- * The messenger constructor and unparceling code does not check whether the
- * provided IBinder is a valid IMessenger object. As a result, it's possible
- * for a peer to send an invalid IBinder that will result in crashes downstream.
- * This method checks that the messenger is in a valid state.
- * </p>
- */
- public static boolean isValidRemoteMessenger(Messenger messenger) {
- try {
- return messenger != null && messenger.getBinder() != null;
- } catch (NullPointerException ex) {
- // If the messenger was constructed with a binder interface other than
- // IMessenger then the call to getBinder() will crash with an NPE.
- return false;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderService.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderService.java
deleted file mode 100644
index a186fee..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteProviderService.java
+++ /dev/null
@@ -1,765 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_DATA_ROUTE_ID;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_DATA_ROUTE_LIBRARY_GROUP;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_DATA_UNSELECT_REASON;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_DATA_VOLUME;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_CREATE_ROUTE_CONTROLLER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_MSG_REGISTER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_RELEASE_ROUTE_CONTROLLER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_ROUTE_CONTROL_REQUEST;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_SELECT_ROUTE;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_SET_DISCOVERY_REQUEST;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_SET_ROUTE_VOLUME;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_UNREGISTER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_UNSELECT_ROUTE;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_UPDATE_ROUTE_VOLUME;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_VERSION_1;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.SERVICE_DATA_ERROR;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_CONTROL_REQUEST_FAILED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_CONTROL_REQUEST_SUCCEEDED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_DESCRIPTOR_CHANGED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_GENERIC_FAILURE;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_GENERIC_SUCCESS;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_REGISTERED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_VERSION_CURRENT;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .isValidRemoteMessenger;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.DeadObjectException;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.IBinder.DeathRecipient;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.RemoteException;
-import android.util.Log;
-import android.util.SparseArray;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.core.util.ObjectsCompat;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-
-/**
- * Base class for media route provider services.
- * <p>
- * A media router will bind to media route provider services when a callback is added via
- * {@link MediaRouter#addCallback(MediaRouteSelector, MediaRouter.Callback, int)} with a discovery
- * flag: {@link MediaRouter#CALLBACK_FLAG_REQUEST_DISCOVERY},
- * {@link MediaRouter#CALLBACK_FLAG_FORCE_DISCOVERY}, or
- * {@link MediaRouter#CALLBACK_FLAG_PERFORM_ACTIVE_SCAN}, and will unbind when the callback
- * is removed via {@link MediaRouter#removeCallback(MediaRouter.Callback)}.
- * </p><p>
- * To implement your own media route provider service, extend this class and
- * override the {@link #onCreateMediaRouteProvider} method to return an
- * instance of your {@link MediaRouteProvider}.
- * </p><p>
- * Declare your media route provider service in your application manifest
- * like this:
- * </p>
- * <pre>
- * <service android:name=".MyMediaRouteProviderService"
- * android:label="@string/my_media_route_provider_service">
- * <intent-filter>
- * <action android:name="android.media.MediaRouteProviderService" />
- * </intent-filter>
- * </service>
- * </pre>
- */
-public abstract class MediaRouteProviderService extends Service {
- static final String TAG = "MediaRouteProviderSrv"; // max. 23 chars
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- private final ArrayList<ClientRecord> mClients = new ArrayList<ClientRecord>();
- private final ReceiveHandler mReceiveHandler;
- private final Messenger mReceiveMessenger;
- final PrivateHandler mPrivateHandler;
- private final ProviderCallback mProviderCallback;
-
- MediaRouteProvider mProvider;
- private MediaRouteDiscoveryRequest mCompositeDiscoveryRequest;
-
- /**
- * The {@link Intent} that must be declared as handled by the service.
- * Put this in your manifest.
- */
- public static final String SERVICE_INTERFACE = MediaRouteProviderProtocol.SERVICE_INTERFACE;
-
- /*
- * Private messages used internally. (Yes, you can renumber these.)
- */
-
- static final int PRIVATE_MSG_CLIENT_DIED = 1;
-
- /**
- * Creates a media route provider service.
- */
- public MediaRouteProviderService() {
- mReceiveHandler = new ReceiveHandler(this);
- mReceiveMessenger = new Messenger(mReceiveHandler);
- mPrivateHandler = new PrivateHandler();
- mProviderCallback = new ProviderCallback();
- }
-
- /**
- * Called by the system when it is time to create the media route provider.
- *
- * @return The media route provider offered by this service, or null if
- * this service has decided not to offer a media route provider.
- */
- public abstract MediaRouteProvider onCreateMediaRouteProvider();
-
- /**
- * Gets the media route provider offered by this service.
- *
- * @return The media route provider offered by this service, or null if
- * it has not yet been created.
- *
- * @see #onCreateMediaRouteProvider()
- */
- public MediaRouteProvider getMediaRouteProvider() {
- return mProvider;
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- if (intent.getAction().equals(SERVICE_INTERFACE)) {
- if (mProvider == null) {
- MediaRouteProvider provider = onCreateMediaRouteProvider();
- if (provider != null) {
- String providerPackage = provider.getMetadata().getPackageName();
- if (!providerPackage.equals(getPackageName())) {
- throw new IllegalStateException("onCreateMediaRouteProvider() returned "
- + "a provider whose package name does not match the package "
- + "name of the service. A media route provider service can "
- + "only export its own media route providers. "
- + "Provider package name: " + providerPackage
- + ". Service package name: " + getPackageName() + ".");
- }
- mProvider = provider;
- mProvider.setCallback(mProviderCallback);
- }
- }
- if (mProvider != null) {
- return mReceiveMessenger.getBinder();
- }
- }
- return null;
- }
-
- @Override
- public boolean onUnbind(Intent intent) {
- if (mProvider != null) {
- mProvider.setCallback(null);
- }
- return super.onUnbind(intent);
- }
-
- boolean onRegisterClient(Messenger messenger, int requestId, int version) {
- if (version >= CLIENT_VERSION_1) {
- int index = findClient(messenger);
- if (index < 0) {
- ClientRecord client = new ClientRecord(messenger, version);
- if (client.register()) {
- mClients.add(client);
- if (DEBUG) {
- Log.d(TAG, client + ": Registered, version=" + version);
- }
- if (requestId != 0) {
- MediaRouteProviderDescriptor descriptor = mProvider.getDescriptor();
- sendReply(messenger, SERVICE_MSG_REGISTERED,
- requestId, SERVICE_VERSION_CURRENT,
- createDescriptorBundleForClientVersion(descriptor,
- client.mVersion), null);
- }
- return true;
- }
- }
- }
- return false;
- }
-
- boolean onUnregisterClient(Messenger messenger, int requestId) {
- int index = findClient(messenger);
- if (index >= 0) {
- ClientRecord client = mClients.remove(index);
- if (DEBUG) {
- Log.d(TAG, client + ": Unregistered");
- }
- client.dispose();
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- return false;
- }
-
- void onBinderDied(Messenger messenger) {
- int index = findClient(messenger);
- if (index >= 0) {
- ClientRecord client = mClients.remove(index);
- if (DEBUG) {
- Log.d(TAG, client + ": Binder died");
- }
- client.dispose();
- }
- }
-
- boolean onCreateRouteController(Messenger messenger, int requestId,
- int controllerId, String routeId, String routeGroupId) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- if (client.createRouteController(routeId, routeGroupId, controllerId)) {
- if (DEBUG) {
- Log.d(TAG, client + ": Route controller created, controllerId=" + controllerId
- + ", routeId=" + routeId + ", routeGroupId=" + routeGroupId);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- }
- return false;
- }
-
- boolean onReleaseRouteController(Messenger messenger, int requestId,
- int controllerId) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- if (client.releaseRouteController(controllerId)) {
- if (DEBUG) {
- Log.d(TAG, client + ": Route controller released"
- + ", controllerId=" + controllerId);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- }
- return false;
- }
-
- boolean onSelectRoute(Messenger messenger, int requestId,
- int controllerId) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- MediaRouteProvider.RouteController controller =
- client.getRouteController(controllerId);
- if (controller != null) {
- controller.onSelect();
- if (DEBUG) {
- Log.d(TAG, client + ": Route selected"
- + ", controllerId=" + controllerId);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- }
- return false;
- }
-
- boolean onUnselectRoute(Messenger messenger, int requestId,
- int controllerId, int reason) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- MediaRouteProvider.RouteController controller =
- client.getRouteController(controllerId);
- if (controller != null) {
- controller.onUnselect(reason);
- if (DEBUG) {
- Log.d(TAG, client + ": Route unselected"
- + ", controllerId=" + controllerId);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- }
- return false;
- }
-
- boolean onSetRouteVolume(Messenger messenger, int requestId,
- int controllerId, int volume) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- MediaRouteProvider.RouteController controller =
- client.getRouteController(controllerId);
- if (controller != null) {
- controller.onSetVolume(volume);
- if (DEBUG) {
- Log.d(TAG, client + ": Route volume changed"
- + ", controllerId=" + controllerId + ", volume=" + volume);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- }
- return false;
- }
-
- boolean onUpdateRouteVolume(Messenger messenger, int requestId,
- int controllerId, int delta) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- MediaRouteProvider.RouteController controller =
- client.getRouteController(controllerId);
- if (controller != null) {
- controller.onUpdateVolume(delta);
- if (DEBUG) {
- Log.d(TAG, client + ": Route volume updated"
- + ", controllerId=" + controllerId + ", delta=" + delta);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- }
- return false;
- }
-
- boolean onRouteControlRequest(final Messenger messenger, final int requestId,
- final int controllerId, final Intent intent) {
- final ClientRecord client = getClient(messenger);
- if (client != null) {
- MediaRouteProvider.RouteController controller =
- client.getRouteController(controllerId);
- if (controller != null) {
- MediaRouter.ControlRequestCallback callback = null;
- if (requestId != 0) {
- callback = new MediaRouter.ControlRequestCallback() {
- @Override
- public void onResult(Bundle data) {
- if (DEBUG) {
- Log.d(TAG, client + ": Route control request succeeded"
- + ", controllerId=" + controllerId
- + ", intent=" + intent
- + ", data=" + data);
- }
- if (findClient(messenger) >= 0) {
- sendReply(messenger, SERVICE_MSG_CONTROL_REQUEST_SUCCEEDED,
- requestId, 0, data, null);
- }
- }
-
- @Override
- public void onError(String error, Bundle data) {
- if (DEBUG) {
- Log.d(TAG, client + ": Route control request failed"
- + ", controllerId=" + controllerId
- + ", intent=" + intent
- + ", error=" + error + ", data=" + data);
- }
- if (findClient(messenger) >= 0) {
- if (error != null) {
- Bundle bundle = new Bundle();
- bundle.putString(SERVICE_DATA_ERROR, error);
- sendReply(messenger, SERVICE_MSG_CONTROL_REQUEST_FAILED,
- requestId, 0, data, bundle);
- } else {
- sendReply(messenger, SERVICE_MSG_CONTROL_REQUEST_FAILED,
- requestId, 0, data, null);
- }
- }
- }
- };
- }
- if (controller.onControlRequest(intent, callback)) {
- if (DEBUG) {
- Log.d(TAG, client + ": Route control request delivered"
- + ", controllerId=" + controllerId + ", intent=" + intent);
- }
- return true;
- }
- }
- }
- return false;
- }
-
- boolean onSetDiscoveryRequest(Messenger messenger, int requestId,
- MediaRouteDiscoveryRequest request) {
- ClientRecord client = getClient(messenger);
- if (client != null) {
- boolean actuallyChanged = client.setDiscoveryRequest(request);
- if (DEBUG) {
- Log.d(TAG, client + ": Set discovery request, request=" + request
- + ", actuallyChanged=" + actuallyChanged
- + ", compositeDiscoveryRequest=" + mCompositeDiscoveryRequest);
- }
- sendGenericSuccess(messenger, requestId);
- return true;
- }
- return false;
- }
-
- void sendDescriptorChanged(MediaRouteProviderDescriptor descriptor) {
- final int count = mClients.size();
- for (int i = 0; i < count; i++) {
- ClientRecord client = mClients.get(i);
- sendReply(client.mMessenger, SERVICE_MSG_DESCRIPTOR_CHANGED, 0, 0,
- createDescriptorBundleForClientVersion(descriptor, client.mVersion), null);
- if (DEBUG) {
- Log.d(TAG, client + ": Sent descriptor change event, descriptor=" + descriptor);
- }
- }
- }
-
- @VisibleForTesting
- static Bundle createDescriptorBundleForClientVersion(MediaRouteProviderDescriptor descriptor,
- int clientVersion) {
- if (descriptor == null) {
- return null;
- }
- MediaRouteProviderDescriptor.Builder builder =
- new MediaRouteProviderDescriptor.Builder(descriptor);
- builder.setRoutes(null);
- for (MediaRouteDescriptor route : descriptor.getRoutes()) {
- if (clientVersion >= route.getMinClientVersion()
- && clientVersion <= route.getMaxClientVersion()) {
- builder.addRoute(route);
- }
- }
- return builder.build().asBundle();
- }
-
- boolean updateCompositeDiscoveryRequest() {
- MediaRouteDiscoveryRequest composite = null;
- MediaRouteSelector.Builder selectorBuilder = null;
- boolean activeScan = false;
- final int count = mClients.size();
- for (int i = 0; i < count; i++) {
- MediaRouteDiscoveryRequest request = mClients.get(i).mDiscoveryRequest;
- if (request != null
- && (!request.getSelector().isEmpty() || request.isActiveScan())) {
- activeScan |= request.isActiveScan();
- if (composite == null) {
- composite = request;
- } else {
- if (selectorBuilder == null) {
- selectorBuilder = new MediaRouteSelector.Builder(composite.getSelector());
- }
- selectorBuilder.addSelector(request.getSelector());
- }
- }
- }
- if (selectorBuilder != null) {
- composite = new MediaRouteDiscoveryRequest(selectorBuilder.build(), activeScan);
- }
- if (!ObjectsCompat.equals(mCompositeDiscoveryRequest, composite)) {
- mCompositeDiscoveryRequest = composite;
- mProvider.setDiscoveryRequest(composite);
- return true;
- }
- return false;
- }
-
- private ClientRecord getClient(Messenger messenger) {
- int index = findClient(messenger);
- return index >= 0 ? mClients.get(index) : null;
- }
-
- int findClient(Messenger messenger) {
- final int count = mClients.size();
- for (int i = 0; i < count; i++) {
- ClientRecord client = mClients.get(i);
- if (client.hasMessenger(messenger)) {
- return i;
- }
- }
- return -1;
- }
-
- static void sendGenericFailure(Messenger messenger, int requestId) {
- if (requestId != 0) {
- sendReply(messenger, SERVICE_MSG_GENERIC_FAILURE, requestId, 0, null, null);
- }
- }
-
- private static void sendGenericSuccess(Messenger messenger, int requestId) {
- if (requestId != 0) {
- sendReply(messenger, SERVICE_MSG_GENERIC_SUCCESS, requestId, 0, null, null);
- }
- }
-
- static void sendReply(Messenger messenger, int what,
- int requestId, int arg, Object obj, Bundle data) {
- Message msg = Message.obtain();
- msg.what = what;
- msg.arg1 = requestId;
- msg.arg2 = arg;
- msg.obj = obj;
- msg.setData(data);
- try {
- messenger.send(msg);
- } catch (DeadObjectException ex) {
- // The client died.
- } catch (RemoteException ex) {
- Log.e(TAG, "Could not send message to " + getClientId(messenger), ex);
- }
- }
-
- static String getClientId(Messenger messenger) {
- return "Client connection " + messenger.getBinder().toString();
- }
-
- private final class PrivateHandler extends Handler {
- PrivateHandler() {
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case PRIVATE_MSG_CLIENT_DIED:
- onBinderDied((Messenger)msg.obj);
- break;
- }
- }
- }
-
- private final class ProviderCallback extends MediaRouteProvider.Callback {
- ProviderCallback() {
- }
-
- @Override
- public void onDescriptorChanged(MediaRouteProvider provider,
- MediaRouteProviderDescriptor descriptor) {
- sendDescriptorChanged(descriptor);
- }
- }
-
- private final class ClientRecord implements DeathRecipient {
- public final Messenger mMessenger;
- public final int mVersion;
- public MediaRouteDiscoveryRequest mDiscoveryRequest;
-
- private final SparseArray<MediaRouteProvider.RouteController> mControllers =
- new SparseArray<MediaRouteProvider.RouteController>();
-
- public ClientRecord(Messenger messenger, int version) {
- mMessenger = messenger;
- mVersion = version;
- }
-
- public boolean register() {
- try {
- mMessenger.getBinder().linkToDeath(this, 0);
- return true;
- } catch (RemoteException ex) {
- binderDied();
- }
- return false;
- }
-
- public void dispose() {
- int count = mControllers.size();
- for (int i = 0; i < count; i++) {
- mControllers.valueAt(i).onRelease();
- }
- mControllers.clear();
-
- mMessenger.getBinder().unlinkToDeath(this, 0);
-
- setDiscoveryRequest(null);
- }
-
- public boolean hasMessenger(Messenger other) {
- return mMessenger.getBinder() == other.getBinder();
- }
-
- public boolean createRouteController(String routeId, String routeGroupId,
- int controllerId) {
- if (mControllers.indexOfKey(controllerId) < 0) {
- MediaRouteProvider.RouteController controller = routeGroupId == null
- ? mProvider.onCreateRouteController(routeId)
- : mProvider.onCreateRouteController(routeId, routeGroupId);
- if (controller != null) {
- mControllers.put(controllerId, controller);
- return true;
- }
- }
- return false;
- }
-
- public boolean releaseRouteController(int controllerId) {
- MediaRouteProvider.RouteController controller = mControllers.get(controllerId);
- if (controller != null) {
- mControllers.remove(controllerId);
- controller.onRelease();
- return true;
- }
- return false;
- }
-
- public MediaRouteProvider.RouteController getRouteController(int controllerId) {
- return mControllers.get(controllerId);
- }
-
- public boolean setDiscoveryRequest(MediaRouteDiscoveryRequest request) {
- if (!ObjectsCompat.equals(mDiscoveryRequest, request)) {
- mDiscoveryRequest = request;
- return updateCompositeDiscoveryRequest();
- }
- return false;
- }
-
- // Runs on a binder thread.
- @Override
- public void binderDied() {
- mPrivateHandler.obtainMessage(PRIVATE_MSG_CLIENT_DIED, mMessenger).sendToTarget();
- }
-
- @Override
- public String toString() {
- return getClientId(mMessenger);
- }
- }
-
- /**
- * Handler that receives messages from clients.
- * <p>
- * This inner class is static and only retains a weak reference to the service
- * to prevent the service from being leaked in case one of the clients is holding an
- * active reference to the server's messenger.
- * </p><p>
- * This handler should not be used to handle any messages other than those
- * that come from the client.
- * </p>
- */
- private static final class ReceiveHandler extends Handler {
- private final WeakReference<MediaRouteProviderService> mServiceRef;
-
- public ReceiveHandler(MediaRouteProviderService service) {
- mServiceRef = new WeakReference<MediaRouteProviderService>(service);
- }
-
- @Override
- public void handleMessage(Message msg) {
- final Messenger messenger = msg.replyTo;
- if (isValidRemoteMessenger(messenger)) {
- final int what = msg.what;
- final int requestId = msg.arg1;
- final int arg = msg.arg2;
- final Object obj = msg.obj;
- final Bundle data = msg.peekData();
- if (!processMessage(what, messenger, requestId, arg, obj, data)) {
- if (DEBUG) {
- Log.d(TAG, getClientId(messenger) + ": Message failed, what=" + what
- + ", requestId=" + requestId + ", arg=" + arg
- + ", obj=" + obj + ", data=" + data);
- }
- sendGenericFailure(messenger, requestId);
- }
- } else {
- if (DEBUG) {
- Log.d(TAG, "Ignoring message without valid reply messenger.");
- }
- }
- }
-
- private boolean processMessage(int what,
- Messenger messenger, int requestId, int arg, Object obj, Bundle data) {
- MediaRouteProviderService service = mServiceRef.get();
- if (service != null) {
- switch (what) {
- case CLIENT_MSG_REGISTER:
- return service.onRegisterClient(messenger, requestId, arg);
-
- case CLIENT_MSG_UNREGISTER:
- return service.onUnregisterClient(messenger, requestId);
-
- case CLIENT_MSG_CREATE_ROUTE_CONTROLLER: {
- String routeId = data.getString(CLIENT_DATA_ROUTE_ID);
- String routeGroupId = data.getString(CLIENT_DATA_ROUTE_LIBRARY_GROUP);
- if (routeId != null) {
- return service.onCreateRouteController(
- messenger, requestId, arg, routeId, routeGroupId);
- }
- break;
- }
-
- case CLIENT_MSG_RELEASE_ROUTE_CONTROLLER:
- return service.onReleaseRouteController(messenger, requestId, arg);
-
- case CLIENT_MSG_SELECT_ROUTE:
- return service.onSelectRoute(messenger, requestId, arg);
-
- case CLIENT_MSG_UNSELECT_ROUTE:
- int reason = data == null ?
- MediaRouter.UNSELECT_REASON_UNKNOWN
- : data.getInt(CLIENT_DATA_UNSELECT_REASON,
- MediaRouter.UNSELECT_REASON_UNKNOWN);
- return service.onUnselectRoute(messenger, requestId, arg, reason);
-
- case CLIENT_MSG_SET_ROUTE_VOLUME: {
- int volume = data.getInt(CLIENT_DATA_VOLUME, -1);
- if (volume >= 0) {
- return service.onSetRouteVolume(
- messenger, requestId, arg, volume);
- }
- break;
- }
-
- case CLIENT_MSG_UPDATE_ROUTE_VOLUME: {
- int delta = data.getInt(CLIENT_DATA_VOLUME, 0);
- if (delta != 0) {
- return service.onUpdateRouteVolume(
- messenger, requestId, arg, delta);
- }
- break;
- }
-
- case CLIENT_MSG_ROUTE_CONTROL_REQUEST:
- if (obj instanceof Intent) {
- return service.onRouteControlRequest(
- messenger, requestId, arg, (Intent)obj);
- }
- break;
-
- case CLIENT_MSG_SET_DISCOVERY_REQUEST: {
- if (obj == null || obj instanceof Bundle) {
- MediaRouteDiscoveryRequest request =
- MediaRouteDiscoveryRequest.fromBundle((Bundle)obj);
- return service.onSetDiscoveryRequest(
- messenger, requestId,
- request != null && request.isValid() ? request : null);
- }
- }
- }
- }
- return false;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteSelector.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteSelector.java
deleted file mode 100644
index f20dcc0..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouteSelector.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.support.mediarouter.media;
-
-import android.content.IntentFilter;
-import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Describes the capabilities of routes that applications would like to discover and use.
- * <p>
- * This object is immutable once created using a {@link Builder} instance.
- * </p>
- *
- * <h3>Example</h3>
- * <pre>
- * MediaRouteSelector selectorBuilder = new MediaRouteSelector.Builder()
- * .addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO)
- * .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
- * .build();
- *
- * MediaRouter router = MediaRouter.getInstance(context);
- * router.addCallback(selector, callback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
- * </pre>
- */
-public final class MediaRouteSelector {
- static final String KEY_CONTROL_CATEGORIES = "controlCategories";
-
- private final Bundle mBundle;
- List<String> mControlCategories;
-
- /**
- * An empty media route selector that will not match any routes.
- */
- public static final MediaRouteSelector EMPTY = new MediaRouteSelector(new Bundle(), null);
-
- MediaRouteSelector(Bundle bundle, List<String> controlCategories) {
- mBundle = bundle;
- mControlCategories = controlCategories;
- }
-
- /**
- * Gets the list of {@link MediaControlIntent media control categories} in the selector.
- *
- * @return The list of categories.
- */
- public List<String> getControlCategories() {
- ensureControlCategories();
- return mControlCategories;
- }
-
- void ensureControlCategories() {
- if (mControlCategories == null) {
- mControlCategories = mBundle.getStringArrayList(KEY_CONTROL_CATEGORIES);
- if (mControlCategories == null || mControlCategories.isEmpty()) {
- mControlCategories = Collections.<String>emptyList();
- }
- }
- }
-
- /**
- * Returns true if the selector contains the specified category.
- *
- * @param category The category to check.
- * @return True if the category is present.
- */
- public boolean hasControlCategory(String category) {
- if (category != null) {
- ensureControlCategories();
- final int categoryCount = mControlCategories.size();
- for (int i = 0; i < categoryCount; i++) {
- if (mControlCategories.get(i).equals(category)) {
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * Returns true if the selector matches at least one of the specified control filters.
- *
- * @param filters The list of control filters to consider.
- * @return True if a match is found.
- */
- public boolean matchesControlFilters(List<IntentFilter> filters) {
- if (filters != null) {
- ensureControlCategories();
- final int categoryCount = mControlCategories.size();
- if (categoryCount != 0) {
- final int filterCount = filters.size();
- for (int i = 0; i < filterCount; i++) {
- final IntentFilter filter = filters.get(i);
- if (filter != null) {
- for (int j = 0; j < categoryCount; j++) {
- if (filter.hasCategory(mControlCategories.get(j))) {
- return true;
- }
- }
- }
- }
- }
- }
- return false;
- }
-
- /**
- * Returns true if this selector contains all of the capabilities described
- * by the specified selector.
- *
- * @param selector The selector to be examined.
- * @return True if this selector contains all of the capabilities described
- * by the specified selector.
- */
- public boolean contains(MediaRouteSelector selector) {
- if (selector != null) {
- ensureControlCategories();
- selector.ensureControlCategories();
- return mControlCategories.containsAll(selector.mControlCategories);
- }
- return false;
- }
-
- /**
- * Returns true if the selector does not specify any capabilities.
- */
- public boolean isEmpty() {
- ensureControlCategories();
- return mControlCategories.isEmpty();
- }
-
- /**
- * Returns true if the selector has all of the required fields.
- */
- public boolean isValid() {
- ensureControlCategories();
- if (mControlCategories.contains(null)) {
- return false;
- }
- return true;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof MediaRouteSelector) {
- MediaRouteSelector other = (MediaRouteSelector)o;
- ensureControlCategories();
- other.ensureControlCategories();
- return mControlCategories.equals(other.mControlCategories);
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- ensureControlCategories();
- return mControlCategories.hashCode();
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append("MediaRouteSelector{ ");
- result.append("controlCategories=").append(
- Arrays.toString(getControlCategories().toArray()));
- result.append(" }");
- return result.toString();
- }
-
- /**
- * Converts this object to a bundle for serialization.
- *
- * @return The contents of the object represented as a bundle.
- */
- public Bundle asBundle() {
- return mBundle;
- }
-
- /**
- * Creates an instance from a bundle.
- *
- * @param bundle The bundle, or null if none.
- * @return The new instance, or null if the bundle was null.
- */
- public static MediaRouteSelector fromBundle(@Nullable Bundle bundle) {
- return bundle != null ? new MediaRouteSelector(bundle, null) : null;
- }
-
- /**
- * Builder for {@link MediaRouteSelector media route selectors}.
- */
- public static final class Builder {
- private ArrayList<String> mControlCategories;
-
- /**
- * Creates an empty media route selector builder.
- */
- public Builder() {
- }
-
- /**
- * Creates a media route selector descriptor builder whose initial contents are
- * copied from an existing selector.
- */
- public Builder(@NonNull MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- selector.ensureControlCategories();
- if (!selector.mControlCategories.isEmpty()) {
- mControlCategories = new ArrayList<String>(selector.mControlCategories);
- }
- }
-
- /**
- * Adds a {@link MediaControlIntent media control category} to the builder.
- *
- * @param category The category to add to the set of desired capabilities, such as
- * {@link MediaControlIntent#CATEGORY_LIVE_AUDIO}.
- * @return The builder instance for chaining.
- */
- @NonNull
- public Builder addControlCategory(@NonNull String category) {
- if (category == null) {
- throw new IllegalArgumentException("category must not be null");
- }
-
- if (mControlCategories == null) {
- mControlCategories = new ArrayList<String>();
- }
- if (!mControlCategories.contains(category)) {
- mControlCategories.add(category);
- }
- return this;
- }
-
- /**
- * Adds a list of {@link MediaControlIntent media control categories} to the builder.
- *
- * @param categories The list categories to add to the set of desired capabilities,
- * such as {@link MediaControlIntent#CATEGORY_LIVE_AUDIO}.
- * @return The builder instance for chaining.
- */
- @NonNull
- public Builder addControlCategories(@NonNull Collection<String> categories) {
- if (categories == null) {
- throw new IllegalArgumentException("categories must not be null");
- }
-
- if (!categories.isEmpty()) {
- for (String category : categories) {
- addControlCategory(category);
- }
- }
- return this;
- }
-
- /**
- * Adds the contents of an existing media route selector to the builder.
- *
- * @param selector The media route selector whose contents are to be added.
- * @return The builder instance for chaining.
- */
- @NonNull
- public Builder addSelector(@NonNull MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
-
- addControlCategories(selector.getControlCategories());
- return this;
- }
-
- /**
- * Builds the {@link MediaRouteSelector media route selector}.
- */
- @NonNull
- public MediaRouteSelector build() {
- if (mControlCategories == null) {
- return EMPTY;
- }
- Bundle bundle = new Bundle();
- bundle.putStringArrayList(KEY_CONTROL_CATEGORIES, mControlCategories);
- return new MediaRouteSelector(bundle, mControlCategories);
- }
- }
-}
\ No newline at end of file
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouter.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouter.java
deleted file mode 100644
index 4b56b19..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaRouter.java
+++ /dev/null
@@ -1,3000 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.IntentSender;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Resources;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.support.v4.media.session.MediaSessionCompat;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.Display;
-
-import androidx.core.app.ActivityManagerCompat;
-import androidx.core.hardware.display.DisplayManagerCompat;
-import androidx.core.util.Pair;
-import androidx.media.VolumeProviderCompat;
-
-import com.android.support.mediarouter.media.MediaRouteProvider.ProviderMetadata;
-import com.android.support.mediarouter.media.MediaRouteProvider.RouteController;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * MediaRouter allows applications to control the routing of media channels
- * and streams from the current device to external speakers and destination devices.
- * <p>
- * A MediaRouter instance is retrieved through {@link #getInstance}. Applications
- * can query the media router about the currently selected route and its capabilities
- * to determine how to send content to the route's destination. Applications can
- * also {@link RouteInfo#sendControlRequest send control requests} to the route
- * to ask the route's destination to perform certain remote control functions
- * such as playing media.
- * </p><p>
- * See also {@link MediaRouteProvider} for information on how an application
- * can publish new media routes to the media router.
- * </p><p>
- * The media router API is not thread-safe; all interactions with it must be
- * done from the main thread of the process.
- * </p>
- */
-public final class MediaRouter {
- static final String TAG = "MediaRouter";
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- /**
- * Passed to {@link androidx.mediarouter.media.MediaRouteProvider.RouteController#onUnselect(int)}
- * and {@link Callback#onRouteUnselected(MediaRouter, RouteInfo, int)} when the reason the route
- * was unselected is unknown.
- */
- public static final int UNSELECT_REASON_UNKNOWN = 0;
- /**
- * Passed to {@link androidx.mediarouter.media.MediaRouteProvider.RouteController#onUnselect(int)}
- * and {@link Callback#onRouteUnselected(MediaRouter, RouteInfo, int)} when the user pressed
- * the disconnect button to disconnect and keep playing.
- * <p>
- *
- * @see MediaRouteDescriptor#canDisconnectAndKeepPlaying()
- */
- public static final int UNSELECT_REASON_DISCONNECTED = 1;
- /**
- * Passed to {@link androidx.mediarouter.media.MediaRouteProvider.RouteController#onUnselect(int)}
- * and {@link Callback#onRouteUnselected(MediaRouter, RouteInfo, int)} when the user pressed
- * the stop casting button.
- */
- public static final int UNSELECT_REASON_STOPPED = 2;
- /**
- * Passed to {@link androidx.mediarouter.media.MediaRouteProvider.RouteController#onUnselect(int)}
- * and {@link Callback#onRouteUnselected(MediaRouter, RouteInfo, int)} when the user selected
- * a different route.
- */
- public static final int UNSELECT_REASON_ROUTE_CHANGED = 3;
-
- // Maintains global media router state for the process.
- // This field is initialized in MediaRouter.getInstance() before any
- // MediaRouter objects are instantiated so it is guaranteed to be
- // valid whenever any instance method is invoked.
- static GlobalMediaRouter sGlobal;
-
- // Context-bound state of the media router.
- final Context mContext;
- final ArrayList<CallbackRecord> mCallbackRecords = new ArrayList<CallbackRecord>();
-
- @IntDef(flag = true,
- value = {
- CALLBACK_FLAG_PERFORM_ACTIVE_SCAN,
- CALLBACK_FLAG_REQUEST_DISCOVERY,
- CALLBACK_FLAG_UNFILTERED_EVENTS
- }
- )
- @Retention(RetentionPolicy.SOURCE)
- private @interface CallbackFlags {}
-
- /**
- * Flag for {@link #addCallback}: Actively scan for routes while this callback
- * is registered.
- * <p>
- * When this flag is specified, the media router will actively scan for new
- * routes. Certain routes, such as wifi display routes, may not be discoverable
- * except when actively scanning. This flag is typically used when the route picker
- * dialog has been opened by the user to ensure that the route information is
- * up to date.
- * </p><p>
- * Active scanning may consume a significant amount of power and may have intrusive
- * effects on wireless connectivity. Therefore it is important that active scanning
- * only be requested when it is actually needed to satisfy a user request to
- * discover and select a new route.
- * </p><p>
- * This flag implies {@link #CALLBACK_FLAG_REQUEST_DISCOVERY} but performing
- * active scans is much more expensive than a normal discovery request.
- * </p>
- *
- * @see #CALLBACK_FLAG_REQUEST_DISCOVERY
- */
- public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1 << 0;
-
- /**
- * Flag for {@link #addCallback}: Do not filter route events.
- * <p>
- * When this flag is specified, the callback will be invoked for events that affect any
- * route even if they do not match the callback's filter.
- * </p>
- */
- public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 1 << 1;
-
- /**
- * Flag for {@link #addCallback}: Request passive route discovery while this
- * callback is registered, except on {@link ActivityManager#isLowRamDevice low-RAM devices}.
- * <p>
- * When this flag is specified, the media router will try to discover routes.
- * Although route discovery is intended to be efficient, checking for new routes may
- * result in some network activity and could slowly drain the battery. Therefore
- * applications should only specify {@link #CALLBACK_FLAG_REQUEST_DISCOVERY} when
- * they are running in the foreground and would like to provide the user with the
- * option of connecting to new routes.
- * </p><p>
- * Applications should typically add a callback using this flag in the
- * {@link android.app.Activity activity's} {@link android.app.Activity#onStart onStart}
- * method and remove it in the {@link android.app.Activity#onStop onStop} method.
- * The {@link androidx.mediarouter.app.MediaRouteDiscoveryFragment} fragment may
- * also be used for this purpose.
- * </p><p class="note">
- * On {@link ActivityManager#isLowRamDevice low-RAM devices} this flag
- * will be ignored. Refer to
- * {@link #addCallback(MediaRouteSelector, Callback, int) addCallback} for details.
- * </p>
- *
- * @see androidx.mediarouter.app.MediaRouteDiscoveryFragment
- */
- public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 1 << 2;
-
- /**
- * Flag for {@link #addCallback}: Request passive route discovery while this
- * callback is registered, even on {@link ActivityManager#isLowRamDevice low-RAM devices}.
- * <p class="note">
- * This flag has a significant performance impact on low-RAM devices
- * since it may cause many media route providers to be started simultaneously.
- * It is much better to use {@link #CALLBACK_FLAG_REQUEST_DISCOVERY} instead to avoid
- * performing passive discovery on these devices altogether. Refer to
- * {@link #addCallback(MediaRouteSelector, Callback, int) addCallback} for details.
- * </p>
- *
- * @see androidx.mediarouter.app.MediaRouteDiscoveryFragment
- */
- public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 1 << 3;
-
- /**
- * Flag for {@link #isRouteAvailable}: Ignore the default route.
- * <p>
- * This flag is used to determine whether a matching non-default route is available.
- * This constraint may be used to decide whether to offer the route chooser dialog
- * to the user. There is no point offering the chooser if there are no
- * non-default choices.
- * </p>
- */
- public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1 << 0;
-
- /**
- * Flag for {@link #isRouteAvailable}: Require an actual route to be matched.
- * <p>
- * If this flag is not set, then {@link #isRouteAvailable} will return true
- * if it is possible to discover a matching route even if discovery is not in
- * progress or if no matching route has yet been found. This feature is used to
- * save resources by removing the need to perform passive route discovery on
- * {@link ActivityManager#isLowRamDevice low-RAM devices}.
- * </p><p>
- * If this flag is set, then {@link #isRouteAvailable} will only return true if
- * a matching route has actually been discovered.
- * </p>
- */
- public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 1 << 1;
-
- private MediaRouter(Context context) {
- mContext = context;
- }
-
- /**
- * Gets an instance of the media router service associated with the context.
- * <p>
- * The application is responsible for holding a strong reference to the returned
- * {@link MediaRouter} instance, such as by storing the instance in a field of
- * the {@link android.app.Activity}, to ensure that the media router remains alive
- * as long as the application is using its features.
- * </p><p>
- * In other words, the support library only holds a {@link WeakReference weak reference}
- * to each media router instance. When there are no remaining strong references to the
- * media router instance, all of its callbacks will be removed and route discovery
- * will no longer be performed on its behalf.
- * </p>
- *
- * @return The media router instance for the context. The application must hold
- * a strong reference to this object as long as it is in use.
- */
- public static MediaRouter getInstance(@NonNull Context context) {
- if (context == null) {
- throw new IllegalArgumentException("context must not be null");
- }
- checkCallingThread();
-
- if (sGlobal == null) {
- sGlobal = new GlobalMediaRouter(context.getApplicationContext());
- sGlobal.start();
- }
- return sGlobal.getRouter(context);
- }
-
- /**
- * Gets information about the {@link MediaRouter.RouteInfo routes} currently known to
- * this media router.
- */
- public List<RouteInfo> getRoutes() {
- checkCallingThread();
- return sGlobal.getRoutes();
- }
-
- /**
- * Gets information about the {@link MediaRouter.ProviderInfo route providers}
- * currently known to this media router.
- */
- public List<ProviderInfo> getProviders() {
- checkCallingThread();
- return sGlobal.getProviders();
- }
-
- /**
- * Gets the default route for playing media content on the system.
- * <p>
- * The system always provides a default route.
- * </p>
- *
- * @return The default route, which is guaranteed to never be null.
- */
- @NonNull
- public RouteInfo getDefaultRoute() {
- checkCallingThread();
- return sGlobal.getDefaultRoute();
- }
-
- /**
- * Gets a bluetooth route for playing media content on the system.
- *
- * @return A bluetooth route, if exist, otherwise null.
- */
- public RouteInfo getBluetoothRoute() {
- checkCallingThread();
- return sGlobal.getBluetoothRoute();
- }
-
- /**
- * Gets the currently selected route.
- * <p>
- * The application should examine the route's
- * {@link RouteInfo#getControlFilters media control intent filters} to assess the
- * capabilities of the route before attempting to use it.
- * </p>
- *
- * <h3>Example</h3>
- * <pre>
- * public boolean playMovie() {
- * MediaRouter mediaRouter = MediaRouter.getInstance(context);
- * MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute();
- *
- * // First try using the remote playback interface, if supported.
- * if (route.supportsControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
- * // The route supports remote playback.
- * // Try to send it the Uri of the movie to play.
- * Intent intent = new Intent(MediaControlIntent.ACTION_PLAY);
- * intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
- * intent.setDataAndType("http://example.com/videos/movie.mp4", "video/mp4");
- * if (route.supportsControlRequest(intent)) {
- * route.sendControlRequest(intent, null);
- * return true; // sent the request to play the movie
- * }
- * }
- *
- * // If remote playback was not possible, then play locally.
- * if (route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO)) {
- * // The route supports live video streaming.
- * // Prepare to play content locally in a window or in a presentation.
- * return playMovieInWindow();
- * }
- *
- * // Neither interface is supported, so we can't play the movie to this route.
- * return false;
- * }
- * </pre>
- *
- * @return The selected route, which is guaranteed to never be null.
- *
- * @see RouteInfo#getControlFilters
- * @see RouteInfo#supportsControlCategory
- * @see RouteInfo#supportsControlRequest
- */
- @NonNull
- public RouteInfo getSelectedRoute() {
- checkCallingThread();
- return sGlobal.getSelectedRoute();
- }
-
- /**
- * Returns the selected route if it matches the specified selector, otherwise
- * selects the default route and returns it. If there is one live audio route
- * (usually Bluetooth A2DP), it will be selected instead of default route.
- *
- * @param selector The selector to match.
- * @return The previously selected route if it matched the selector, otherwise the
- * newly selected default route which is guaranteed to never be null.
- *
- * @see MediaRouteSelector
- * @see RouteInfo#matchesSelector
- */
- @NonNull
- public RouteInfo updateSelectedRoute(@NonNull MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "updateSelectedRoute: " + selector);
- }
- RouteInfo route = sGlobal.getSelectedRoute();
- if (!route.isDefaultOrBluetooth() && !route.matchesSelector(selector)) {
- route = sGlobal.chooseFallbackRoute();
- sGlobal.selectRoute(route);
- }
- return route;
- }
-
- /**
- * Selects the specified route.
- *
- * @param route The route to select.
- */
- public void selectRoute(@NonNull RouteInfo route) {
- if (route == null) {
- throw new IllegalArgumentException("route must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "selectRoute: " + route);
- }
- sGlobal.selectRoute(route);
- }
-
- /**
- * Unselects the current round and selects the default route instead.
- * <p>
- * The reason given must be one of:
- * <ul>
- * <li>{@link MediaRouter#UNSELECT_REASON_UNKNOWN}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_DISCONNECTED}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_STOPPED}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_ROUTE_CHANGED}</li>
- * </ul>
- *
- * @param reason The reason for disconnecting the current route.
- */
- public void unselect(int reason) {
- if (reason < MediaRouter.UNSELECT_REASON_UNKNOWN ||
- reason > MediaRouter.UNSELECT_REASON_ROUTE_CHANGED) {
- throw new IllegalArgumentException("Unsupported reason to unselect route");
- }
- checkCallingThread();
-
- // Choose the fallback route if it's not already selected.
- // Otherwise, select the default route.
- RouteInfo fallbackRoute = sGlobal.chooseFallbackRoute();
- if (sGlobal.getSelectedRoute() != fallbackRoute) {
- sGlobal.selectRoute(fallbackRoute, reason);
- } else {
- sGlobal.selectRoute(sGlobal.getDefaultRoute(), reason);
- }
- }
-
- /**
- * Returns true if there is a route that matches the specified selector.
- * <p>
- * This method returns true if there are any available routes that match the
- * selector regardless of whether they are enabled or disabled. If the
- * {@link #AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE} flag is specified, then
- * the method will only consider non-default routes.
- * </p>
- * <p class="note">
- * On {@link ActivityManager#isLowRamDevice low-RAM devices} this method
- * will return true if it is possible to discover a matching route even if
- * discovery is not in progress or if no matching route has yet been found.
- * Use {@link #AVAILABILITY_FLAG_REQUIRE_MATCH} to require an actual match.
- * </p>
- *
- * @param selector The selector to match.
- * @param flags Flags to control the determination of whether a route may be
- * available. May be zero or some combination of
- * {@link #AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE} and
- * {@link #AVAILABILITY_FLAG_REQUIRE_MATCH}.
- * @return True if a matching route may be available.
- */
- public boolean isRouteAvailable(@NonNull MediaRouteSelector selector, int flags) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
- checkCallingThread();
-
- return sGlobal.isRouteAvailable(selector, flags);
- }
-
- /**
- * Registers a callback to discover routes that match the selector and to receive
- * events when they change.
- * <p>
- * This is a convenience method that has the same effect as calling
- * {@link #addCallback(MediaRouteSelector, Callback, int)} without flags.
- * </p>
- *
- * @param selector A route selector that indicates the kinds of routes that the
- * callback would like to discover.
- * @param callback The callback to add.
- * @see #removeCallback
- */
- public void addCallback(MediaRouteSelector selector, Callback callback) {
- addCallback(selector, callback, 0);
- }
-
- /**
- * Registers a callback to discover routes that match the selector and to receive
- * events when they change.
- * <p>
- * The selector describes the kinds of routes that the application wants to
- * discover. For example, if the application wants to use
- * live audio routes then it should include the
- * {@link MediaControlIntent#CATEGORY_LIVE_AUDIO live audio media control intent category}
- * in its selector when it adds a callback to the media router.
- * The selector may include any number of categories.
- * </p><p>
- * If the callback has already been registered, then the selector is added to
- * the set of selectors being monitored by the callback.
- * </p><p>
- * By default, the callback will only be invoked for events that affect routes
- * that match the specified selector. Event filtering may be disabled by specifying
- * the {@link #CALLBACK_FLAG_UNFILTERED_EVENTS} flag when the callback is registered.
- * </p><p>
- * Applications should use the {@link #isRouteAvailable} method to determine
- * whether is it possible to discover a route with the desired capabilities
- * and therefore whether the media route button should be shown to the user.
- * </p><p>
- * The {@link #CALLBACK_FLAG_REQUEST_DISCOVERY} flag should be used while the application
- * is in the foreground to request that passive discovery be performed if there are
- * sufficient resources to allow continuous passive discovery.
- * On {@link ActivityManager#isLowRamDevice low-RAM devices} this flag will be
- * ignored to conserve resources.
- * </p><p>
- * The {@link #CALLBACK_FLAG_FORCE_DISCOVERY} flag should be used when
- * passive discovery absolutely must be performed, even on low-RAM devices.
- * This flag has a significant performance impact on low-RAM devices
- * since it may cause many media route providers to be started simultaneously.
- * It is much better to use {@link #CALLBACK_FLAG_REQUEST_DISCOVERY} instead to avoid
- * performing passive discovery on these devices altogether.
- * </p><p>
- * The {@link #CALLBACK_FLAG_PERFORM_ACTIVE_SCAN} flag should be used when the
- * media route chooser dialog is showing to confirm the presence of available
- * routes that the user may connect to. This flag may use substantially more
- * power.
- * </p>
- *
- * <h3>Example</h3>
- * <pre>
- * public class MyActivity extends Activity {
- * private MediaRouter mRouter;
- * private MediaRouter.Callback mCallback;
- * private MediaRouteSelector mSelector;
- *
- * protected void onCreate(Bundle savedInstanceState) {
- * super.onCreate(savedInstanceState);
- *
- * mRouter = Mediarouter.getInstance(this);
- * mCallback = new MyCallback();
- * mSelector = new MediaRouteSelector.Builder()
- * .addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
- * .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
- * .build();
- * }
- *
- * // Add the callback on start to tell the media router what kinds of routes
- * // the application is interested in so that it can try to discover suitable ones.
- * public void onStart() {
- * super.onStart();
- *
- * mediaRouter.addCallback(mSelector, mCallback,
- * MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
- *
- * MediaRouter.RouteInfo route = mediaRouter.updateSelectedRoute(mSelector);
- * // do something with the route...
- * }
- *
- * // Remove the selector on stop to tell the media router that it no longer
- * // needs to invest effort trying to discover routes of these kinds for now.
- * public void onStop() {
- * super.onStop();
- *
- * mediaRouter.removeCallback(mCallback);
- * }
- *
- * private final class MyCallback extends MediaRouter.Callback {
- * // Implement callback methods as needed.
- * }
- * }
- * </pre>
- *
- * @param selector A route selector that indicates the kinds of routes that the
- * callback would like to discover.
- * @param callback The callback to add.
- * @param flags Flags to control the behavior of the callback.
- * May be zero or a combination of {@link #CALLBACK_FLAG_PERFORM_ACTIVE_SCAN} and
- * {@link #CALLBACK_FLAG_UNFILTERED_EVENTS}.
- * @see #removeCallback
- */
- public void addCallback(@NonNull MediaRouteSelector selector, @NonNull Callback callback,
- @CallbackFlags int flags) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
- if (callback == null) {
- throw new IllegalArgumentException("callback must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "addCallback: selector=" + selector
- + ", callback=" + callback + ", flags=" + Integer.toHexString(flags));
- }
-
- CallbackRecord record;
- int index = findCallbackRecord(callback);
- if (index < 0) {
- record = new CallbackRecord(this, callback);
- mCallbackRecords.add(record);
- } else {
- record = mCallbackRecords.get(index);
- }
- boolean updateNeeded = false;
- if ((flags & ~record.mFlags) != 0) {
- record.mFlags |= flags;
- updateNeeded = true;
- }
- if (!record.mSelector.contains(selector)) {
- record.mSelector = new MediaRouteSelector.Builder(record.mSelector)
- .addSelector(selector)
- .build();
- updateNeeded = true;
- }
- if (updateNeeded) {
- sGlobal.updateDiscoveryRequest();
- }
- }
-
- /**
- * Removes the specified callback. It will no longer receive events about
- * changes to media routes.
- *
- * @param callback The callback to remove.
- * @see #addCallback
- */
- public void removeCallback(@NonNull Callback callback) {
- if (callback == null) {
- throw new IllegalArgumentException("callback must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "removeCallback: callback=" + callback);
- }
-
- int index = findCallbackRecord(callback);
- if (index >= 0) {
- mCallbackRecords.remove(index);
- sGlobal.updateDiscoveryRequest();
- }
- }
-
- private int findCallbackRecord(Callback callback) {
- final int count = mCallbackRecords.size();
- for (int i = 0; i < count; i++) {
- if (mCallbackRecords.get(i).mCallback == callback) {
- return i;
- }
- }
- return -1;
- }
-
- /**
- * Registers a media route provider within this application process.
- * <p>
- * The provider will be added to the list of providers that all {@link MediaRouter}
- * instances within this process can use to discover routes.
- * </p>
- *
- * @param providerInstance The media route provider instance to add.
- *
- * @see MediaRouteProvider
- * @see #removeCallback
- */
- public void addProvider(@NonNull MediaRouteProvider providerInstance) {
- if (providerInstance == null) {
- throw new IllegalArgumentException("providerInstance must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "addProvider: " + providerInstance);
- }
- sGlobal.addProvider(providerInstance);
- }
-
- /**
- * Unregisters a media route provider within this application process.
- * <p>
- * The provider will be removed from the list of providers that all {@link MediaRouter}
- * instances within this process can use to discover routes.
- * </p>
- *
- * @param providerInstance The media route provider instance to remove.
- *
- * @see MediaRouteProvider
- * @see #addCallback
- */
- public void removeProvider(@NonNull MediaRouteProvider providerInstance) {
- if (providerInstance == null) {
- throw new IllegalArgumentException("providerInstance must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "removeProvider: " + providerInstance);
- }
- sGlobal.removeProvider(providerInstance);
- }
-
- /**
- * Adds a remote control client to enable remote control of the volume
- * of the selected route.
- * <p>
- * The remote control client must have previously been registered with
- * the audio manager using the {@link android.media.AudioManager#registerRemoteControlClient
- * AudioManager.registerRemoteControlClient} method.
- * </p>
- *
- * @param remoteControlClient The {@link android.media.RemoteControlClient} to register.
- */
- public void addRemoteControlClient(@NonNull Object remoteControlClient) {
- if (remoteControlClient == null) {
- throw new IllegalArgumentException("remoteControlClient must not be null");
- }
- checkCallingThread();
-
- if (DEBUG) {
- Log.d(TAG, "addRemoteControlClient: " + remoteControlClient);
- }
- sGlobal.addRemoteControlClient(remoteControlClient);
- }
-
- /**
- * Removes a remote control client.
- *
- * @param remoteControlClient The {@link android.media.RemoteControlClient}
- * to unregister.
- */
- public void removeRemoteControlClient(@NonNull Object remoteControlClient) {
- if (remoteControlClient == null) {
- throw new IllegalArgumentException("remoteControlClient must not be null");
- }
-
- if (DEBUG) {
- Log.d(TAG, "removeRemoteControlClient: " + remoteControlClient);
- }
- sGlobal.removeRemoteControlClient(remoteControlClient);
- }
-
- /**
- * Sets the media session to enable remote control of the volume of the
- * selected route. This should be used instead of
- * {@link #addRemoteControlClient} when using media sessions. Set the
- * session to null to clear it.
- *
- * @param mediaSession The {@link android.media.session.MediaSession} to
- * use.
- */
- public void setMediaSession(Object mediaSession) {
- if (DEBUG) {
- Log.d(TAG, "addMediaSession: " + mediaSession);
- }
- sGlobal.setMediaSession(mediaSession);
- }
-
- /**
- * Sets a compat media session to enable remote control of the volume of the
- * selected route. This should be used instead of
- * {@link #addRemoteControlClient} when using {@link MediaSessionCompat}.
- * Set the session to null to clear it.
- *
- * @param mediaSession
- */
- public void setMediaSessionCompat(MediaSessionCompat mediaSession) {
- if (DEBUG) {
- Log.d(TAG, "addMediaSessionCompat: " + mediaSession);
- }
- sGlobal.setMediaSessionCompat(mediaSession);
- }
-
- public MediaSessionCompat.Token getMediaSessionToken() {
- return sGlobal.getMediaSessionToken();
- }
-
- /**
- * Ensures that calls into the media router are on the correct thread.
- * It pays to be a little paranoid when global state invariants are at risk.
- */
- static void checkCallingThread() {
- if (Looper.myLooper() != Looper.getMainLooper()) {
- throw new IllegalStateException("The media router service must only be "
- + "accessed on the application's main thread.");
- }
- }
-
- static <T> boolean equal(T a, T b) {
- return a == b || (a != null && b != null && a.equals(b));
- }
-
- /**
- * Provides information about a media route.
- * <p>
- * Each media route has a list of {@link MediaControlIntent media control}
- * {@link #getControlFilters intent filters} that describe the capabilities of the
- * route and the manner in which it is used and controlled.
- * </p>
- */
- public static class RouteInfo {
- private final ProviderInfo mProvider;
- private final String mDescriptorId;
- private final String mUniqueId;
- private String mName;
- private String mDescription;
- private Uri mIconUri;
- private boolean mEnabled;
- private boolean mConnecting;
- private int mConnectionState;
- private boolean mCanDisconnect;
- private final ArrayList<IntentFilter> mControlFilters = new ArrayList<>();
- private int mPlaybackType;
- private int mPlaybackStream;
- private int mDeviceType;
- private int mVolumeHandling;
- private int mVolume;
- private int mVolumeMax;
- private Display mPresentationDisplay;
- private int mPresentationDisplayId = PRESENTATION_DISPLAY_ID_NONE;
- private Bundle mExtras;
- private IntentSender mSettingsIntent;
- MediaRouteDescriptor mDescriptor;
-
- @IntDef({CONNECTION_STATE_DISCONNECTED, CONNECTION_STATE_CONNECTING,
- CONNECTION_STATE_CONNECTED})
- @Retention(RetentionPolicy.SOURCE)
- private @interface ConnectionState {}
-
- /**
- * The default connection state indicating the route is disconnected.
- *
- * @see #getConnectionState
- */
- public static final int CONNECTION_STATE_DISCONNECTED = 0;
-
- /**
- * A connection state indicating the route is in the process of connecting and is not yet
- * ready for use.
- *
- * @see #getConnectionState
- */
- public static final int CONNECTION_STATE_CONNECTING = 1;
-
- /**
- * A connection state indicating the route is connected.
- *
- * @see #getConnectionState
- */
- public static final int CONNECTION_STATE_CONNECTED = 2;
-
- @IntDef({PLAYBACK_TYPE_LOCAL,PLAYBACK_TYPE_REMOTE})
- @Retention(RetentionPolicy.SOURCE)
- private @interface PlaybackType {}
-
- /**
- * The default playback type, "local", indicating the presentation of the media
- * is happening on the same device (e.g. a phone, a tablet) as where it is
- * controlled from.
- *
- * @see #getPlaybackType
- */
- public static final int PLAYBACK_TYPE_LOCAL = 0;
-
- /**
- * A playback type indicating the presentation of the media is happening on
- * a different device (i.e. the remote device) than where it is controlled from.
- *
- * @see #getPlaybackType
- */
- public static final int PLAYBACK_TYPE_REMOTE = 1;
-
- @IntDef({DEVICE_TYPE_UNKNOWN, DEVICE_TYPE_TV, DEVICE_TYPE_SPEAKER, DEVICE_TYPE_BLUETOOTH})
- @Retention(RetentionPolicy.SOURCE)
- private @interface DeviceType {}
-
- /**
- * The default receiver device type of the route indicating the type is unknown.
- *
- * @see #getDeviceType
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public static final int DEVICE_TYPE_UNKNOWN = 0;
-
- /**
- * A receiver device type of the route indicating the presentation of the media is happening
- * on a TV.
- *
- * @see #getDeviceType
- */
- public static final int DEVICE_TYPE_TV = 1;
-
- /**
- * A receiver device type of the route indicating the presentation of the media is happening
- * on a speaker.
- *
- * @see #getDeviceType
- */
- public static final int DEVICE_TYPE_SPEAKER = 2;
-
- /**
- * A receiver device type of the route indicating the presentation of the media is happening
- * on a bluetooth device such as a bluetooth speaker.
- *
- * @see #getDeviceType
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public static final int DEVICE_TYPE_BLUETOOTH = 3;
-
- @IntDef({PLAYBACK_VOLUME_FIXED,PLAYBACK_VOLUME_VARIABLE})
- @Retention(RetentionPolicy.SOURCE)
- private @interface PlaybackVolume {}
-
- /**
- * Playback information indicating the playback volume is fixed, i.e. it cannot be
- * controlled from this object. An example of fixed playback volume is a remote player,
- * playing over HDMI where the user prefers to control the volume on the HDMI sink, rather
- * than attenuate at the source.
- *
- * @see #getVolumeHandling
- */
- public static final int PLAYBACK_VOLUME_FIXED = 0;
-
- /**
- * Playback information indicating the playback volume is variable and can be controlled
- * from this object.
- *
- * @see #getVolumeHandling
- */
- public static final int PLAYBACK_VOLUME_VARIABLE = 1;
-
- /**
- * The default presentation display id indicating no presentation display is associated
- * with the route.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public static final int PRESENTATION_DISPLAY_ID_NONE = -1;
-
- static final int CHANGE_GENERAL = 1 << 0;
- static final int CHANGE_VOLUME = 1 << 1;
- static final int CHANGE_PRESENTATION_DISPLAY = 1 << 2;
-
- // Should match to SystemMediaRouteProvider.PACKAGE_NAME.
- static final String SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME = "android";
-
- RouteInfo(ProviderInfo provider, String descriptorId, String uniqueId) {
- mProvider = provider;
- mDescriptorId = descriptorId;
- mUniqueId = uniqueId;
- }
-
- /**
- * Gets information about the provider of this media route.
- */
- public ProviderInfo getProvider() {
- return mProvider;
- }
-
- /**
- * Gets the unique id of the route.
- * <p>
- * The route unique id functions as a stable identifier by which the route is known.
- * For example, an application can use this id as a token to remember the
- * selected route across restarts or to communicate its identity to a service.
- * </p>
- *
- * @return The unique id of the route, never null.
- */
- @NonNull
- public String getId() {
- return mUniqueId;
- }
-
- /**
- * Gets the user-visible name of the route.
- * <p>
- * The route name identifies the destination represented by the route.
- * It may be a user-supplied name, an alias, or device serial number.
- * </p>
- *
- * @return The user-visible name of a media route. This is the string presented
- * to users who may select this as the active route.
- */
- public String getName() {
- return mName;
- }
-
- /**
- * Gets the user-visible description of the route.
- * <p>
- * The route description describes the kind of destination represented by the route.
- * It may be a user-supplied string, a model number or brand of device.
- * </p>
- *
- * @return The description of the route, or null if none.
- */
- @Nullable
- public String getDescription() {
- return mDescription;
- }
-
- /**
- * Gets the URI of the icon representing this route.
- * <p>
- * This icon will be used in picker UIs if available.
- * </p>
- *
- * @return The URI of the icon representing this route, or null if none.
- */
- public Uri getIconUri() {
- return mIconUri;
- }
-
- /**
- * Returns true if this route is enabled and may be selected.
- *
- * @return True if this route is enabled.
- */
- public boolean isEnabled() {
- return mEnabled;
- }
-
- /**
- * Returns true if the route is in the process of connecting and is not
- * yet ready for use.
- *
- * @return True if this route is in the process of connecting.
- */
- public boolean isConnecting() {
- return mConnecting;
- }
-
- /**
- * Gets the connection state of the route.
- *
- * @return The connection state of this route: {@link #CONNECTION_STATE_DISCONNECTED},
- * {@link #CONNECTION_STATE_CONNECTING}, or {@link #CONNECTION_STATE_CONNECTED}.
- */
- @ConnectionState
- public int getConnectionState() {
- return mConnectionState;
- }
-
- /**
- * Returns true if this route is currently selected.
- *
- * @return True if this route is currently selected.
- *
- * @see MediaRouter#getSelectedRoute
- */
- public boolean isSelected() {
- checkCallingThread();
- return sGlobal.getSelectedRoute() == this;
- }
-
- /**
- * Returns true if this route is the default route.
- *
- * @return True if this route is the default route.
- *
- * @see MediaRouter#getDefaultRoute
- */
- public boolean isDefault() {
- checkCallingThread();
- return sGlobal.getDefaultRoute() == this;
- }
-
- /**
- * Returns true if this route is a bluetooth route.
- *
- * @return True if this route is a bluetooth route.
- *
- * @see MediaRouter#getBluetoothRoute
- */
- public boolean isBluetooth() {
- checkCallingThread();
- return sGlobal.getBluetoothRoute() == this;
- }
-
- /**
- * Returns true if this route is the default route and the device speaker.
- *
- * @return True if this route is the default route and the device speaker.
- */
- public boolean isDeviceSpeaker() {
- int defaultAudioRouteNameResourceId = Resources.getSystem().getIdentifier(
- "default_audio_route_name", "string", "android");
- return isDefault()
- && Resources.getSystem().getText(defaultAudioRouteNameResourceId).equals(mName);
- }
-
- /**
- * Gets a list of {@link MediaControlIntent media control intent} filters that
- * describe the capabilities of this route and the media control actions that
- * it supports.
- *
- * @return A list of intent filters that specifies the media control intents that
- * this route supports.
- *
- * @see MediaControlIntent
- * @see #supportsControlCategory
- * @see #supportsControlRequest
- */
- public List<IntentFilter> getControlFilters() {
- return mControlFilters;
- }
-
- /**
- * Returns true if the route supports at least one of the capabilities
- * described by a media route selector.
- *
- * @param selector The selector that specifies the capabilities to check.
- * @return True if the route supports at least one of the capabilities
- * described in the media route selector.
- */
- public boolean matchesSelector(@NonNull MediaRouteSelector selector) {
- if (selector == null) {
- throw new IllegalArgumentException("selector must not be null");
- }
- checkCallingThread();
- return selector.matchesControlFilters(mControlFilters);
- }
-
- /**
- * Returns true if the route supports the specified
- * {@link MediaControlIntent media control} category.
- * <p>
- * Media control categories describe the capabilities of this route
- * such as whether it supports live audio streaming or remote playback.
- * </p>
- *
- * @param category A {@link MediaControlIntent media control} category
- * such as {@link MediaControlIntent#CATEGORY_LIVE_AUDIO},
- * {@link MediaControlIntent#CATEGORY_LIVE_VIDEO},
- * {@link MediaControlIntent#CATEGORY_REMOTE_PLAYBACK}, or a provider-defined
- * media control category.
- * @return True if the route supports the specified intent category.
- *
- * @see MediaControlIntent
- * @see #getControlFilters
- */
- public boolean supportsControlCategory(@NonNull String category) {
- if (category == null) {
- throw new IllegalArgumentException("category must not be null");
- }
- checkCallingThread();
-
- int count = mControlFilters.size();
- for (int i = 0; i < count; i++) {
- if (mControlFilters.get(i).hasCategory(category)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Returns true if the route supports the specified
- * {@link MediaControlIntent media control} category and action.
- * <p>
- * Media control actions describe specific requests that an application
- * can ask a route to perform.
- * </p>
- *
- * @param category A {@link MediaControlIntent media control} category
- * such as {@link MediaControlIntent#CATEGORY_LIVE_AUDIO},
- * {@link MediaControlIntent#CATEGORY_LIVE_VIDEO},
- * {@link MediaControlIntent#CATEGORY_REMOTE_PLAYBACK}, or a provider-defined
- * media control category.
- * @param action A {@link MediaControlIntent media control} action
- * such as {@link MediaControlIntent#ACTION_PLAY}.
- * @return True if the route supports the specified intent action.
- *
- * @see MediaControlIntent
- * @see #getControlFilters
- */
- public boolean supportsControlAction(@NonNull String category, @NonNull String action) {
- if (category == null) {
- throw new IllegalArgumentException("category must not be null");
- }
- if (action == null) {
- throw new IllegalArgumentException("action must not be null");
- }
- checkCallingThread();
-
- int count = mControlFilters.size();
- for (int i = 0; i < count; i++) {
- IntentFilter filter = mControlFilters.get(i);
- if (filter.hasCategory(category) && filter.hasAction(action)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Returns true if the route supports the specified
- * {@link MediaControlIntent media control} request.
- * <p>
- * Media control requests are used to request the route to perform
- * actions such as starting remote playback of a media item.
- * </p>
- *
- * @param intent A {@link MediaControlIntent media control intent}.
- * @return True if the route can handle the specified intent.
- *
- * @see MediaControlIntent
- * @see #getControlFilters
- */
- public boolean supportsControlRequest(@NonNull Intent intent) {
- if (intent == null) {
- throw new IllegalArgumentException("intent must not be null");
- }
- checkCallingThread();
-
- ContentResolver contentResolver = sGlobal.getContentResolver();
- int count = mControlFilters.size();
- for (int i = 0; i < count; i++) {
- if (mControlFilters.get(i).match(contentResolver, intent, true, TAG) >= 0) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Sends a {@link MediaControlIntent media control} request to be performed
- * asynchronously by the route's destination.
- * <p>
- * Media control requests are used to request the route to perform
- * actions such as starting remote playback of a media item.
- * </p><p>
- * This function may only be called on a selected route. Control requests
- * sent to unselected routes will fail.
- * </p>
- *
- * @param intent A {@link MediaControlIntent media control intent}.
- * @param callback A {@link ControlRequestCallback} to invoke with the result
- * of the request, or null if no result is required.
- *
- * @see MediaControlIntent
- */
- public void sendControlRequest(@NonNull Intent intent,
- @Nullable ControlRequestCallback callback) {
- if (intent == null) {
- throw new IllegalArgumentException("intent must not be null");
- }
- checkCallingThread();
-
- sGlobal.sendControlRequest(this, intent, callback);
- }
-
- /**
- * Gets the type of playback associated with this route.
- *
- * @return The type of playback associated with this route: {@link #PLAYBACK_TYPE_LOCAL}
- * or {@link #PLAYBACK_TYPE_REMOTE}.
- */
- @PlaybackType
- public int getPlaybackType() {
- return mPlaybackType;
- }
-
- /**
- * Gets the audio stream over which the playback associated with this route is performed.
- *
- * @return The stream over which the playback associated with this route is performed.
- */
- public int getPlaybackStream() {
- return mPlaybackStream;
- }
-
- /**
- * Gets the type of the receiver device associated with this route.
- *
- * @return The type of the receiver device associated with this route:
- * {@link #DEVICE_TYPE_TV} or {@link #DEVICE_TYPE_SPEAKER}.
- */
- public int getDeviceType() {
- return mDeviceType;
- }
-
-
- /**
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public boolean isDefaultOrBluetooth() {
- if (isDefault() || mDeviceType == DEVICE_TYPE_BLUETOOTH) {
- return true;
- }
- // This is a workaround for platform version 23 or below where the system route
- // provider doesn't specify device type for bluetooth media routes.
- return isSystemMediaRouteProvider(this)
- && supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
- && !supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
- }
-
- /**
- * Returns {@code true} if the route is selectable.
- */
- boolean isSelectable() {
- // This tests whether the route is still valid and enabled.
- // The route descriptor field is set to null when the route is removed.
- return mDescriptor != null && mEnabled;
- }
-
- private static boolean isSystemMediaRouteProvider(MediaRouter.RouteInfo route) {
- return TextUtils.equals(route.getProviderInstance().getMetadata().getPackageName(),
- SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME);
- }
-
- /**
- * Gets information about how volume is handled on the route.
- *
- * @return How volume is handled on the route: {@link #PLAYBACK_VOLUME_FIXED}
- * or {@link #PLAYBACK_VOLUME_VARIABLE}.
- */
- @PlaybackVolume
- public int getVolumeHandling() {
- return mVolumeHandling;
- }
-
- /**
- * Gets the current volume for this route. Depending on the route, this may only
- * be valid if the route is currently selected.
- *
- * @return The volume at which the playback associated with this route is performed.
- */
- public int getVolume() {
- return mVolume;
- }
-
- /**
- * Gets the maximum volume at which the playback associated with this route is performed.
- *
- * @return The maximum volume at which the playback associated with
- * this route is performed.
- */
- public int getVolumeMax() {
- return mVolumeMax;
- }
-
- /**
- * Gets whether this route supports disconnecting without interrupting
- * playback.
- *
- * @return True if this route can disconnect without stopping playback,
- * false otherwise.
- */
- public boolean canDisconnect() {
- return mCanDisconnect;
- }
-
- /**
- * Requests a volume change for this route asynchronously.
- * <p>
- * This function may only be called on a selected route. It will have
- * no effect if the route is currently unselected.
- * </p>
- *
- * @param volume The new volume value between 0 and {@link #getVolumeMax}.
- */
- public void requestSetVolume(int volume) {
- checkCallingThread();
- sGlobal.requestSetVolume(this, Math.min(mVolumeMax, Math.max(0, volume)));
- }
-
- /**
- * Requests an incremental volume update for this route asynchronously.
- * <p>
- * This function may only be called on a selected route. It will have
- * no effect if the route is currently unselected.
- * </p>
- *
- * @param delta The delta to add to the current volume.
- */
- public void requestUpdateVolume(int delta) {
- checkCallingThread();
- if (delta != 0) {
- sGlobal.requestUpdateVolume(this, delta);
- }
- }
-
- /**
- * Gets the {@link Display} that should be used by the application to show
- * a {@link android.app.Presentation} on an external display when this route is selected.
- * Depending on the route, this may only be valid if the route is currently
- * selected.
- * <p>
- * The preferred presentation display may change independently of the route
- * being selected or unselected. For example, the presentation display
- * of the default system route may change when an external HDMI display is connected
- * or disconnected even though the route itself has not changed.
- * </p><p>
- * This method may return null if there is no external display associated with
- * the route or if the display is not ready to show UI yet.
- * </p><p>
- * The application should listen for changes to the presentation display
- * using the {@link Callback#onRoutePresentationDisplayChanged} callback and
- * show or dismiss its {@link android.app.Presentation} accordingly when the display
- * becomes available or is removed.
- * </p><p>
- * This method only makes sense for
- * {@link MediaControlIntent#CATEGORY_LIVE_VIDEO live video} routes.
- * </p>
- *
- * @return The preferred presentation display to use when this route is
- * selected or null if none.
- *
- * @see MediaControlIntent#CATEGORY_LIVE_VIDEO
- * @see android.app.Presentation
- */
- @Nullable
- public Display getPresentationDisplay() {
- checkCallingThread();
- if (mPresentationDisplayId >= 0 && mPresentationDisplay == null) {
- mPresentationDisplay = sGlobal.getDisplay(mPresentationDisplayId);
- }
- return mPresentationDisplay;
- }
-
- /**
- * Gets the route's presentation display id, or -1 if none.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public int getPresentationDisplayId() {
- return mPresentationDisplayId;
- }
-
- /**
- * Gets a collection of extra properties about this route that were supplied
- * by its media route provider, or null if none.
- */
- @Nullable
- public Bundle getExtras() {
- return mExtras;
- }
-
- /**
- * Gets an intent sender for launching a settings activity for this
- * route.
- */
- @Nullable
- public IntentSender getSettingsIntent() {
- return mSettingsIntent;
- }
-
- /**
- * Selects this media route.
- */
- public void select() {
- checkCallingThread();
- sGlobal.selectRoute(this);
- }
-
- @Override
- public String toString() {
- return "MediaRouter.RouteInfo{ uniqueId=" + mUniqueId
- + ", name=" + mName
- + ", description=" + mDescription
- + ", iconUri=" + mIconUri
- + ", enabled=" + mEnabled
- + ", connecting=" + mConnecting
- + ", connectionState=" + mConnectionState
- + ", canDisconnect=" + mCanDisconnect
- + ", playbackType=" + mPlaybackType
- + ", playbackStream=" + mPlaybackStream
- + ", deviceType=" + mDeviceType
- + ", volumeHandling=" + mVolumeHandling
- + ", volume=" + mVolume
- + ", volumeMax=" + mVolumeMax
- + ", presentationDisplayId=" + mPresentationDisplayId
- + ", extras=" + mExtras
- + ", settingsIntent=" + mSettingsIntent
- + ", providerPackageName=" + mProvider.getPackageName()
- + " }";
- }
-
- int maybeUpdateDescriptor(MediaRouteDescriptor descriptor) {
- int changes = 0;
- if (mDescriptor != descriptor) {
- changes = updateDescriptor(descriptor);
- }
- return changes;
- }
-
- int updateDescriptor(MediaRouteDescriptor descriptor) {
- int changes = 0;
- mDescriptor = descriptor;
- if (descriptor != null) {
- if (!equal(mName, descriptor.getName())) {
- mName = descriptor.getName();
- changes |= CHANGE_GENERAL;
- }
- if (!equal(mDescription, descriptor.getDescription())) {
- mDescription = descriptor.getDescription();
- changes |= CHANGE_GENERAL;
- }
- if (!equal(mIconUri, descriptor.getIconUri())) {
- mIconUri = descriptor.getIconUri();
- changes |= CHANGE_GENERAL;
- }
- if (mEnabled != descriptor.isEnabled()) {
- mEnabled = descriptor.isEnabled();
- changes |= CHANGE_GENERAL;
- }
- if (mConnecting != descriptor.isConnecting()) {
- mConnecting = descriptor.isConnecting();
- changes |= CHANGE_GENERAL;
- }
- if (mConnectionState != descriptor.getConnectionState()) {
- mConnectionState = descriptor.getConnectionState();
- changes |= CHANGE_GENERAL;
- }
- if (!mControlFilters.equals(descriptor.getControlFilters())) {
- mControlFilters.clear();
- mControlFilters.addAll(descriptor.getControlFilters());
- changes |= CHANGE_GENERAL;
- }
- if (mPlaybackType != descriptor.getPlaybackType()) {
- mPlaybackType = descriptor.getPlaybackType();
- changes |= CHANGE_GENERAL;
- }
- if (mPlaybackStream != descriptor.getPlaybackStream()) {
- mPlaybackStream = descriptor.getPlaybackStream();
- changes |= CHANGE_GENERAL;
- }
- if (mDeviceType != descriptor.getDeviceType()) {
- mDeviceType = descriptor.getDeviceType();
- changes |= CHANGE_GENERAL;
- }
- if (mVolumeHandling != descriptor.getVolumeHandling()) {
- mVolumeHandling = descriptor.getVolumeHandling();
- changes |= CHANGE_GENERAL | CHANGE_VOLUME;
- }
- if (mVolume != descriptor.getVolume()) {
- mVolume = descriptor.getVolume();
- changes |= CHANGE_GENERAL | CHANGE_VOLUME;
- }
- if (mVolumeMax != descriptor.getVolumeMax()) {
- mVolumeMax = descriptor.getVolumeMax();
- changes |= CHANGE_GENERAL | CHANGE_VOLUME;
- }
- if (mPresentationDisplayId != descriptor.getPresentationDisplayId()) {
- mPresentationDisplayId = descriptor.getPresentationDisplayId();
- mPresentationDisplay = null;
- changes |= CHANGE_GENERAL | CHANGE_PRESENTATION_DISPLAY;
- }
- if (!equal(mExtras, descriptor.getExtras())) {
- mExtras = descriptor.getExtras();
- changes |= CHANGE_GENERAL;
- }
- if (!equal(mSettingsIntent, descriptor.getSettingsActivity())) {
- mSettingsIntent = descriptor.getSettingsActivity();
- changes |= CHANGE_GENERAL;
- }
- if (mCanDisconnect != descriptor.canDisconnectAndKeepPlaying()) {
- mCanDisconnect = descriptor.canDisconnectAndKeepPlaying();
- changes |= CHANGE_GENERAL | CHANGE_PRESENTATION_DISPLAY;
- }
- }
- return changes;
- }
-
- String getDescriptorId() {
- return mDescriptorId;
- }
-
- /** @hide */
- // @RestrictTo(LIBRARY_GROUP)
- public MediaRouteProvider getProviderInstance() {
- return mProvider.getProviderInstance();
- }
- }
-
- /**
- * Information about a route that consists of multiple other routes in a group.
- * @hide
- */
- // @RestrictTo(LIBRARY_GROUP)
- public static class RouteGroup extends RouteInfo {
- private List<RouteInfo> mRoutes = new ArrayList<>();
-
- RouteGroup(ProviderInfo provider, String descriptorId, String uniqueId) {
- super(provider, descriptorId, uniqueId);
- }
-
- /**
- * @return The number of routes in this group
- */
- public int getRouteCount() {
- return mRoutes.size();
- }
-
- /**
- * Returns the route in this group at the specified index
- *
- * @param index Index to fetch
- * @return The route at index
- */
- public RouteInfo getRouteAt(int index) {
- return mRoutes.get(index);
- }
-
- /**
- * Returns the routes in this group
- *
- * @return The list of the routes in this group
- */
- public List<RouteInfo> getRoutes() {
- return mRoutes;
- }
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder(super.toString());
- sb.append('[');
- final int count = mRoutes.size();
- for (int i = 0; i < count; i++) {
- if (i > 0) sb.append(", ");
- sb.append(mRoutes.get(i));
- }
- sb.append(']');
- return sb.toString();
- }
-
- @Override
- int maybeUpdateDescriptor(MediaRouteDescriptor descriptor) {
- boolean changed = false;
- if (mDescriptor != descriptor) {
- mDescriptor = descriptor;
- if (descriptor != null) {
- List<String> groupMemberIds = descriptor.getGroupMemberIds();
- List<RouteInfo> routes = new ArrayList<>();
- changed = groupMemberIds.size() != mRoutes.size();
- for (String groupMemberId : groupMemberIds) {
- String uniqueId = sGlobal.getUniqueId(getProvider(), groupMemberId);
- RouteInfo groupMember = sGlobal.getRoute(uniqueId);
- if (groupMember != null) {
- routes.add(groupMember);
- if (!changed && !mRoutes.contains(groupMember)) {
- changed = true;
- }
- }
- }
- if (changed) {
- mRoutes = routes;
- }
- }
- }
- return (changed ? CHANGE_GENERAL : 0) | super.updateDescriptor(descriptor);
- }
- }
-
- /**
- * Provides information about a media route provider.
- * <p>
- * This object may be used to determine which media route provider has
- * published a particular route.
- * </p>
- */
- public static final class ProviderInfo {
- private final MediaRouteProvider mProviderInstance;
- private final List<RouteInfo> mRoutes = new ArrayList<>();
-
- private final ProviderMetadata mMetadata;
- private MediaRouteProviderDescriptor mDescriptor;
- private Resources mResources;
- private boolean mResourcesNotAvailable;
-
- ProviderInfo(MediaRouteProvider provider) {
- mProviderInstance = provider;
- mMetadata = provider.getMetadata();
- }
-
- /**
- * Gets the provider's underlying {@link MediaRouteProvider} instance.
- */
- public MediaRouteProvider getProviderInstance() {
- checkCallingThread();
- return mProviderInstance;
- }
-
- /**
- * Gets the package name of the media route provider.
- */
- public String getPackageName() {
- return mMetadata.getPackageName();
- }
-
- /**
- * Gets the component name of the media route provider.
- */
- public ComponentName getComponentName() {
- return mMetadata.getComponentName();
- }
-
- /**
- * Gets the {@link MediaRouter.RouteInfo routes} published by this route provider.
- */
- public List<RouteInfo> getRoutes() {
- checkCallingThread();
- return mRoutes;
- }
-
- Resources getResources() {
- if (mResources == null && !mResourcesNotAvailable) {
- String packageName = getPackageName();
- Context context = sGlobal.getProviderContext(packageName);
- if (context != null) {
- mResources = context.getResources();
- } else {
- Log.w(TAG, "Unable to obtain resources for route provider package: "
- + packageName);
- mResourcesNotAvailable = true;
- }
- }
- return mResources;
- }
-
- boolean updateDescriptor(MediaRouteProviderDescriptor descriptor) {
- if (mDescriptor != descriptor) {
- mDescriptor = descriptor;
- return true;
- }
- return false;
- }
-
- int findRouteByDescriptorId(String id) {
- final int count = mRoutes.size();
- for (int i = 0; i < count; i++) {
- if (mRoutes.get(i).mDescriptorId.equals(id)) {
- return i;
- }
- }
- return -1;
- }
-
- @Override
- public String toString() {
- return "MediaRouter.RouteProviderInfo{ packageName=" + getPackageName()
- + " }";
- }
- }
-
- /**
- * Interface for receiving events about media routing changes.
- * All methods of this interface will be called from the application's main thread.
- * <p>
- * A Callback will only receive events relevant to routes that the callback
- * was registered for unless the {@link MediaRouter#CALLBACK_FLAG_UNFILTERED_EVENTS}
- * flag was specified in {@link MediaRouter#addCallback(MediaRouteSelector, Callback, int)}.
- * </p>
- *
- * @see MediaRouter#addCallback(MediaRouteSelector, Callback, int)
- * @see MediaRouter#removeCallback(Callback)
- */
- public static abstract class Callback {
- /**
- * Called when the supplied media route becomes selected as the active route.
- *
- * @param router The media router reporting the event.
- * @param route The route that has been selected.
- */
- public void onRouteSelected(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when the supplied media route becomes unselected as the active route.
- * For detailed reason, override {@link #onRouteUnselected(MediaRouter, RouteInfo, int)}
- * instead.
- *
- * @param router The media router reporting the event.
- * @param route The route that has been unselected.
- */
- public void onRouteUnselected(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when the supplied media route becomes unselected as the active route.
- * The default implementation calls {@link #onRouteUnselected}.
- * <p>
- * The reason provided will be one of the following:
- * <ul>
- * <li>{@link MediaRouter#UNSELECT_REASON_UNKNOWN}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_DISCONNECTED}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_STOPPED}</li>
- * <li>{@link MediaRouter#UNSELECT_REASON_ROUTE_CHANGED}</li>
- * </ul>
- *
- * @param router The media router reporting the event.
- * @param route The route that has been unselected.
- * @param reason The reason for unselecting the route.
- */
- public void onRouteUnselected(MediaRouter router, RouteInfo route, int reason) {
- onRouteUnselected(router, route);
- }
-
- /**
- * Called when a media route has been added.
- *
- * @param router The media router reporting the event.
- * @param route The route that has become available for use.
- */
- public void onRouteAdded(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when a media route has been removed.
- *
- * @param router The media router reporting the event.
- * @param route The route that has been removed from availability.
- */
- public void onRouteRemoved(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when a property of the indicated media route has changed.
- *
- * @param router The media router reporting the event.
- * @param route The route that was changed.
- */
- public void onRouteChanged(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when a media route's volume changes.
- *
- * @param router The media router reporting the event.
- * @param route The route whose volume changed.
- */
- public void onRouteVolumeChanged(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when a media route's presentation display changes.
- * <p>
- * This method is called whenever the route's presentation display becomes
- * available, is removed or has changes to some of its properties (such as its size).
- * </p>
- *
- * @param router The media router reporting the event.
- * @param route The route whose presentation display changed.
- *
- * @see RouteInfo#getPresentationDisplay()
- */
- public void onRoutePresentationDisplayChanged(MediaRouter router, RouteInfo route) {
- }
-
- /**
- * Called when a media route provider has been added.
- *
- * @param router The media router reporting the event.
- * @param provider The provider that has become available for use.
- */
- public void onProviderAdded(MediaRouter router, ProviderInfo provider) {
- }
-
- /**
- * Called when a media route provider has been removed.
- *
- * @param router The media router reporting the event.
- * @param provider The provider that has been removed from availability.
- */
- public void onProviderRemoved(MediaRouter router, ProviderInfo provider) {
- }
-
- /**
- * Called when a property of the indicated media route provider has changed.
- *
- * @param router The media router reporting the event.
- * @param provider The provider that was changed.
- */
- public void onProviderChanged(MediaRouter router, ProviderInfo provider) {
- }
- }
-
- /**
- * Callback which is invoked with the result of a media control request.
- *
- * @see RouteInfo#sendControlRequest
- */
- public static abstract class ControlRequestCallback {
- /**
- * Called when a media control request succeeds.
- *
- * @param data Result data, or null if none.
- * Contents depend on the {@link MediaControlIntent media control action}.
- */
- public void onResult(Bundle data) {
- }
-
- /**
- * Called when a media control request fails.
- *
- * @param error A localized error message which may be shown to the user, or null
- * if the cause of the error is unclear.
- * @param data Error data, or null if none.
- * Contents depend on the {@link MediaControlIntent media control action}.
- */
- public void onError(String error, Bundle data) {
- }
- }
-
- private static final class CallbackRecord {
- public final MediaRouter mRouter;
- public final Callback mCallback;
- public MediaRouteSelector mSelector;
- public int mFlags;
-
- public CallbackRecord(MediaRouter router, Callback callback) {
- mRouter = router;
- mCallback = callback;
- mSelector = MediaRouteSelector.EMPTY;
- }
-
- public boolean filterRouteEvent(RouteInfo route) {
- return (mFlags & CALLBACK_FLAG_UNFILTERED_EVENTS) != 0
- || route.matchesSelector(mSelector);
- }
- }
-
- /**
- * Global state for the media router.
- * <p>
- * Media routes and media route providers are global to the process; their
- * state and the bulk of the media router implementation lives here.
- * </p>
- */
- private static final class GlobalMediaRouter
- implements SystemMediaRouteProvider.SyncCallback,
- RegisteredMediaRouteProviderWatcher.Callback {
- final Context mApplicationContext;
- final ArrayList<WeakReference<MediaRouter>> mRouters = new ArrayList<>();
- private final ArrayList<RouteInfo> mRoutes = new ArrayList<>();
- private final Map<Pair<String, String>, String> mUniqueIdMap = new HashMap<>();
- private final ArrayList<ProviderInfo> mProviders = new ArrayList<>();
- private final ArrayList<RemoteControlClientRecord> mRemoteControlClients =
- new ArrayList<>();
- final RemoteControlClientCompat.PlaybackInfo mPlaybackInfo =
- new RemoteControlClientCompat.PlaybackInfo();
- private final ProviderCallback mProviderCallback = new ProviderCallback();
- final CallbackHandler mCallbackHandler = new CallbackHandler();
- private final DisplayManagerCompat mDisplayManager;
- final SystemMediaRouteProvider mSystemProvider;
- private final boolean mLowRam;
-
- private RegisteredMediaRouteProviderWatcher mRegisteredProviderWatcher;
- private RouteInfo mDefaultRoute;
- private RouteInfo mBluetoothRoute;
- RouteInfo mSelectedRoute;
- private RouteController mSelectedRouteController;
- // A map from route descriptor ID to RouteController for the member routes in the currently
- // selected route group.
- private final Map<String, RouteController> mRouteControllerMap = new HashMap<>();
- private MediaRouteDiscoveryRequest mDiscoveryRequest;
- private MediaSessionRecord mMediaSession;
- MediaSessionCompat mRccMediaSession;
- private MediaSessionCompat mCompatSession;
- private MediaSessionCompat.OnActiveChangeListener mSessionActiveListener =
- new MediaSessionCompat.OnActiveChangeListener() {
- @Override
- public void onActiveChanged() {
- if(mRccMediaSession != null) {
- if (mRccMediaSession.isActive()) {
- addRemoteControlClient(mRccMediaSession.getRemoteControlClient());
- } else {
- removeRemoteControlClient(mRccMediaSession.getRemoteControlClient());
- }
- }
- }
- };
-
- GlobalMediaRouter(Context applicationContext) {
- mApplicationContext = applicationContext;
- mDisplayManager = DisplayManagerCompat.getInstance(applicationContext);
- mLowRam = ActivityManagerCompat.isLowRamDevice(
- (ActivityManager)applicationContext.getSystemService(
- Context.ACTIVITY_SERVICE));
-
- // Add the system media route provider for interoperating with
- // the framework media router. This one is special and receives
- // synchronization messages from the media router.
- mSystemProvider = SystemMediaRouteProvider.obtain(applicationContext, this);
- }
-
- public void start() {
- addProvider(mSystemProvider);
-
- // Start watching for routes published by registered media route
- // provider services.
- mRegisteredProviderWatcher = new RegisteredMediaRouteProviderWatcher(
- mApplicationContext, this);
- mRegisteredProviderWatcher.start();
- }
-
- public MediaRouter getRouter(Context context) {
- MediaRouter router;
- for (int i = mRouters.size(); --i >= 0; ) {
- router = mRouters.get(i).get();
- if (router == null) {
- mRouters.remove(i);
- } else if (router.mContext == context) {
- return router;
- }
- }
- router = new MediaRouter(context);
- mRouters.add(new WeakReference<MediaRouter>(router));
- return router;
- }
-
- public ContentResolver getContentResolver() {
- return mApplicationContext.getContentResolver();
- }
-
- public Context getProviderContext(String packageName) {
- if (packageName.equals(SystemMediaRouteProvider.PACKAGE_NAME)) {
- return mApplicationContext;
- }
- try {
- return mApplicationContext.createPackageContext(
- packageName, Context.CONTEXT_RESTRICTED);
- } catch (NameNotFoundException ex) {
- return null;
- }
- }
-
- public Display getDisplay(int displayId) {
- return mDisplayManager.getDisplay(displayId);
- }
-
- public void sendControlRequest(RouteInfo route,
- Intent intent, ControlRequestCallback callback) {
- if (route == mSelectedRoute && mSelectedRouteController != null) {
- if (mSelectedRouteController.onControlRequest(intent, callback)) {
- return;
- }
- }
- if (callback != null) {
- callback.onError(null, null);
- }
- }
-
- public void requestSetVolume(RouteInfo route, int volume) {
- if (route == mSelectedRoute && mSelectedRouteController != null) {
- mSelectedRouteController.onSetVolume(volume);
- } else if (!mRouteControllerMap.isEmpty()) {
- RouteController controller = mRouteControllerMap.get(route.mDescriptorId);
- if (controller != null) {
- controller.onSetVolume(volume);
- }
- }
- }
-
- public void requestUpdateVolume(RouteInfo route, int delta) {
- if (route == mSelectedRoute && mSelectedRouteController != null) {
- mSelectedRouteController.onUpdateVolume(delta);
- }
- }
-
- public RouteInfo getRoute(String uniqueId) {
- for (RouteInfo info : mRoutes) {
- if (info.mUniqueId.equals(uniqueId)) {
- return info;
- }
- }
- return null;
- }
-
- public List<RouteInfo> getRoutes() {
- return mRoutes;
- }
-
- List<ProviderInfo> getProviders() {
- return mProviders;
- }
-
- @NonNull RouteInfo getDefaultRoute() {
- if (mDefaultRoute == null) {
- // This should never happen once the media router has been fully
- // initialized but it is good to check for the error in case there
- // is a bug in provider initialization.
- throw new IllegalStateException("There is no default route. "
- + "The media router has not yet been fully initialized.");
- }
- return mDefaultRoute;
- }
-
- RouteInfo getBluetoothRoute() {
- return mBluetoothRoute;
- }
-
- @NonNull RouteInfo getSelectedRoute() {
- if (mSelectedRoute == null) {
- // This should never happen once the media router has been fully
- // initialized but it is good to check for the error in case there
- // is a bug in provider initialization.
- throw new IllegalStateException("There is no currently selected route. "
- + "The media router has not yet been fully initialized.");
- }
- return mSelectedRoute;
- }
-
- void selectRoute(@NonNull RouteInfo route) {
- selectRoute(route, MediaRouter.UNSELECT_REASON_ROUTE_CHANGED);
- }
-
- void selectRoute(@NonNull RouteInfo route, int unselectReason) {
- if (!mRoutes.contains(route)) {
- Log.w(TAG, "Ignoring attempt to select removed route: " + route);
- return;
- }
- if (!route.mEnabled) {
- Log.w(TAG, "Ignoring attempt to select disabled route: " + route);
- return;
- }
- setSelectedRouteInternal(route, unselectReason);
- }
-
- public boolean isRouteAvailable(MediaRouteSelector selector, int flags) {
- if (selector.isEmpty()) {
- return false;
- }
-
- // On low-RAM devices, do not rely on actual discovery results unless asked to.
- if ((flags & AVAILABILITY_FLAG_REQUIRE_MATCH) == 0 && mLowRam) {
- return true;
- }
-
- // Check whether any existing routes match the selector.
- final int routeCount = mRoutes.size();
- for (int i = 0; i < routeCount; i++) {
- RouteInfo route = mRoutes.get(i);
- if ((flags & AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE) != 0
- && route.isDefaultOrBluetooth()) {
- continue;
- }
- if (route.matchesSelector(selector)) {
- return true;
- }
- }
-
- // It doesn't look like we can find a matching route right now.
- return false;
- }
-
- public void updateDiscoveryRequest() {
- // Combine all of the callback selectors and active scan flags.
- boolean discover = false;
- boolean activeScan = false;
- MediaRouteSelector.Builder builder = new MediaRouteSelector.Builder();
- for (int i = mRouters.size(); --i >= 0; ) {
- MediaRouter router = mRouters.get(i).get();
- if (router == null) {
- mRouters.remove(i);
- } else {
- final int count = router.mCallbackRecords.size();
- for (int j = 0; j < count; j++) {
- CallbackRecord callback = router.mCallbackRecords.get(j);
- builder.addSelector(callback.mSelector);
- if ((callback.mFlags & CALLBACK_FLAG_PERFORM_ACTIVE_SCAN) != 0) {
- activeScan = true;
- discover = true; // perform active scan implies request discovery
- }
- if ((callback.mFlags & CALLBACK_FLAG_REQUEST_DISCOVERY) != 0) {
- if (!mLowRam) {
- discover = true;
- }
- }
- if ((callback.mFlags & CALLBACK_FLAG_FORCE_DISCOVERY) != 0) {
- discover = true;
- }
- }
- }
- }
- MediaRouteSelector selector = discover ? builder.build() : MediaRouteSelector.EMPTY;
-
- // Create a new discovery request.
- if (mDiscoveryRequest != null
- && mDiscoveryRequest.getSelector().equals(selector)
- && mDiscoveryRequest.isActiveScan() == activeScan) {
- return; // no change
- }
- if (selector.isEmpty() && !activeScan) {
- // Discovery is not needed.
- if (mDiscoveryRequest == null) {
- return; // no change
- }
- mDiscoveryRequest = null;
- } else {
- // Discovery is needed.
- mDiscoveryRequest = new MediaRouteDiscoveryRequest(selector, activeScan);
- }
- if (DEBUG) {
- Log.d(TAG, "Updated discovery request: " + mDiscoveryRequest);
- }
- if (discover && !activeScan && mLowRam) {
- Log.i(TAG, "Forcing passive route discovery on a low-RAM device, "
- + "system performance may be affected. Please consider using "
- + "CALLBACK_FLAG_REQUEST_DISCOVERY instead of "
- + "CALLBACK_FLAG_FORCE_DISCOVERY.");
- }
-
- // Notify providers.
- final int providerCount = mProviders.size();
- for (int i = 0; i < providerCount; i++) {
- mProviders.get(i).mProviderInstance.setDiscoveryRequest(mDiscoveryRequest);
- }
- }
-
- @Override
- public void addProvider(MediaRouteProvider providerInstance) {
- int index = findProviderInfo(providerInstance);
- if (index < 0) {
- // 1. Add the provider to the list.
- ProviderInfo provider = new ProviderInfo(providerInstance);
- mProviders.add(provider);
- if (DEBUG) {
- Log.d(TAG, "Provider added: " + provider);
- }
- mCallbackHandler.post(CallbackHandler.MSG_PROVIDER_ADDED, provider);
- // 2. Create the provider's contents.
- updateProviderContents(provider, providerInstance.getDescriptor());
- // 3. Register the provider callback.
- providerInstance.setCallback(mProviderCallback);
- // 4. Set the discovery request.
- providerInstance.setDiscoveryRequest(mDiscoveryRequest);
- }
- }
-
- @Override
- public void removeProvider(MediaRouteProvider providerInstance) {
- int index = findProviderInfo(providerInstance);
- if (index >= 0) {
- // 1. Unregister the provider callback.
- providerInstance.setCallback(null);
- // 2. Clear the discovery request.
- providerInstance.setDiscoveryRequest(null);
- // 3. Delete the provider's contents.
- ProviderInfo provider = mProviders.get(index);
- updateProviderContents(provider, null);
- // 4. Remove the provider from the list.
- if (DEBUG) {
- Log.d(TAG, "Provider removed: " + provider);
- }
- mCallbackHandler.post(CallbackHandler.MSG_PROVIDER_REMOVED, provider);
- mProviders.remove(index);
- }
- }
-
- void updateProviderDescriptor(MediaRouteProvider providerInstance,
- MediaRouteProviderDescriptor descriptor) {
- int index = findProviderInfo(providerInstance);
- if (index >= 0) {
- // Update the provider's contents.
- ProviderInfo provider = mProviders.get(index);
- updateProviderContents(provider, descriptor);
- }
- }
-
- private int findProviderInfo(MediaRouteProvider providerInstance) {
- final int count = mProviders.size();
- for (int i = 0; i < count; i++) {
- if (mProviders.get(i).mProviderInstance == providerInstance) {
- return i;
- }
- }
- return -1;
- }
-
- private void updateProviderContents(ProviderInfo provider,
- MediaRouteProviderDescriptor providerDescriptor) {
- if (provider.updateDescriptor(providerDescriptor)) {
- // Update all existing routes and reorder them to match
- // the order of their descriptors.
- int targetIndex = 0;
- boolean selectedRouteDescriptorChanged = false;
- if (providerDescriptor != null) {
- if (providerDescriptor.isValid()) {
- final List<MediaRouteDescriptor> routeDescriptors =
- providerDescriptor.getRoutes();
- final int routeCount = routeDescriptors.size();
- // Updating route group's contents requires all member routes' information.
- // Add the groups to the lists and update them later.
- List<Pair<RouteInfo, MediaRouteDescriptor>> addedGroups = new ArrayList<>();
- List<Pair<RouteInfo, MediaRouteDescriptor>> updatedGroups =
- new ArrayList<>();
- for (int i = 0; i < routeCount; i++) {
- final MediaRouteDescriptor routeDescriptor = routeDescriptors.get(i);
- final String id = routeDescriptor.getId();
- final int sourceIndex = provider.findRouteByDescriptorId(id);
- if (sourceIndex < 0) {
- // 1. Add the route to the list.
- String uniqueId = assignRouteUniqueId(provider, id);
- boolean isGroup = routeDescriptor.getGroupMemberIds() != null;
- RouteInfo route = isGroup ? new RouteGroup(provider, id, uniqueId) :
- new RouteInfo(provider, id, uniqueId);
- provider.mRoutes.add(targetIndex++, route);
- mRoutes.add(route);
- // 2. Create the route's contents.
- if (isGroup) {
- addedGroups.add(new Pair<>(route, routeDescriptor));
- } else {
- route.maybeUpdateDescriptor(routeDescriptor);
- // 3. Notify clients about addition.
- if (DEBUG) {
- Log.d(TAG, "Route added: " + route);
- }
- mCallbackHandler.post(CallbackHandler.MSG_ROUTE_ADDED, route);
- }
-
- } else if (sourceIndex < targetIndex) {
- Log.w(TAG, "Ignoring route descriptor with duplicate id: "
- + routeDescriptor);
- } else {
- // 1. Reorder the route within the list.
- RouteInfo route = provider.mRoutes.get(sourceIndex);
- Collections.swap(provider.mRoutes,
- sourceIndex, targetIndex++);
- // 2. Update the route's contents.
- if (route instanceof RouteGroup) {
- updatedGroups.add(new Pair<>(route, routeDescriptor));
- } else {
- // 3. Notify clients about changes.
- if (updateRouteDescriptorAndNotify(route, routeDescriptor)
- != 0) {
- if (route == mSelectedRoute) {
- selectedRouteDescriptorChanged = true;
- }
- }
- }
- }
- }
- // Update the new and/or existing groups.
- for (Pair<RouteInfo, MediaRouteDescriptor> pair : addedGroups) {
- RouteInfo route = pair.first;
- route.maybeUpdateDescriptor(pair.second);
- if (DEBUG) {
- Log.d(TAG, "Route added: " + route);
- }
- mCallbackHandler.post(CallbackHandler.MSG_ROUTE_ADDED, route);
- }
- for (Pair<RouteInfo, MediaRouteDescriptor> pair : updatedGroups) {
- RouteInfo route = pair.first;
- if (updateRouteDescriptorAndNotify(route, pair.second) != 0) {
- if (route == mSelectedRoute) {
- selectedRouteDescriptorChanged = true;
- }
- }
- }
- } else {
- Log.w(TAG, "Ignoring invalid provider descriptor: " + providerDescriptor);
- }
- }
-
- // Dispose all remaining routes that do not have matching descriptors.
- for (int i = provider.mRoutes.size() - 1; i >= targetIndex; i--) {
- // 1. Delete the route's contents.
- RouteInfo route = provider.mRoutes.get(i);
- route.maybeUpdateDescriptor(null);
- // 2. Remove the route from the list.
- mRoutes.remove(route);
- }
-
- // Update the selected route if needed.
- updateSelectedRouteIfNeeded(selectedRouteDescriptorChanged);
-
- // Now notify clients about routes that were removed.
- // We do this after updating the selected route to ensure
- // that the framework media router observes the new route
- // selection before the removal since removing the currently
- // selected route may have side-effects.
- for (int i = provider.mRoutes.size() - 1; i >= targetIndex; i--) {
- RouteInfo route = provider.mRoutes.remove(i);
- if (DEBUG) {
- Log.d(TAG, "Route removed: " + route);
- }
- mCallbackHandler.post(CallbackHandler.MSG_ROUTE_REMOVED, route);
- }
-
- // Notify provider changed.
- if (DEBUG) {
- Log.d(TAG, "Provider changed: " + provider);
- }
- mCallbackHandler.post(CallbackHandler.MSG_PROVIDER_CHANGED, provider);
- }
- }
-
- private int updateRouteDescriptorAndNotify(RouteInfo route,
- MediaRouteDescriptor routeDescriptor) {
- int changes = route.maybeUpdateDescriptor(routeDescriptor);
- if (changes != 0) {
- if ((changes & RouteInfo.CHANGE_GENERAL) != 0) {
- if (DEBUG) {
- Log.d(TAG, "Route changed: " + route);
- }
- mCallbackHandler.post(
- CallbackHandler.MSG_ROUTE_CHANGED, route);
- }
- if ((changes & RouteInfo.CHANGE_VOLUME) != 0) {
- if (DEBUG) {
- Log.d(TAG, "Route volume changed: " + route);
- }
- mCallbackHandler.post(
- CallbackHandler.MSG_ROUTE_VOLUME_CHANGED, route);
- }
- if ((changes & RouteInfo.CHANGE_PRESENTATION_DISPLAY) != 0) {
- if (DEBUG) {
- Log.d(TAG, "Route presentation display changed: "
- + route);
- }
- mCallbackHandler.post(CallbackHandler.
- MSG_ROUTE_PRESENTATION_DISPLAY_CHANGED, route);
- }
- }
- return changes;
- }
-
- private String assignRouteUniqueId(ProviderInfo provider, String routeDescriptorId) {
- // Although route descriptor ids are unique within a provider, it's
- // possible for there to be two providers with the same package name.
- // Therefore we must dedupe the composite id.
- String componentName = provider.getComponentName().flattenToShortString();
- String uniqueId = componentName + ":" + routeDescriptorId;
- if (findRouteByUniqueId(uniqueId) < 0) {
- mUniqueIdMap.put(new Pair<>(componentName, routeDescriptorId), uniqueId);
- return uniqueId;
- }
- Log.w(TAG, "Either " + routeDescriptorId + " isn't unique in " + componentName
- + " or we're trying to assign a unique ID for an already added route");
- for (int i = 2; ; i++) {
- String newUniqueId = String.format(Locale.US, "%s_%d", uniqueId, i);
- if (findRouteByUniqueId(newUniqueId) < 0) {
- mUniqueIdMap.put(new Pair<>(componentName, routeDescriptorId), newUniqueId);
- return newUniqueId;
- }
- }
- }
-
- private int findRouteByUniqueId(String uniqueId) {
- final int count = mRoutes.size();
- for (int i = 0; i < count; i++) {
- if (mRoutes.get(i).mUniqueId.equals(uniqueId)) {
- return i;
- }
- }
- return -1;
- }
-
- private String getUniqueId(ProviderInfo provider, String routeDescriptorId) {
- String componentName = provider.getComponentName().flattenToShortString();
- return mUniqueIdMap.get(new Pair<>(componentName, routeDescriptorId));
- }
-
- private void updateSelectedRouteIfNeeded(boolean selectedRouteDescriptorChanged) {
- // Update default route.
- if (mDefaultRoute != null && !mDefaultRoute.isSelectable()) {
- Log.i(TAG, "Clearing the default route because it "
- + "is no longer selectable: " + mDefaultRoute);
- mDefaultRoute = null;
- }
- if (mDefaultRoute == null && !mRoutes.isEmpty()) {
- for (RouteInfo route : mRoutes) {
- if (isSystemDefaultRoute(route) && route.isSelectable()) {
- mDefaultRoute = route;
- Log.i(TAG, "Found default route: " + mDefaultRoute);
- break;
- }
- }
- }
-
- // Update bluetooth route.
- if (mBluetoothRoute != null && !mBluetoothRoute.isSelectable()) {
- Log.i(TAG, "Clearing the bluetooth route because it "
- + "is no longer selectable: " + mBluetoothRoute);
- mBluetoothRoute = null;
- }
- if (mBluetoothRoute == null && !mRoutes.isEmpty()) {
- for (RouteInfo route : mRoutes) {
- if (isSystemLiveAudioOnlyRoute(route) && route.isSelectable()) {
- mBluetoothRoute = route;
- Log.i(TAG, "Found bluetooth route: " + mBluetoothRoute);
- break;
- }
- }
- }
-
- // Update selected route.
- if (mSelectedRoute == null || !mSelectedRoute.isSelectable()) {
- Log.i(TAG, "Unselecting the current route because it "
- + "is no longer selectable: " + mSelectedRoute);
- setSelectedRouteInternal(chooseFallbackRoute(),
- MediaRouter.UNSELECT_REASON_UNKNOWN);
- } else if (selectedRouteDescriptorChanged) {
- // In case the selected route is a route group, select/unselect route controllers
- // for the added/removed route members.
- if (mSelectedRoute instanceof RouteGroup) {
- List<RouteInfo> routes = ((RouteGroup) mSelectedRoute).getRoutes();
- // Build a set of descriptor IDs for the new route group.
- Set<String> idSet = new HashSet<>();
- for (RouteInfo route : routes) {
- idSet.add(route.mDescriptorId);
- }
- // Unselect route controllers for the removed routes.
- Iterator<Map.Entry<String, RouteController>> iter =
- mRouteControllerMap.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry<String, RouteController> entry = iter.next();
- if (!idSet.contains(entry.getKey())) {
- RouteController controller = entry.getValue();
- controller.onUnselect();
- controller.onRelease();
- iter.remove();
- }
- }
- // Select route controllers for the added routes.
- for (RouteInfo route : routes) {
- if (!mRouteControllerMap.containsKey(route.mDescriptorId)) {
- RouteController controller = route.getProviderInstance()
- .onCreateRouteController(
- route.mDescriptorId, mSelectedRoute.mDescriptorId);
- controller.onSelect();
- mRouteControllerMap.put(route.mDescriptorId, controller);
- }
- }
- }
- // Update the playback info because the properties of the route have changed.
- updatePlaybackInfoFromSelectedRoute();
- }
- }
-
- RouteInfo chooseFallbackRoute() {
- // When the current route is removed or no longer selectable,
- // we want to revert to a live audio route if there is
- // one (usually Bluetooth A2DP). Failing that, use
- // the default route.
- for (RouteInfo route : mRoutes) {
- if (route != mDefaultRoute
- && isSystemLiveAudioOnlyRoute(route)
- && route.isSelectable()) {
- return route;
- }
- }
- return mDefaultRoute;
- }
-
- private boolean isSystemLiveAudioOnlyRoute(RouteInfo route) {
- return route.getProviderInstance() == mSystemProvider
- && route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
- && !route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
- }
-
- private boolean isSystemDefaultRoute(RouteInfo route) {
- return route.getProviderInstance() == mSystemProvider
- && route.mDescriptorId.equals(
- SystemMediaRouteProvider.DEFAULT_ROUTE_ID);
- }
-
- private void setSelectedRouteInternal(@NonNull RouteInfo route, int unselectReason) {
- // TODO: Remove the following logging when no longer needed.
- if (sGlobal == null || (mBluetoothRoute != null && route.isDefault())) {
- final StackTraceElement[] callStack = Thread.currentThread().getStackTrace();
- StringBuilder sb = new StringBuilder();
- // callStack[3] is the caller of this method.
- for (int i = 3; i < callStack.length; i++) {
- StackTraceElement caller = callStack[i];
- sb.append(caller.getClassName())
- .append(".")
- .append(caller.getMethodName())
- .append(":")
- .append(caller.getLineNumber())
- .append(" ");
- }
- if (sGlobal == null) {
- Log.w(TAG, "setSelectedRouteInternal is called while sGlobal is null: pkgName="
- + mApplicationContext.getPackageName() + ", callers=" + sb.toString());
- } else {
- Log.w(TAG, "Default route is selected while a BT route is available: pkgName="
- + mApplicationContext.getPackageName() + ", callers=" + sb.toString());
- }
- }
-
- if (mSelectedRoute != route) {
- if (mSelectedRoute != null) {
- if (DEBUG) {
- Log.d(TAG, "Route unselected: " + mSelectedRoute + " reason: "
- + unselectReason);
- }
- mCallbackHandler.post(CallbackHandler.MSG_ROUTE_UNSELECTED, mSelectedRoute,
- unselectReason);
- if (mSelectedRouteController != null) {
- mSelectedRouteController.onUnselect(unselectReason);
- mSelectedRouteController.onRelease();
- mSelectedRouteController = null;
- }
- if (!mRouteControllerMap.isEmpty()) {
- for (RouteController controller : mRouteControllerMap.values()) {
- controller.onUnselect(unselectReason);
- controller.onRelease();
- }
- mRouteControllerMap.clear();
- }
- }
-
- mSelectedRoute = route;
- mSelectedRouteController = route.getProviderInstance().onCreateRouteController(
- route.mDescriptorId);
- if (mSelectedRouteController != null) {
- mSelectedRouteController.onSelect();
- }
- if (DEBUG) {
- Log.d(TAG, "Route selected: " + mSelectedRoute);
- }
- mCallbackHandler.post(CallbackHandler.MSG_ROUTE_SELECTED, mSelectedRoute);
-
- if (mSelectedRoute instanceof RouteGroup) {
- List<RouteInfo> routes = ((RouteGroup) mSelectedRoute).getRoutes();
- mRouteControllerMap.clear();
- for (RouteInfo r : routes) {
- RouteController controller =
- r.getProviderInstance().onCreateRouteController(
- r.mDescriptorId, mSelectedRoute.mDescriptorId);
- controller.onSelect();
- mRouteControllerMap.put(r.mDescriptorId, controller);
- }
- }
-
- updatePlaybackInfoFromSelectedRoute();
- }
- }
-
- @Override
- public void onSystemRouteSelectedByDescriptorId(String id) {
- // System route is selected, do not sync the route we selected before.
- mCallbackHandler.removeMessages(CallbackHandler.MSG_ROUTE_SELECTED);
- int providerIndex = findProviderInfo(mSystemProvider);
- if (providerIndex >= 0) {
- ProviderInfo provider = mProviders.get(providerIndex);
- int routeIndex = provider.findRouteByDescriptorId(id);
- if (routeIndex >= 0) {
- provider.mRoutes.get(routeIndex).select();
- }
- }
- }
-
- public void addRemoteControlClient(Object rcc) {
- int index = findRemoteControlClientRecord(rcc);
- if (index < 0) {
- RemoteControlClientRecord record = new RemoteControlClientRecord(rcc);
- mRemoteControlClients.add(record);
- }
- }
-
- public void removeRemoteControlClient(Object rcc) {
- int index = findRemoteControlClientRecord(rcc);
- if (index >= 0) {
- RemoteControlClientRecord record = mRemoteControlClients.remove(index);
- record.disconnect();
- }
- }
-
- public void setMediaSession(Object session) {
- setMediaSessionRecord(session != null ? new MediaSessionRecord(session) : null);
- }
-
- public void setMediaSessionCompat(final MediaSessionCompat session) {
- mCompatSession = session;
- if (android.os.Build.VERSION.SDK_INT >= 21) {
- setMediaSessionRecord(session != null ? new MediaSessionRecord(session) : null);
- } else if (android.os.Build.VERSION.SDK_INT >= 14) {
- if (mRccMediaSession != null) {
- removeRemoteControlClient(mRccMediaSession.getRemoteControlClient());
- mRccMediaSession.removeOnActiveChangeListener(mSessionActiveListener);
- }
- mRccMediaSession = session;
- if (session != null) {
- session.addOnActiveChangeListener(mSessionActiveListener);
- if (session.isActive()) {
- addRemoteControlClient(session.getRemoteControlClient());
- }
- }
- }
- }
-
- private void setMediaSessionRecord(MediaSessionRecord mediaSessionRecord) {
- if (mMediaSession != null) {
- mMediaSession.clearVolumeHandling();
- }
- mMediaSession = mediaSessionRecord;
- if (mediaSessionRecord != null) {
- updatePlaybackInfoFromSelectedRoute();
- }
- }
-
- public MediaSessionCompat.Token getMediaSessionToken() {
- if (mMediaSession != null) {
- return mMediaSession.getToken();
- } else if (mCompatSession != null) {
- return mCompatSession.getSessionToken();
- }
- return null;
- }
-
- private int findRemoteControlClientRecord(Object rcc) {
- final int count = mRemoteControlClients.size();
- for (int i = 0; i < count; i++) {
- RemoteControlClientRecord record = mRemoteControlClients.get(i);
- if (record.getRemoteControlClient() == rcc) {
- return i;
- }
- }
- return -1;
- }
-
- private void updatePlaybackInfoFromSelectedRoute() {
- if (mSelectedRoute != null) {
- mPlaybackInfo.volume = mSelectedRoute.getVolume();
- mPlaybackInfo.volumeMax = mSelectedRoute.getVolumeMax();
- mPlaybackInfo.volumeHandling = mSelectedRoute.getVolumeHandling();
- mPlaybackInfo.playbackStream = mSelectedRoute.getPlaybackStream();
- mPlaybackInfo.playbackType = mSelectedRoute.getPlaybackType();
-
- final int count = mRemoteControlClients.size();
- for (int i = 0; i < count; i++) {
- RemoteControlClientRecord record = mRemoteControlClients.get(i);
- record.updatePlaybackInfo();
- }
- if (mMediaSession != null) {
- if (mSelectedRoute == getDefaultRoute()
- || mSelectedRoute == getBluetoothRoute()) {
- // Local route
- mMediaSession.clearVolumeHandling();
- } else {
- @VolumeProviderCompat.ControlType int controlType =
- VolumeProviderCompat.VOLUME_CONTROL_FIXED;
- if (mPlaybackInfo.volumeHandling
- == MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE) {
- controlType = VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE;
- }
- mMediaSession.configureVolume(controlType, mPlaybackInfo.volumeMax,
- mPlaybackInfo.volume);
- }
- }
- } else {
- if (mMediaSession != null) {
- mMediaSession.clearVolumeHandling();
- }
- }
- }
-
- private final class ProviderCallback extends MediaRouteProvider.Callback {
- ProviderCallback() {
- }
-
- @Override
- public void onDescriptorChanged(MediaRouteProvider provider,
- MediaRouteProviderDescriptor descriptor) {
- updateProviderDescriptor(provider, descriptor);
- }
- }
-
- private final class MediaSessionRecord {
- private final MediaSessionCompat mMsCompat;
-
- private @VolumeProviderCompat.ControlType int mControlType;
- private int mMaxVolume;
- private VolumeProviderCompat mVpCompat;
-
- public MediaSessionRecord(Object mediaSession) {
- mMsCompat = MediaSessionCompat.fromMediaSession(mApplicationContext, mediaSession);
- }
-
- public MediaSessionRecord(MediaSessionCompat mediaSessionCompat) {
- mMsCompat = mediaSessionCompat;
- }
-
- public void configureVolume(@VolumeProviderCompat.ControlType int controlType,
- int max, int current) {
- if (mVpCompat != null && controlType == mControlType && max == mMaxVolume) {
- // If we haven't changed control type or max just set the
- // new current volume
- mVpCompat.setCurrentVolume(current);
- } else {
- // Otherwise create a new provider and update
- mVpCompat = new VolumeProviderCompat(controlType, max, current) {
- @Override
- public void onSetVolumeTo(final int volume) {
- mCallbackHandler.post(new Runnable() {
- @Override
- public void run() {
- if (mSelectedRoute != null) {
- mSelectedRoute.requestSetVolume(volume);
- }
- }
- });
- }
-
- @Override
- public void onAdjustVolume(final int direction) {
- mCallbackHandler.post(new Runnable() {
- @Override
- public void run() {
- if (mSelectedRoute != null) {
- mSelectedRoute.requestUpdateVolume(direction);
- }
- }
- });
- }
- };
- mMsCompat.setPlaybackToRemote(mVpCompat);
- }
- }
-
- public void clearVolumeHandling() {
- mMsCompat.setPlaybackToLocal(mPlaybackInfo.playbackStream);
- mVpCompat = null;
- }
-
- public MediaSessionCompat.Token getToken() {
- return mMsCompat.getSessionToken();
- }
- }
-
- private final class RemoteControlClientRecord
- implements RemoteControlClientCompat.VolumeCallback {
- private final RemoteControlClientCompat mRccCompat;
- private boolean mDisconnected;
-
- public RemoteControlClientRecord(Object rcc) {
- mRccCompat = RemoteControlClientCompat.obtain(mApplicationContext, rcc);
- mRccCompat.setVolumeCallback(this);
- updatePlaybackInfo();
- }
-
- public Object getRemoteControlClient() {
- return mRccCompat.getRemoteControlClient();
- }
-
- public void disconnect() {
- mDisconnected = true;
- mRccCompat.setVolumeCallback(null);
- }
-
- public void updatePlaybackInfo() {
- mRccCompat.setPlaybackInfo(mPlaybackInfo);
- }
-
- @Override
- public void onVolumeSetRequest(int volume) {
- if (!mDisconnected && mSelectedRoute != null) {
- mSelectedRoute.requestSetVolume(volume);
- }
- }
-
- @Override
- public void onVolumeUpdateRequest(int direction) {
- if (!mDisconnected && mSelectedRoute != null) {
- mSelectedRoute.requestUpdateVolume(direction);
- }
- }
- }
-
- private final class CallbackHandler extends Handler {
- private final ArrayList<CallbackRecord> mTempCallbackRecords =
- new ArrayList<CallbackRecord>();
-
- private static final int MSG_TYPE_MASK = 0xff00;
- private static final int MSG_TYPE_ROUTE = 0x0100;
- private static final int MSG_TYPE_PROVIDER = 0x0200;
-
- public static final int MSG_ROUTE_ADDED = MSG_TYPE_ROUTE | 1;
- public static final int MSG_ROUTE_REMOVED = MSG_TYPE_ROUTE | 2;
- public static final int MSG_ROUTE_CHANGED = MSG_TYPE_ROUTE | 3;
- public static final int MSG_ROUTE_VOLUME_CHANGED = MSG_TYPE_ROUTE | 4;
- public static final int MSG_ROUTE_PRESENTATION_DISPLAY_CHANGED = MSG_TYPE_ROUTE | 5;
- public static final int MSG_ROUTE_SELECTED = MSG_TYPE_ROUTE | 6;
- public static final int MSG_ROUTE_UNSELECTED = MSG_TYPE_ROUTE | 7;
-
- public static final int MSG_PROVIDER_ADDED = MSG_TYPE_PROVIDER | 1;
- public static final int MSG_PROVIDER_REMOVED = MSG_TYPE_PROVIDER | 2;
- public static final int MSG_PROVIDER_CHANGED = MSG_TYPE_PROVIDER | 3;
-
- CallbackHandler() {
- }
-
- public void post(int msg, Object obj) {
- obtainMessage(msg, obj).sendToTarget();
- }
-
- public void post(int msg, Object obj, int arg) {
- Message message = obtainMessage(msg, obj);
- message.arg1 = arg;
- message.sendToTarget();
- }
-
- @Override
- public void handleMessage(Message msg) {
- final int what = msg.what;
- final Object obj = msg.obj;
- final int arg = msg.arg1;
-
- if (what == MSG_ROUTE_CHANGED
- && getSelectedRoute().getId().equals(((RouteInfo) obj).getId())) {
- updateSelectedRouteIfNeeded(true);
- }
-
- // Synchronize state with the system media router.
- syncWithSystemProvider(what, obj);
-
- // Invoke all registered callbacks.
- // Build a list of callbacks before invoking them in case callbacks
- // are added or removed during dispatch.
- try {
- for (int i = mRouters.size(); --i >= 0; ) {
- MediaRouter router = mRouters.get(i).get();
- if (router == null) {
- mRouters.remove(i);
- } else {
- mTempCallbackRecords.addAll(router.mCallbackRecords);
- }
- }
-
- final int callbackCount = mTempCallbackRecords.size();
- for (int i = 0; i < callbackCount; i++) {
- invokeCallback(mTempCallbackRecords.get(i), what, obj, arg);
- }
- } finally {
- mTempCallbackRecords.clear();
- }
- }
-
- private void syncWithSystemProvider(int what, Object obj) {
- switch (what) {
- case MSG_ROUTE_ADDED:
- mSystemProvider.onSyncRouteAdded((RouteInfo) obj);
- break;
- case MSG_ROUTE_REMOVED:
- mSystemProvider.onSyncRouteRemoved((RouteInfo) obj);
- break;
- case MSG_ROUTE_CHANGED:
- mSystemProvider.onSyncRouteChanged((RouteInfo) obj);
- break;
- case MSG_ROUTE_SELECTED:
- mSystemProvider.onSyncRouteSelected((RouteInfo) obj);
- break;
- }
- }
-
- private void invokeCallback(CallbackRecord record, int what, Object obj, int arg) {
- final MediaRouter router = record.mRouter;
- final MediaRouter.Callback callback = record.mCallback;
- switch (what & MSG_TYPE_MASK) {
- case MSG_TYPE_ROUTE: {
- final RouteInfo route = (RouteInfo)obj;
- if (!record.filterRouteEvent(route)) {
- break;
- }
- switch (what) {
- case MSG_ROUTE_ADDED:
- callback.onRouteAdded(router, route);
- break;
- case MSG_ROUTE_REMOVED:
- callback.onRouteRemoved(router, route);
- break;
- case MSG_ROUTE_CHANGED:
- callback.onRouteChanged(router, route);
- break;
- case MSG_ROUTE_VOLUME_CHANGED:
- callback.onRouteVolumeChanged(router, route);
- break;
- case MSG_ROUTE_PRESENTATION_DISPLAY_CHANGED:
- callback.onRoutePresentationDisplayChanged(router, route);
- break;
- case MSG_ROUTE_SELECTED:
- callback.onRouteSelected(router, route);
- break;
- case MSG_ROUTE_UNSELECTED:
- callback.onRouteUnselected(router, route, arg);
- break;
- }
- break;
- }
- case MSG_TYPE_PROVIDER: {
- final ProviderInfo provider = (ProviderInfo)obj;
- switch (what) {
- case MSG_PROVIDER_ADDED:
- callback.onProviderAdded(router, provider);
- break;
- case MSG_PROVIDER_REMOVED:
- callback.onProviderRemoved(router, provider);
- break;
- case MSG_PROVIDER_CHANGED:
- callback.onProviderChanged(router, provider);
- break;
- }
- }
- }
- }
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaSessionStatus.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaSessionStatus.java
deleted file mode 100644
index 0e7514c..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/MediaSessionStatus.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.app.PendingIntent;
-import android.os.Bundle;
-import android.os.SystemClock;
-
-import androidx.core.util.TimeUtils;
-
-/**
- * Describes the playback status of a media session.
- * <p>
- * This class is part of the remote playback protocol described by the
- * {@link MediaControlIntent MediaControlIntent} class.
- * </p><p>
- * When a media session is created, it is initially in the
- * {@link #SESSION_STATE_ACTIVE active} state. When the media session ends
- * normally, it transitions to the {@link #SESSION_STATE_ENDED ended} state.
- * If the media session is invalidated due to another session forcibly taking
- * control of the route, then it transitions to the
- * {@link #SESSION_STATE_INVALIDATED invalidated} state.
- * Refer to the documentation of each state for an explanation of its meaning.
- * </p><p>
- * To monitor session status, the application should supply a {@link PendingIntent} to use as the
- * {@link MediaControlIntent#EXTRA_SESSION_STATUS_UPDATE_RECEIVER session status update receiver}
- * for a given {@link MediaControlIntent#ACTION_START_SESSION session start request}.
- * </p><p>
- * This object is immutable once created using a {@link Builder} instance.
- * </p>
- */
-public final class MediaSessionStatus {
- static final String KEY_TIMESTAMP = "timestamp";
- static final String KEY_SESSION_STATE = "sessionState";
- static final String KEY_QUEUE_PAUSED = "queuePaused";
- static final String KEY_EXTRAS = "extras";
-
- final Bundle mBundle;
-
- /**
- * Session state: Active.
- * <p>
- * Indicates that the media session is active and in control of the route.
- * </p>
- */
- public static final int SESSION_STATE_ACTIVE = 0;
-
- /**
- * Session state: Ended.
- * <p>
- * Indicates that the media session was ended normally using the
- * {@link MediaControlIntent#ACTION_END_SESSION end session} action.
- * </p><p>
- * A terminated media session cannot be used anymore. To play more media, the
- * application must start a new session.
- * </p>
- */
- public static final int SESSION_STATE_ENDED = 1;
-
- /**
- * Session state: Invalidated.
- * <p>
- * Indicates that the media session was invalidated involuntarily due to
- * another session taking control of the route.
- * </p><p>
- * An invalidated media session cannot be used anymore. To play more media, the
- * application must start a new session.
- * </p>
- */
- public static final int SESSION_STATE_INVALIDATED = 2;
-
- MediaSessionStatus(Bundle bundle) {
- mBundle = bundle;
- }
-
- /**
- * Gets the timestamp associated with the status information in
- * milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base.
- *
- * @return The status timestamp in the {@link SystemClock#elapsedRealtime()} time base.
- */
- public long getTimestamp() {
- return mBundle.getLong(KEY_TIMESTAMP);
- }
-
- /**
- * Gets the session state.
- *
- * @return The session state. One of {@link #SESSION_STATE_ACTIVE},
- * {@link #SESSION_STATE_ENDED}, or {@link #SESSION_STATE_INVALIDATED}.
- */
- public int getSessionState() {
- return mBundle.getInt(KEY_SESSION_STATE, SESSION_STATE_INVALIDATED);
- }
-
- /**
- * Returns true if the session's queue is paused.
- *
- * @return True if the session's queue is paused.
- */
- public boolean isQueuePaused() {
- return mBundle.getBoolean(KEY_QUEUE_PAUSED);
- }
-
- /**
- * Gets a bundle of extras for this status object.
- * The extras will be ignored by the media router but they may be used
- * by applications.
- */
- public Bundle getExtras() {
- return mBundle.getBundle(KEY_EXTRAS);
- }
-
- @Override
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append("MediaSessionStatus{ ");
- result.append("timestamp=");
- TimeUtils.formatDuration(SystemClock.elapsedRealtime() - getTimestamp(), result);
- result.append(" ms ago");
- result.append(", sessionState=").append(sessionStateToString(getSessionState()));
- result.append(", queuePaused=").append(isQueuePaused());
- result.append(", extras=").append(getExtras());
- result.append(" }");
- return result.toString();
- }
-
- private static String sessionStateToString(int sessionState) {
- switch (sessionState) {
- case SESSION_STATE_ACTIVE:
- return "active";
- case SESSION_STATE_ENDED:
- return "ended";
- case SESSION_STATE_INVALIDATED:
- return "invalidated";
- }
- return Integer.toString(sessionState);
- }
-
- /**
- * Converts this object to a bundle for serialization.
- *
- * @return The contents of the object represented as a bundle.
- */
- public Bundle asBundle() {
- return mBundle;
- }
-
- /**
- * Creates an instance from a bundle.
- *
- * @param bundle The bundle, or null if none.
- * @return The new instance, or null if the bundle was null.
- */
- public static MediaSessionStatus fromBundle(Bundle bundle) {
- return bundle != null ? new MediaSessionStatus(bundle) : null;
- }
-
- /**
- * Builder for {@link MediaSessionStatus media session status objects}.
- */
- public static final class Builder {
- private final Bundle mBundle;
-
- /**
- * Creates a media session status builder using the current time as the
- * reference timestamp.
- *
- * @param sessionState The session state.
- */
- public Builder(int sessionState) {
- mBundle = new Bundle();
- setTimestamp(SystemClock.elapsedRealtime());
- setSessionState(sessionState);
- }
-
- /**
- * Creates a media session status builder whose initial contents are
- * copied from an existing status.
- */
- public Builder(MediaSessionStatus status) {
- if (status == null) {
- throw new IllegalArgumentException("status must not be null");
- }
-
- mBundle = new Bundle(status.mBundle);
- }
-
- /**
- * Sets the timestamp associated with the status information in
- * milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base.
- */
- public Builder setTimestamp(long elapsedRealtimeTimestamp) {
- mBundle.putLong(KEY_TIMESTAMP, elapsedRealtimeTimestamp);
- return this;
- }
-
- /**
- * Sets the session state.
- */
- public Builder setSessionState(int sessionState) {
- mBundle.putInt(KEY_SESSION_STATE, sessionState);
- return this;
- }
-
- /**
- * Sets whether the queue is paused.
- */
- public Builder setQueuePaused(boolean queuePaused) {
- mBundle.putBoolean(KEY_QUEUE_PAUSED, queuePaused);
- return this;
- }
-
- /**
- * Sets a bundle of extras for this status object.
- * The extras will be ignored by the media router but they may be used
- * by applications.
- */
- public Builder setExtras(Bundle extras) {
- mBundle.putBundle(KEY_EXTRAS, extras);
- return this;
- }
-
- /**
- * Builds the {@link MediaSessionStatus media session status object}.
- */
- public MediaSessionStatus build() {
- return new MediaSessionStatus(mBundle);
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/RegisteredMediaRouteProvider.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/RegisteredMediaRouteProvider.java
deleted file mode 100644
index eacf1c8..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/RegisteredMediaRouteProvider.java
+++ /dev/null
@@ -1,746 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_DATA_ROUTE_ID;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_DATA_ROUTE_LIBRARY_GROUP;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_DATA_UNSELECT_REASON;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_DATA_VOLUME;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_CREATE_ROUTE_CONTROLLER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.CLIENT_MSG_REGISTER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_RELEASE_ROUTE_CONTROLLER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_ROUTE_CONTROL_REQUEST;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_SELECT_ROUTE;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_SET_DISCOVERY_REQUEST;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_SET_ROUTE_VOLUME;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_UNREGISTER;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_UNSELECT_ROUTE;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_MSG_UPDATE_ROUTE_VOLUME;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .CLIENT_VERSION_CURRENT;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.SERVICE_DATA_ERROR;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_CONTROL_REQUEST_FAILED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_CONTROL_REQUEST_SUCCEEDED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_DESCRIPTOR_CHANGED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_GENERIC_FAILURE;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_GENERIC_SUCCESS;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .SERVICE_MSG_REGISTERED;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol.SERVICE_VERSION_1;
-import static com.android.support.mediarouter.media.MediaRouteProviderProtocol
- .isValidRemoteMessenger;
-
-import android.annotation.NonNull;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Bundle;
-import android.os.DeadObjectException;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.IBinder.DeathRecipient;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.RemoteException;
-import android.util.Log;
-import android.util.SparseArray;
-
-import com.android.support.mediarouter.media.MediaRouter.ControlRequestCallback;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Maintains a connection to a particular media route provider service.
- */
-final class RegisteredMediaRouteProvider extends MediaRouteProvider
- implements ServiceConnection {
- static final String TAG = "MediaRouteProviderProxy"; // max. 23 chars
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- private final ComponentName mComponentName;
- final PrivateHandler mPrivateHandler;
- private final ArrayList<Controller> mControllers = new ArrayList<Controller>();
-
- private boolean mStarted;
- private boolean mBound;
- private Connection mActiveConnection;
- private boolean mConnectionReady;
-
- public RegisteredMediaRouteProvider(Context context, ComponentName componentName) {
- super(context, new ProviderMetadata(componentName));
-
- mComponentName = componentName;
- mPrivateHandler = new PrivateHandler();
- }
-
- @Override
- public RouteController onCreateRouteController(@NonNull String routeId) {
- if (routeId == null) {
- throw new IllegalArgumentException("routeId cannot be null");
- }
- return createRouteController(routeId, null);
- }
-
- @Override
- public RouteController onCreateRouteController(
- @NonNull String routeId, @NonNull String routeGroupId) {
- if (routeId == null) {
- throw new IllegalArgumentException("routeId cannot be null");
- }
- if (routeGroupId == null) {
- throw new IllegalArgumentException("routeGroupId cannot be null");
- }
- return createRouteController(routeId, routeGroupId);
- }
-
- @Override
- public void onDiscoveryRequestChanged(MediaRouteDiscoveryRequest request) {
- if (mConnectionReady) {
- mActiveConnection.setDiscoveryRequest(request);
- }
- updateBinding();
- }
-
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- if (DEBUG) {
- Log.d(TAG, this + ": Connected");
- }
-
- if (mBound) {
- disconnect();
-
- Messenger messenger = (service != null ? new Messenger(service) : null);
- if (isValidRemoteMessenger(messenger)) {
- Connection connection = new Connection(messenger);
- if (connection.register()) {
- mActiveConnection = connection;
- } else {
- if (DEBUG) {
- Log.d(TAG, this + ": Registration failed");
- }
- }
- } else {
- Log.e(TAG, this + ": Service returned invalid messenger binder");
- }
- }
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- if (DEBUG) {
- Log.d(TAG, this + ": Service disconnected");
- }
- disconnect();
- }
-
- @Override
- public String toString() {
- return "Service connection " + mComponentName.flattenToShortString();
- }
-
- public boolean hasComponentName(String packageName, String className) {
- return mComponentName.getPackageName().equals(packageName)
- && mComponentName.getClassName().equals(className);
- }
-
- public void start() {
- if (!mStarted) {
- if (DEBUG) {
- Log.d(TAG, this + ": Starting");
- }
-
- mStarted = true;
- updateBinding();
- }
- }
-
- public void stop() {
- if (mStarted) {
- if (DEBUG) {
- Log.d(TAG, this + ": Stopping");
- }
-
- mStarted = false;
- updateBinding();
- }
- }
-
- public void rebindIfDisconnected() {
- if (mActiveConnection == null && shouldBind()) {
- unbind();
- bind();
- }
- }
-
- private void updateBinding() {
- if (shouldBind()) {
- bind();
- } else {
- unbind();
- }
- }
-
- private boolean shouldBind() {
- if (mStarted) {
- // Bind whenever there is a discovery request.
- if (getDiscoveryRequest() != null) {
- return true;
- }
-
- // Bind whenever the application has an active route controller.
- // This means that one of this provider's routes is selected.
- if (!mControllers.isEmpty()) {
- return true;
- }
- }
- return false;
- }
-
- private void bind() {
- if (!mBound) {
- if (DEBUG) {
- Log.d(TAG, this + ": Binding");
- }
-
- Intent service = new Intent(MediaRouteProviderProtocol.SERVICE_INTERFACE);
- service.setComponent(mComponentName);
- try {
- mBound = getContext().bindService(service, this, Context.BIND_AUTO_CREATE);
- if (!mBound && DEBUG) {
- Log.d(TAG, this + ": Bind failed");
- }
- } catch (SecurityException ex) {
- if (DEBUG) {
- Log.d(TAG, this + ": Bind failed", ex);
- }
- }
- }
- }
-
- private void unbind() {
- if (mBound) {
- if (DEBUG) {
- Log.d(TAG, this + ": Unbinding");
- }
-
- mBound = false;
- disconnect();
- getContext().unbindService(this);
- }
- }
-
- private RouteController createRouteController(String routeId, String routeGroupId) {
- MediaRouteProviderDescriptor descriptor = getDescriptor();
- if (descriptor != null) {
- List<MediaRouteDescriptor> routes = descriptor.getRoutes();
- final int count = routes.size();
- for (int i = 0; i < count; i++) {
- final MediaRouteDescriptor route = routes.get(i);
- if (route.getId().equals(routeId)) {
- Controller controller = new Controller(routeId, routeGroupId);
- mControllers.add(controller);
- if (mConnectionReady) {
- controller.attachConnection(mActiveConnection);
- }
- updateBinding();
- return controller;
- }
- }
- }
- return null;
- }
-
- void onConnectionReady(Connection connection) {
- if (mActiveConnection == connection) {
- mConnectionReady = true;
- attachControllersToConnection();
-
- MediaRouteDiscoveryRequest request = getDiscoveryRequest();
- if (request != null) {
- mActiveConnection.setDiscoveryRequest(request);
- }
- }
- }
-
- void onConnectionDied(Connection connection) {
- if (mActiveConnection == connection) {
- if (DEBUG) {
- Log.d(TAG, this + ": Service connection died");
- }
- disconnect();
- }
- }
-
- void onConnectionError(Connection connection, String error) {
- if (mActiveConnection == connection) {
- if (DEBUG) {
- Log.d(TAG, this + ": Service connection error - " + error);
- }
- unbind();
- }
- }
-
- void onConnectionDescriptorChanged(Connection connection,
- MediaRouteProviderDescriptor descriptor) {
- if (mActiveConnection == connection) {
- if (DEBUG) {
- Log.d(TAG, this + ": Descriptor changed, descriptor=" + descriptor);
- }
- setDescriptor(descriptor);
- }
- }
-
- private void disconnect() {
- if (mActiveConnection != null) {
- setDescriptor(null);
- mConnectionReady = false;
- detachControllersFromConnection();
- mActiveConnection.dispose();
- mActiveConnection = null;
- }
- }
-
- void onControllerReleased(Controller controller) {
- mControllers.remove(controller);
- controller.detachConnection();
- updateBinding();
- }
-
- private void attachControllersToConnection() {
- int count = mControllers.size();
- for (int i = 0; i < count; i++) {
- mControllers.get(i).attachConnection(mActiveConnection);
- }
- }
-
- private void detachControllersFromConnection() {
- int count = mControllers.size();
- for (int i = 0; i < count; i++) {
- mControllers.get(i).detachConnection();
- }
- }
-
- private final class Controller extends RouteController {
- private final String mRouteId;
- private final String mRouteGroupId;
-
- private boolean mSelected;
- private int mPendingSetVolume = -1;
- private int mPendingUpdateVolumeDelta;
-
- private Connection mConnection;
- private int mControllerId;
-
- public Controller(String routeId, String routeGroupId) {
- mRouteId = routeId;
- mRouteGroupId = routeGroupId;
- }
-
- public void attachConnection(Connection connection) {
- mConnection = connection;
- mControllerId = connection.createRouteController(mRouteId, mRouteGroupId);
- if (mSelected) {
- connection.selectRoute(mControllerId);
- if (mPendingSetVolume >= 0) {
- connection.setVolume(mControllerId, mPendingSetVolume);
- mPendingSetVolume = -1;
- }
- if (mPendingUpdateVolumeDelta != 0) {
- connection.updateVolume(mControllerId, mPendingUpdateVolumeDelta);
- mPendingUpdateVolumeDelta = 0;
- }
- }
- }
-
- public void detachConnection() {
- if (mConnection != null) {
- mConnection.releaseRouteController(mControllerId);
- mConnection = null;
- mControllerId = 0;
- }
- }
-
- @Override
- public void onRelease() {
- onControllerReleased(this);
- }
-
- @Override
- public void onSelect() {
- mSelected = true;
- if (mConnection != null) {
- mConnection.selectRoute(mControllerId);
- }
- }
-
- @Override
- public void onUnselect() {
- onUnselect(MediaRouter.UNSELECT_REASON_UNKNOWN);
- }
-
- @Override
- public void onUnselect(int reason) {
- mSelected = false;
- if (mConnection != null) {
- mConnection.unselectRoute(mControllerId, reason);
- }
- }
-
- @Override
- public void onSetVolume(int volume) {
- if (mConnection != null) {
- mConnection.setVolume(mControllerId, volume);
- } else {
- mPendingSetVolume = volume;
- mPendingUpdateVolumeDelta = 0;
- }
- }
-
- @Override
- public void onUpdateVolume(int delta) {
- if (mConnection != null) {
- mConnection.updateVolume(mControllerId, delta);
- } else {
- mPendingUpdateVolumeDelta += delta;
- }
- }
-
- @Override
- public boolean onControlRequest(Intent intent, ControlRequestCallback callback) {
- if (mConnection != null) {
- return mConnection.sendControlRequest(mControllerId, intent, callback);
- }
- return false;
- }
- }
-
- private final class Connection implements DeathRecipient {
- private final Messenger mServiceMessenger;
- private final ReceiveHandler mReceiveHandler;
- private final Messenger mReceiveMessenger;
-
- private int mNextRequestId = 1;
- private int mNextControllerId = 1;
- private int mServiceVersion; // non-zero when registration complete
-
- private int mPendingRegisterRequestId;
- private final SparseArray<ControlRequestCallback> mPendingCallbacks =
- new SparseArray<ControlRequestCallback>();
-
- public Connection(Messenger serviceMessenger) {
- mServiceMessenger = serviceMessenger;
- mReceiveHandler = new ReceiveHandler(this);
- mReceiveMessenger = new Messenger(mReceiveHandler);
- }
-
- public boolean register() {
- mPendingRegisterRequestId = mNextRequestId++;
- if (!sendRequest(CLIENT_MSG_REGISTER,
- mPendingRegisterRequestId,
- CLIENT_VERSION_CURRENT, null, null)) {
- return false;
- }
-
- try {
- mServiceMessenger.getBinder().linkToDeath(this, 0);
- return true;
- } catch (RemoteException ex) {
- binderDied();
- }
- return false;
- }
-
- public void dispose() {
- sendRequest(CLIENT_MSG_UNREGISTER, 0, 0, null, null);
- mReceiveHandler.dispose();
- mServiceMessenger.getBinder().unlinkToDeath(this, 0);
-
- mPrivateHandler.post(new Runnable() {
- @Override
- public void run() {
- failPendingCallbacks();
- }
- });
- }
-
- void failPendingCallbacks() {
- int count = 0;
- for (int i = 0; i < mPendingCallbacks.size(); i++) {
- mPendingCallbacks.valueAt(i).onError(null, null);
- }
- mPendingCallbacks.clear();
- }
-
- public boolean onGenericFailure(int requestId) {
- if (requestId == mPendingRegisterRequestId) {
- mPendingRegisterRequestId = 0;
- onConnectionError(this, "Registration failed");
- }
- ControlRequestCallback callback = mPendingCallbacks.get(requestId);
- if (callback != null) {
- mPendingCallbacks.remove(requestId);
- callback.onError(null, null);
- }
- return true;
- }
-
- public boolean onGenericSuccess(int requestId) {
- return true;
- }
-
- public boolean onRegistered(int requestId, int serviceVersion,
- Bundle descriptorBundle) {
- if (mServiceVersion == 0
- && requestId == mPendingRegisterRequestId
- && serviceVersion >= SERVICE_VERSION_1) {
- mPendingRegisterRequestId = 0;
- mServiceVersion = serviceVersion;
- onConnectionDescriptorChanged(this,
- MediaRouteProviderDescriptor.fromBundle(descriptorBundle));
- onConnectionReady(this);
- return true;
- }
- return false;
- }
-
- public boolean onDescriptorChanged(Bundle descriptorBundle) {
- if (mServiceVersion != 0) {
- onConnectionDescriptorChanged(this,
- MediaRouteProviderDescriptor.fromBundle(descriptorBundle));
- return true;
- }
- return false;
- }
-
- public boolean onControlRequestSucceeded(int requestId, Bundle data) {
- ControlRequestCallback callback = mPendingCallbacks.get(requestId);
- if (callback != null) {
- mPendingCallbacks.remove(requestId);
- callback.onResult(data);
- return true;
- }
- return false;
- }
-
- public boolean onControlRequestFailed(int requestId, String error, Bundle data) {
- ControlRequestCallback callback = mPendingCallbacks.get(requestId);
- if (callback != null) {
- mPendingCallbacks.remove(requestId);
- callback.onError(error, data);
- return true;
- }
- return false;
- }
-
- @Override
- public void binderDied() {
- mPrivateHandler.post(new Runnable() {
- @Override
- public void run() {
- onConnectionDied(Connection.this);
- }
- });
- }
-
- public int createRouteController(String routeId, String routeGroupId) {
- int controllerId = mNextControllerId++;
- Bundle data = new Bundle();
- data.putString(CLIENT_DATA_ROUTE_ID, routeId);
- data.putString(CLIENT_DATA_ROUTE_LIBRARY_GROUP, routeGroupId);
- sendRequest(CLIENT_MSG_CREATE_ROUTE_CONTROLLER,
- mNextRequestId++, controllerId, null, data);
- return controllerId;
- }
-
- public void releaseRouteController(int controllerId) {
- sendRequest(CLIENT_MSG_RELEASE_ROUTE_CONTROLLER,
- mNextRequestId++, controllerId, null, null);
- }
-
- public void selectRoute(int controllerId) {
- sendRequest(CLIENT_MSG_SELECT_ROUTE,
- mNextRequestId++, controllerId, null, null);
- }
-
- public void unselectRoute(int controllerId, int reason) {
- Bundle extras = new Bundle();
- extras.putInt(CLIENT_DATA_UNSELECT_REASON, reason);
- sendRequest(CLIENT_MSG_UNSELECT_ROUTE,
- mNextRequestId++, controllerId, null, extras);
- }
-
- public void setVolume(int controllerId, int volume) {
- Bundle data = new Bundle();
- data.putInt(CLIENT_DATA_VOLUME, volume);
- sendRequest(CLIENT_MSG_SET_ROUTE_VOLUME,
- mNextRequestId++, controllerId, null, data);
- }
-
- public void updateVolume(int controllerId, int delta) {
- Bundle data = new Bundle();
- data.putInt(CLIENT_DATA_VOLUME, delta);
- sendRequest(CLIENT_MSG_UPDATE_ROUTE_VOLUME,
- mNextRequestId++, controllerId, null, data);
- }
-
- public boolean sendControlRequest(int controllerId, Intent intent,
- ControlRequestCallback callback) {
- int requestId = mNextRequestId++;
- if (sendRequest(CLIENT_MSG_ROUTE_CONTROL_REQUEST,
- requestId, controllerId, intent, null)) {
- if (callback != null) {
- mPendingCallbacks.put(requestId, callback);
- }
- return true;
- }
- return false;
- }
-
- public void setDiscoveryRequest(MediaRouteDiscoveryRequest request) {
- sendRequest(CLIENT_MSG_SET_DISCOVERY_REQUEST,
- mNextRequestId++, 0, request != null ? request.asBundle() : null, null);
- }
-
- private boolean sendRequest(int what, int requestId, int arg, Object obj, Bundle data) {
- Message msg = Message.obtain();
- msg.what = what;
- msg.arg1 = requestId;
- msg.arg2 = arg;
- msg.obj = obj;
- msg.setData(data);
- msg.replyTo = mReceiveMessenger;
- try {
- mServiceMessenger.send(msg);
- return true;
- } catch (DeadObjectException ex) {
- // The service died.
- } catch (RemoteException ex) {
- if (what != CLIENT_MSG_UNREGISTER) {
- Log.e(TAG, "Could not send message to service.", ex);
- }
- }
- return false;
- }
- }
-
- private static final class PrivateHandler extends Handler {
- PrivateHandler() {
- }
- }
-
- /**
- * Handler that receives messages from the server.
- * <p>
- * This inner class is static and only retains a weak reference to the connection
- * to prevent the client from being leaked in case the service is holding an
- * active reference to the client's messenger.
- * </p><p>
- * This handler should not be used to handle any messages other than those
- * that come from the service.
- * </p>
- */
- private static final class ReceiveHandler extends Handler {
- private final WeakReference<Connection> mConnectionRef;
-
- public ReceiveHandler(Connection connection) {
- mConnectionRef = new WeakReference<Connection>(connection);
- }
-
- public void dispose() {
- mConnectionRef.clear();
- }
-
- @Override
- public void handleMessage(Message msg) {
- Connection connection = mConnectionRef.get();
- if (connection != null) {
- final int what = msg.what;
- final int requestId = msg.arg1;
- final int arg = msg.arg2;
- final Object obj = msg.obj;
- final Bundle data = msg.peekData();
- if (!processMessage(connection, what, requestId, arg, obj, data)) {
- if (DEBUG) {
- Log.d(TAG, "Unhandled message from server: " + msg);
- }
- }
- }
- }
-
- private boolean processMessage(Connection connection,
- int what, int requestId, int arg, Object obj, Bundle data) {
- switch (what) {
- case SERVICE_MSG_GENERIC_FAILURE:
- connection.onGenericFailure(requestId);
- return true;
-
- case SERVICE_MSG_GENERIC_SUCCESS:
- connection.onGenericSuccess(requestId);
- return true;
-
- case SERVICE_MSG_REGISTERED:
- if (obj == null || obj instanceof Bundle) {
- return connection.onRegistered(requestId, arg, (Bundle)obj);
- }
- break;
-
- case SERVICE_MSG_DESCRIPTOR_CHANGED:
- if (obj == null || obj instanceof Bundle) {
- return connection.onDescriptorChanged((Bundle)obj);
- }
- break;
-
- case SERVICE_MSG_CONTROL_REQUEST_SUCCEEDED:
- if (obj == null || obj instanceof Bundle) {
- return connection.onControlRequestSucceeded(
- requestId, (Bundle)obj);
- }
- break;
-
- case SERVICE_MSG_CONTROL_REQUEST_FAILED:
- if (obj == null || obj instanceof Bundle) {
- String error = (data == null ? null :
- data.getString(SERVICE_DATA_ERROR));
- return connection.onControlRequestFailed(
- requestId, error, (Bundle)obj);
- }
- break;
- }
- return false;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/RegisteredMediaRouteProviderWatcher.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/RegisteredMediaRouteProviderWatcher.java
deleted file mode 100644
index ba1f647..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/RegisteredMediaRouteProviderWatcher.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.os.Handler;
-
-import java.util.ArrayList;
-import java.util.Collections;
-
-/**
- * Watches for media route provider services to be installed.
- * Adds a provider to the media router for each registered service.
- *
- * @see RegisteredMediaRouteProvider
- */
-final class RegisteredMediaRouteProviderWatcher {
- private final Context mContext;
- private final Callback mCallback;
- private final Handler mHandler;
- private final PackageManager mPackageManager;
-
- private final ArrayList<RegisteredMediaRouteProvider> mProviders =
- new ArrayList<RegisteredMediaRouteProvider>();
- private boolean mRunning;
-
- public RegisteredMediaRouteProviderWatcher(Context context, Callback callback) {
- mContext = context;
- mCallback = callback;
- mHandler = new Handler();
- mPackageManager = context.getPackageManager();
- }
-
- public void start() {
- if (!mRunning) {
- mRunning = true;
-
- IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_PACKAGE_ADDED);
- filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
- filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
- filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
- filter.addAction(Intent.ACTION_PACKAGE_RESTARTED);
- filter.addDataScheme("package");
- mContext.registerReceiver(mScanPackagesReceiver, filter, null, mHandler);
-
- // Scan packages.
- // Also has the side-effect of restarting providers if needed.
- mHandler.post(mScanPackagesRunnable);
- }
- }
-
- public void stop() {
- if (mRunning) {
- mRunning = false;
-
- mContext.unregisterReceiver(mScanPackagesReceiver);
- mHandler.removeCallbacks(mScanPackagesRunnable);
-
- // Stop all providers.
- for (int i = mProviders.size() - 1; i >= 0; i--) {
- mProviders.get(i).stop();
- }
- }
- }
-
- void scanPackages() {
- if (!mRunning) {
- return;
- }
-
- // Add providers for all new services.
- // Reorder the list so that providers left at the end will be the ones to remove.
- int targetIndex = 0;
- Intent intent = new Intent(MediaRouteProviderService.SERVICE_INTERFACE);
- for (ResolveInfo resolveInfo : mPackageManager.queryIntentServices(intent, 0)) {
- ServiceInfo serviceInfo = resolveInfo.serviceInfo;
- if (serviceInfo != null) {
- int sourceIndex = findProvider(serviceInfo.packageName, serviceInfo.name);
- if (sourceIndex < 0) {
- RegisteredMediaRouteProvider provider =
- new RegisteredMediaRouteProvider(mContext,
- new ComponentName(serviceInfo.packageName, serviceInfo.name));
- provider.start();
- mProviders.add(targetIndex++, provider);
- mCallback.addProvider(provider);
- } else if (sourceIndex >= targetIndex) {
- RegisteredMediaRouteProvider provider = mProviders.get(sourceIndex);
- provider.start(); // restart the provider if needed
- provider.rebindIfDisconnected();
- Collections.swap(mProviders, sourceIndex, targetIndex++);
- }
- }
- }
-
- // Remove providers for missing services.
- if (targetIndex < mProviders.size()) {
- for (int i = mProviders.size() - 1; i >= targetIndex; i--) {
- RegisteredMediaRouteProvider provider = mProviders.get(i);
- mCallback.removeProvider(provider);
- mProviders.remove(provider);
- provider.stop();
- }
- }
- }
-
- private int findProvider(String packageName, String className) {
- int count = mProviders.size();
- for (int i = 0; i < count; i++) {
- RegisteredMediaRouteProvider provider = mProviders.get(i);
- if (provider.hasComponentName(packageName, className)) {
- return i;
- }
- }
- return -1;
- }
-
- private final BroadcastReceiver mScanPackagesReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- scanPackages();
- }
- };
-
- private final Runnable mScanPackagesRunnable = new Runnable() {
- @Override
- public void run() {
- scanPackages();
- }
- };
-
- public interface Callback {
- void addProvider(MediaRouteProvider provider);
- void removeProvider(MediaRouteProvider provider);
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/RemoteControlClientCompat.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/RemoteControlClientCompat.java
deleted file mode 100644
index 65c5518..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/RemoteControlClientCompat.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.support.mediarouter.media;
-
-import android.content.Context;
-import android.media.AudioManager;
-import android.os.Build;
-
-import java.lang.ref.WeakReference;
-
-/**
- * Provides access to features of the remote control client.
- *
- * Hidden for now but we might want to make this available to applications
- * in the future.
- */
-abstract class RemoteControlClientCompat {
- protected final Context mContext;
- protected final Object mRcc;
- protected VolumeCallback mVolumeCallback;
-
- protected RemoteControlClientCompat(Context context, Object rcc) {
- mContext = context;
- mRcc = rcc;
- }
-
- public static RemoteControlClientCompat obtain(Context context, Object rcc) {
- if (Build.VERSION.SDK_INT >= 16) {
- return new JellybeanImpl(context, rcc);
- }
- return new LegacyImpl(context, rcc);
- }
-
- public Object getRemoteControlClient() {
- return mRcc;
- }
-
- /**
- * Sets the current playback information.
- * Must be called at least once to attach to the remote control client.
- *
- * @param info The playback information. Must not be null.
- */
- public void setPlaybackInfo(PlaybackInfo info) {
- }
-
- /**
- * Sets a callback to receive volume change requests from the remote control client.
- *
- * @param callback The volume callback to use or null if none.
- */
- public void setVolumeCallback(VolumeCallback callback) {
- mVolumeCallback = callback;
- }
-
- /**
- * Specifies information about the playback.
- */
- public static final class PlaybackInfo {
- public int volume;
- public int volumeMax;
- public int volumeHandling = MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED;
- public int playbackStream = AudioManager.STREAM_MUSIC;
- public int playbackType = MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE;
- }
-
- /**
- * Called when volume updates are requested by the remote control client.
- */
- public interface VolumeCallback {
- /**
- * Called when the volume should be increased or decreased.
- *
- * @param direction An integer indicating whether the volume is to be increased
- * (positive value) or decreased (negative value).
- * For bundled changes, the absolute value indicates the number of changes
- * in the same direction, e.g. +3 corresponds to three "volume up" changes.
- */
- public void onVolumeUpdateRequest(int direction);
-
- /**
- * Called when the volume for the route should be set to the given value.
- *
- * @param volume An integer indicating the new volume value that should be used,
- * always between 0 and the value set by {@link PlaybackInfo#volumeMax}.
- */
- public void onVolumeSetRequest(int volume);
- }
-
- /**
- * Legacy implementation for platform versions prior to Jellybean.
- * Does nothing.
- */
- static class LegacyImpl extends RemoteControlClientCompat {
- public LegacyImpl(Context context, Object rcc) {
- super(context, rcc);
- }
- }
-
- /**
- * Implementation for Jellybean.
- *
- * The basic idea of this implementation is to attach the RCC to a UserRouteInfo
- * in order to hook up stream metadata and volume callbacks because there is no
- * other API available to do so in this platform version. The UserRouteInfo itself
- * is not attached to the MediaRouter so it is transparent to the user.
- */
- // @@RequiresApi(16)
- static class JellybeanImpl extends RemoteControlClientCompat {
- private final Object mRouterObj;
- private final Object mUserRouteCategoryObj;
- private final Object mUserRouteObj;
- private boolean mRegistered;
-
- public JellybeanImpl(Context context, Object rcc) {
- super(context, rcc);
-
- mRouterObj = MediaRouterJellybean.getMediaRouter(context);
- mUserRouteCategoryObj = MediaRouterJellybean.createRouteCategory(
- mRouterObj, "", false);
- mUserRouteObj = MediaRouterJellybean.createUserRoute(
- mRouterObj, mUserRouteCategoryObj);
- }
-
- @Override
- public void setPlaybackInfo(PlaybackInfo info) {
- MediaRouterJellybean.UserRouteInfo.setVolume(
- mUserRouteObj, info.volume);
- MediaRouterJellybean.UserRouteInfo.setVolumeMax(
- mUserRouteObj, info.volumeMax);
- MediaRouterJellybean.UserRouteInfo.setVolumeHandling(
- mUserRouteObj, info.volumeHandling);
- MediaRouterJellybean.UserRouteInfo.setPlaybackStream(
- mUserRouteObj, info.playbackStream);
- MediaRouterJellybean.UserRouteInfo.setPlaybackType(
- mUserRouteObj, info.playbackType);
-
- if (!mRegistered) {
- mRegistered = true;
- MediaRouterJellybean.UserRouteInfo.setVolumeCallback(mUserRouteObj,
- MediaRouterJellybean.createVolumeCallback(
- new VolumeCallbackWrapper(this)));
- MediaRouterJellybean.UserRouteInfo.setRemoteControlClient(mUserRouteObj, mRcc);
- }
- }
-
- private static final class VolumeCallbackWrapper
- implements MediaRouterJellybean.VolumeCallback {
- // Unfortunately, the framework never unregisters its volume observer from
- // the audio service so the UserRouteInfo object may leak along with
- // any callbacks that we attach to it. Use a weak reference to prevent
- // the volume callback from holding strong references to anything important.
- private final WeakReference<JellybeanImpl> mImplWeak;
-
- public VolumeCallbackWrapper(JellybeanImpl impl) {
- mImplWeak = new WeakReference<JellybeanImpl>(impl);
- }
-
- @Override
- public void onVolumeUpdateRequest(Object routeObj, int direction) {
- JellybeanImpl impl = mImplWeak.get();
- if (impl != null && impl.mVolumeCallback != null) {
- impl.mVolumeCallback.onVolumeUpdateRequest(direction);
- }
- }
-
- @Override
- public void onVolumeSetRequest(Object routeObj, int volume) {
- JellybeanImpl impl = mImplWeak.get();
- if (impl != null && impl.mVolumeCallback != null) {
- impl.mVolumeCallback.onVolumeSetRequest(volume);
- }
- }
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/RemotePlaybackClient.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/RemotePlaybackClient.java
deleted file mode 100644
index e76564e..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/RemotePlaybackClient.java
+++ /dev/null
@@ -1,1045 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.support.mediarouter.media;
-
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.Uri;
-import android.os.Bundle;
-import android.util.Log;
-
-import androidx.core.util.ObjectsCompat;
-
-/**
- * A helper class for playing media on remote routes using the remote playback protocol
- * defined by {@link MediaControlIntent}.
- * <p>
- * The client maintains session state and offers a simplified interface for issuing
- * remote playback media control intents to a single route.
- * </p>
- */
-public class RemotePlaybackClient {
- static final String TAG = "RemotePlaybackClient";
- static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- private final Context mContext;
- private final MediaRouter.RouteInfo mRoute;
- private final ActionReceiver mActionReceiver;
- private final PendingIntent mItemStatusPendingIntent;
- private final PendingIntent mSessionStatusPendingIntent;
- private final PendingIntent mMessagePendingIntent;
-
- private boolean mRouteSupportsRemotePlayback;
- private boolean mRouteSupportsQueuing;
- private boolean mRouteSupportsSessionManagement;
- private boolean mRouteSupportsMessaging;
-
- String mSessionId;
- StatusCallback mStatusCallback;
- OnMessageReceivedListener mOnMessageReceivedListener;
-
- /**
- * Creates a remote playback client for a route.
- *
- * @param route The media route.
- */
- public RemotePlaybackClient(Context context, MediaRouter.RouteInfo route) {
- if (context == null) {
- throw new IllegalArgumentException("context must not be null");
- }
- if (route == null) {
- throw new IllegalArgumentException("route must not be null");
- }
-
- mContext = context;
- mRoute = route;
-
- IntentFilter actionFilter = new IntentFilter();
- actionFilter.addAction(ActionReceiver.ACTION_ITEM_STATUS_CHANGED);
- actionFilter.addAction(ActionReceiver.ACTION_SESSION_STATUS_CHANGED);
- actionFilter.addAction(ActionReceiver.ACTION_MESSAGE_RECEIVED);
- mActionReceiver = new ActionReceiver();
- context.registerReceiver(mActionReceiver, actionFilter);
-
- Intent itemStatusIntent = new Intent(ActionReceiver.ACTION_ITEM_STATUS_CHANGED);
- itemStatusIntent.setPackage(context.getPackageName());
- mItemStatusPendingIntent = PendingIntent.getBroadcast(
- context, 0, itemStatusIntent, 0);
-
- Intent sessionStatusIntent = new Intent(ActionReceiver.ACTION_SESSION_STATUS_CHANGED);
- sessionStatusIntent.setPackage(context.getPackageName());
- mSessionStatusPendingIntent = PendingIntent.getBroadcast(
- context, 0, sessionStatusIntent, 0);
-
- Intent messageIntent = new Intent(ActionReceiver.ACTION_MESSAGE_RECEIVED);
- messageIntent.setPackage(context.getPackageName());
- mMessagePendingIntent = PendingIntent.getBroadcast(
- context, 0, messageIntent, 0);
- detectFeatures();
- }
-
- /**
- * Releases resources owned by the client.
- */
- public void release() {
- mContext.unregisterReceiver(mActionReceiver);
- }
-
- /**
- * Returns true if the route supports remote playback.
- * <p>
- * If the route does not support remote playback, then none of the functionality
- * offered by the client will be available.
- * </p><p>
- * This method returns true if the route supports all of the following
- * actions: {@link MediaControlIntent#ACTION_PLAY play},
- * {@link MediaControlIntent#ACTION_SEEK seek},
- * {@link MediaControlIntent#ACTION_GET_STATUS get status},
- * {@link MediaControlIntent#ACTION_PAUSE pause},
- * {@link MediaControlIntent#ACTION_RESUME resume},
- * {@link MediaControlIntent#ACTION_STOP stop}.
- * </p>
- *
- * @return True if remote playback is supported.
- */
- public boolean isRemotePlaybackSupported() {
- return mRouteSupportsRemotePlayback;
- }
-
- /**
- * Returns true if the route supports queuing features.
- * <p>
- * If the route does not support queuing, then at most one media item can be played
- * at a time and the {@link #enqueue} method will not be available.
- * </p><p>
- * This method returns true if the route supports all of the basic remote playback
- * actions and all of the following actions:
- * {@link MediaControlIntent#ACTION_ENQUEUE enqueue},
- * {@link MediaControlIntent#ACTION_REMOVE remove}.
- * </p>
- *
- * @return True if queuing is supported. Implies {@link #isRemotePlaybackSupported}
- * is also true.
- *
- * @see #isRemotePlaybackSupported
- */
- public boolean isQueuingSupported() {
- return mRouteSupportsQueuing;
- }
-
- /**
- * Returns true if the route supports session management features.
- * <p>
- * If the route does not support session management, then the session will
- * not be created until the first media item is played.
- * </p><p>
- * This method returns true if the route supports all of the basic remote playback
- * actions and all of the following actions:
- * {@link MediaControlIntent#ACTION_START_SESSION start session},
- * {@link MediaControlIntent#ACTION_GET_SESSION_STATUS get session status},
- * {@link MediaControlIntent#ACTION_END_SESSION end session}.
- * </p>
- *
- * @return True if session management is supported.
- * Implies {@link #isRemotePlaybackSupported} is also true.
- *
- * @see #isRemotePlaybackSupported
- */
- public boolean isSessionManagementSupported() {
- return mRouteSupportsSessionManagement;
- }
-
- /**
- * Returns true if the route supports messages.
- * <p>
- * This method returns true if the route supports all of the basic remote playback
- * actions and all of the following actions:
- * {@link MediaControlIntent#ACTION_START_SESSION start session},
- * {@link MediaControlIntent#ACTION_SEND_MESSAGE send message},
- * {@link MediaControlIntent#ACTION_END_SESSION end session}.
- * </p>
- *
- * @return True if session management is supported.
- * Implies {@link #isRemotePlaybackSupported} is also true.
- *
- * @see #isRemotePlaybackSupported
- */
- public boolean isMessagingSupported() {
- return mRouteSupportsMessaging;
- }
-
- /**
- * Gets the current session id if there is one.
- *
- * @return The current session id, or null if none.
- */
- public String getSessionId() {
- return mSessionId;
- }
-
- /**
- * Sets the current session id.
- * <p>
- * It is usually not necessary to set the session id explicitly since
- * it is created as a side-effect of other requests such as
- * {@link #play}, {@link #enqueue}, and {@link #startSession}.
- * </p>
- *
- * @param sessionId The new session id, or null if none.
- */
- public void setSessionId(String sessionId) {
- if (!ObjectsCompat.equals(mSessionId, sessionId)) {
- if (DEBUG) {
- Log.d(TAG, "Session id is now: " + sessionId);
- }
- mSessionId = sessionId;
- if (mStatusCallback != null) {
- mStatusCallback.onSessionChanged(sessionId);
- }
- }
- }
-
- /**
- * Returns true if the client currently has a session.
- * <p>
- * Equivalent to checking whether {@link #getSessionId} returns a non-null result.
- * </p>
- *
- * @return True if there is a current session.
- */
- public boolean hasSession() {
- return mSessionId != null;
- }
-
- /**
- * Sets a callback that should receive status updates when the state of
- * media sessions or media items created by this instance of the remote
- * playback client changes.
- * <p>
- * The callback should be set before the session is created or any play
- * commands are issued.
- * </p>
- *
- * @param callback The callback to set. May be null to remove the previous callback.
- */
- public void setStatusCallback(StatusCallback callback) {
- mStatusCallback = callback;
- }
-
- /**
- * Sets a callback that should receive messages when a message is sent from
- * media sessions created by this instance of the remote playback client changes.
- * <p>
- * The callback should be set before the session is created.
- * </p>
- *
- * @param listener The callback to set. May be null to remove the previous callback.
- */
- public void setOnMessageReceivedListener(OnMessageReceivedListener listener) {
- mOnMessageReceivedListener = listener;
- }
-
- /**
- * Sends a request to play a media item.
- * <p>
- * Clears the queue and starts playing the new item immediately. If the queue
- * was previously paused, then it is resumed as a side-effect of this request.
- * </p><p>
- * The request is issued in the current session. If no session is available, then
- * one is created implicitly.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_PLAY ACTION_PLAY} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param contentUri The content Uri to play.
- * @param mimeType The mime type of the content, or null if unknown.
- * @param positionMillis The initial content position for the item in milliseconds,
- * or <code>0</code> to start at the beginning.
- * @param metadata The media item metadata bundle, or null if none.
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_PLAY} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws UnsupportedOperationException if the route does not support remote playback.
- *
- * @see MediaControlIntent#ACTION_PLAY
- * @see #isRemotePlaybackSupported
- */
- public void play(Uri contentUri, String mimeType, Bundle metadata,
- long positionMillis, Bundle extras, ItemActionCallback callback) {
- playOrEnqueue(contentUri, mimeType, metadata, positionMillis,
- extras, callback, MediaControlIntent.ACTION_PLAY);
- }
-
- /**
- * Sends a request to enqueue a media item.
- * <p>
- * Enqueues a new item to play. If the queue was previously paused, then will
- * remain paused.
- * </p><p>
- * The request is issued in the current session. If no session is available, then
- * one is created implicitly.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_ENQUEUE ACTION_ENQUEUE} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param contentUri The content Uri to enqueue.
- * @param mimeType The mime type of the content, or null if unknown.
- * @param positionMillis The initial content position for the item in milliseconds,
- * or <code>0</code> to start at the beginning.
- * @param metadata The media item metadata bundle, or null if none.
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_ENQUEUE} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws UnsupportedOperationException if the route does not support queuing.
- *
- * @see MediaControlIntent#ACTION_ENQUEUE
- * @see #isRemotePlaybackSupported
- * @see #isQueuingSupported
- */
- public void enqueue(Uri contentUri, String mimeType, Bundle metadata,
- long positionMillis, Bundle extras, ItemActionCallback callback) {
- playOrEnqueue(contentUri, mimeType, metadata, positionMillis,
- extras, callback, MediaControlIntent.ACTION_ENQUEUE);
- }
-
- private void playOrEnqueue(Uri contentUri, String mimeType, Bundle metadata,
- long positionMillis, Bundle extras,
- final ItemActionCallback callback, String action) {
- if (contentUri == null) {
- throw new IllegalArgumentException("contentUri must not be null");
- }
- throwIfRemotePlaybackNotSupported();
- if (action.equals(MediaControlIntent.ACTION_ENQUEUE)) {
- throwIfQueuingNotSupported();
- }
-
- Intent intent = new Intent(action);
- intent.setDataAndType(contentUri, mimeType);
- intent.putExtra(MediaControlIntent.EXTRA_ITEM_STATUS_UPDATE_RECEIVER,
- mItemStatusPendingIntent);
- if (metadata != null) {
- intent.putExtra(MediaControlIntent.EXTRA_ITEM_METADATA, metadata);
- }
- if (positionMillis != 0) {
- intent.putExtra(MediaControlIntent.EXTRA_ITEM_CONTENT_POSITION, positionMillis);
- }
- performItemAction(intent, mSessionId, null, extras, callback);
- }
-
- /**
- * Sends a request to seek to a new position in a media item.
- * <p>
- * Seeks to a new position. If the queue was previously paused then it
- * remains paused but the item's new position is still remembered.
- * </p><p>
- * The request is issued in the current session.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_SEEK ACTION_SEEK} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param itemId The item id.
- * @param positionMillis The new content position for the item in milliseconds,
- * or <code>0</code> to start at the beginning.
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_SEEK} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- *
- * @see MediaControlIntent#ACTION_SEEK
- * @see #isRemotePlaybackSupported
- */
- public void seek(String itemId, long positionMillis, Bundle extras,
- ItemActionCallback callback) {
- if (itemId == null) {
- throw new IllegalArgumentException("itemId must not be null");
- }
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_SEEK);
- intent.putExtra(MediaControlIntent.EXTRA_ITEM_CONTENT_POSITION, positionMillis);
- performItemAction(intent, mSessionId, itemId, extras, callback);
- }
-
- /**
- * Sends a request to get the status of a media item.
- * <p>
- * The request is issued in the current session.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_GET_STATUS ACTION_GET_STATUS} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param itemId The item id.
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_GET_STATUS} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- *
- * @see MediaControlIntent#ACTION_GET_STATUS
- * @see #isRemotePlaybackSupported
- */
- public void getStatus(String itemId, Bundle extras, ItemActionCallback callback) {
- if (itemId == null) {
- throw new IllegalArgumentException("itemId must not be null");
- }
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_GET_STATUS);
- performItemAction(intent, mSessionId, itemId, extras, callback);
- }
-
- /**
- * Sends a request to remove a media item from the queue.
- * <p>
- * The request is issued in the current session.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_REMOVE ACTION_REMOVE} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param itemId The item id.
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_REMOVE} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- * @throws UnsupportedOperationException if the route does not support queuing.
- *
- * @see MediaControlIntent#ACTION_REMOVE
- * @see #isRemotePlaybackSupported
- * @see #isQueuingSupported
- */
- public void remove(String itemId, Bundle extras, ItemActionCallback callback) {
- if (itemId == null) {
- throw new IllegalArgumentException("itemId must not be null");
- }
- throwIfQueuingNotSupported();
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_REMOVE);
- performItemAction(intent, mSessionId, itemId, extras, callback);
- }
-
- /**
- * Sends a request to pause media playback.
- * <p>
- * The request is issued in the current session. If playback is already paused
- * then the request has no effect.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_PAUSE ACTION_PAUSE} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_PAUSE} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- *
- * @see MediaControlIntent#ACTION_PAUSE
- * @see #isRemotePlaybackSupported
- */
- public void pause(Bundle extras, SessionActionCallback callback) {
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_PAUSE);
- performSessionAction(intent, mSessionId, extras, callback);
- }
-
- /**
- * Sends a request to resume (unpause) media playback.
- * <p>
- * The request is issued in the current session. If playback is not paused
- * then the request has no effect.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_RESUME ACTION_RESUME} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_RESUME} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- *
- * @see MediaControlIntent#ACTION_RESUME
- * @see #isRemotePlaybackSupported
- */
- public void resume(Bundle extras, SessionActionCallback callback) {
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_RESUME);
- performSessionAction(intent, mSessionId, extras, callback);
- }
-
- /**
- * Sends a request to stop media playback and clear the media playback queue.
- * <p>
- * The request is issued in the current session. If the queue is already
- * empty then the request has no effect.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_STOP ACTION_STOP} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_STOP} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- *
- * @see MediaControlIntent#ACTION_STOP
- * @see #isRemotePlaybackSupported
- */
- public void stop(Bundle extras, SessionActionCallback callback) {
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_STOP);
- performSessionAction(intent, mSessionId, extras, callback);
- }
-
- /**
- * Sends a request to start a new media playback session.
- * <p>
- * The application must wait for the callback to indicate that this request
- * is complete before issuing other requests that affect the session. If this
- * request is successful then the previous session will be invalidated.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_START_SESSION ACTION_START_SESSION}
- * for more information about the semantics of this request.
- * </p>
- *
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_START_SESSION} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws UnsupportedOperationException if the route does not support session management.
- *
- * @see MediaControlIntent#ACTION_START_SESSION
- * @see #isRemotePlaybackSupported
- * @see #isSessionManagementSupported
- */
- public void startSession(Bundle extras, SessionActionCallback callback) {
- throwIfSessionManagementNotSupported();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_START_SESSION);
- intent.putExtra(MediaControlIntent.EXTRA_SESSION_STATUS_UPDATE_RECEIVER,
- mSessionStatusPendingIntent);
- if (mRouteSupportsMessaging) {
- intent.putExtra(MediaControlIntent.EXTRA_MESSAGE_RECEIVER, mMessagePendingIntent);
- }
- performSessionAction(intent, null, extras, callback);
- }
-
- /**
- * Sends a message.
- * <p>
- * The request is issued in the current session.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_SEND_MESSAGE} for
- * more information about the semantics of this request.
- * </p>
- *
- * @param message A bundle message denoting {@link MediaControlIntent#EXTRA_MESSAGE}.
- * @param callback A callback to invoke when the request has been processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- * @throws UnsupportedOperationException if the route does not support messages.
- *
- * @see MediaControlIntent#ACTION_SEND_MESSAGE
- * @see #isMessagingSupported
- */
- public void sendMessage(Bundle message, SessionActionCallback callback) {
- throwIfNoCurrentSession();
- throwIfMessageNotSupported();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_SEND_MESSAGE);
- performSessionAction(intent, mSessionId, message, callback);
- }
-
- /**
- * Sends a request to get the status of the media playback session.
- * <p>
- * The request is issued in the current session.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_GET_SESSION_STATUS
- * ACTION_GET_SESSION_STATUS} for more information about the semantics of this request.
- * </p>
- *
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_GET_SESSION_STATUS} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- * @throws UnsupportedOperationException if the route does not support session management.
- *
- * @see MediaControlIntent#ACTION_GET_SESSION_STATUS
- * @see #isRemotePlaybackSupported
- * @see #isSessionManagementSupported
- */
- public void getSessionStatus(Bundle extras, SessionActionCallback callback) {
- throwIfSessionManagementNotSupported();
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_GET_SESSION_STATUS);
- performSessionAction(intent, mSessionId, extras, callback);
- }
-
- /**
- * Sends a request to end the media playback session.
- * <p>
- * The request is issued in the current session. If this request is successful,
- * the {@link #getSessionId session id property} will be set to null after
- * the callback is invoked.
- * </p><p>
- * Please refer to {@link MediaControlIntent#ACTION_END_SESSION ACTION_END_SESSION}
- * for more information about the semantics of this request.
- * </p>
- *
- * @param extras A bundle of extra arguments to be added to the
- * {@link MediaControlIntent#ACTION_END_SESSION} intent, or null if none.
- * @param callback A callback to invoke when the request has been
- * processed, or null if none.
- *
- * @throws IllegalStateException if there is no current session.
- * @throws UnsupportedOperationException if the route does not support session management.
- *
- * @see MediaControlIntent#ACTION_END_SESSION
- * @see #isRemotePlaybackSupported
- * @see #isSessionManagementSupported
- */
- public void endSession(Bundle extras, SessionActionCallback callback) {
- throwIfSessionManagementNotSupported();
- throwIfNoCurrentSession();
-
- Intent intent = new Intent(MediaControlIntent.ACTION_END_SESSION);
- performSessionAction(intent, mSessionId, extras, callback);
- }
-
- private void performItemAction(final Intent intent,
- final String sessionId, final String itemId,
- Bundle extras, final ItemActionCallback callback) {
- intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
- if (sessionId != null) {
- intent.putExtra(MediaControlIntent.EXTRA_SESSION_ID, sessionId);
- }
- if (itemId != null) {
- intent.putExtra(MediaControlIntent.EXTRA_ITEM_ID, itemId);
- }
- if (extras != null) {
- intent.putExtras(extras);
- }
- logRequest(intent);
- mRoute.sendControlRequest(intent, new MediaRouter.ControlRequestCallback() {
- @Override
- public void onResult(Bundle data) {
- if (data != null) {
- String sessionIdResult = inferMissingResult(sessionId,
- data.getString(MediaControlIntent.EXTRA_SESSION_ID));
- MediaSessionStatus sessionStatus = MediaSessionStatus.fromBundle(
- data.getBundle(MediaControlIntent.EXTRA_SESSION_STATUS));
- String itemIdResult = inferMissingResult(itemId,
- data.getString(MediaControlIntent.EXTRA_ITEM_ID));
- MediaItemStatus itemStatus = MediaItemStatus.fromBundle(
- data.getBundle(MediaControlIntent.EXTRA_ITEM_STATUS));
- adoptSession(sessionIdResult);
- if (sessionIdResult != null && itemIdResult != null && itemStatus != null) {
- if (DEBUG) {
- Log.d(TAG, "Received result from " + intent.getAction()
- + ": data=" + bundleToString(data)
- + ", sessionId=" + sessionIdResult
- + ", sessionStatus=" + sessionStatus
- + ", itemId=" + itemIdResult
- + ", itemStatus=" + itemStatus);
- }
- callback.onResult(data, sessionIdResult, sessionStatus,
- itemIdResult, itemStatus);
- return;
- }
- }
- handleInvalidResult(intent, callback, data);
- }
-
- @Override
- public void onError(String error, Bundle data) {
- handleError(intent, callback, error, data);
- }
- });
- }
-
- private void performSessionAction(final Intent intent, final String sessionId,
- Bundle extras, final SessionActionCallback callback) {
- intent.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
- if (sessionId != null) {
- intent.putExtra(MediaControlIntent.EXTRA_SESSION_ID, sessionId);
- }
- if (extras != null) {
- intent.putExtras(extras);
- }
- logRequest(intent);
- mRoute.sendControlRequest(intent, new MediaRouter.ControlRequestCallback() {
- @Override
- public void onResult(Bundle data) {
- if (data != null) {
- String sessionIdResult = inferMissingResult(sessionId,
- data.getString(MediaControlIntent.EXTRA_SESSION_ID));
- MediaSessionStatus sessionStatus = MediaSessionStatus.fromBundle(
- data.getBundle(MediaControlIntent.EXTRA_SESSION_STATUS));
- adoptSession(sessionIdResult);
- if (sessionIdResult != null) {
- if (DEBUG) {
- Log.d(TAG, "Received result from " + intent.getAction()
- + ": data=" + bundleToString(data)
- + ", sessionId=" + sessionIdResult
- + ", sessionStatus=" + sessionStatus);
- }
- try {
- callback.onResult(data, sessionIdResult, sessionStatus);
- } finally {
- if (intent.getAction().equals(MediaControlIntent.ACTION_END_SESSION)
- && sessionIdResult.equals(mSessionId)) {
- setSessionId(null);
- }
- }
- return;
- }
- }
- handleInvalidResult(intent, callback, data);
- }
-
- @Override
- public void onError(String error, Bundle data) {
- handleError(intent, callback, error, data);
- }
- });
- }
-
- void adoptSession(String sessionId) {
- if (sessionId != null) {
- setSessionId(sessionId);
- }
- }
-
- void handleInvalidResult(Intent intent, ActionCallback callback,
- Bundle data) {
- Log.w(TAG, "Received invalid result data from " + intent.getAction()
- + ": data=" + bundleToString(data));
- callback.onError(null, MediaControlIntent.ERROR_UNKNOWN, data);
- }
-
- void handleError(Intent intent, ActionCallback callback,
- String error, Bundle data) {
- final int code;
- if (data != null) {
- code = data.getInt(MediaControlIntent.EXTRA_ERROR_CODE,
- MediaControlIntent.ERROR_UNKNOWN);
- } else {
- code = MediaControlIntent.ERROR_UNKNOWN;
- }
- if (DEBUG) {
- Log.w(TAG, "Received error from " + intent.getAction()
- + ": error=" + error
- + ", code=" + code
- + ", data=" + bundleToString(data));
- }
- callback.onError(error, code, data);
- }
-
- private void detectFeatures() {
- mRouteSupportsRemotePlayback = routeSupportsAction(MediaControlIntent.ACTION_PLAY)
- && routeSupportsAction(MediaControlIntent.ACTION_SEEK)
- && routeSupportsAction(MediaControlIntent.ACTION_GET_STATUS)
- && routeSupportsAction(MediaControlIntent.ACTION_PAUSE)
- && routeSupportsAction(MediaControlIntent.ACTION_RESUME)
- && routeSupportsAction(MediaControlIntent.ACTION_STOP);
- mRouteSupportsQueuing = mRouteSupportsRemotePlayback
- && routeSupportsAction(MediaControlIntent.ACTION_ENQUEUE)
- && routeSupportsAction(MediaControlIntent.ACTION_REMOVE);
- mRouteSupportsSessionManagement = mRouteSupportsRemotePlayback
- && routeSupportsAction(MediaControlIntent.ACTION_START_SESSION)
- && routeSupportsAction(MediaControlIntent.ACTION_GET_SESSION_STATUS)
- && routeSupportsAction(MediaControlIntent.ACTION_END_SESSION);
- mRouteSupportsMessaging = doesRouteSupportMessaging();
- }
-
- private boolean routeSupportsAction(String action) {
- return mRoute.supportsControlAction(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK, action);
- }
-
- private boolean doesRouteSupportMessaging() {
- for (IntentFilter filter : mRoute.getControlFilters()) {
- if (filter.hasAction(MediaControlIntent.ACTION_SEND_MESSAGE)) {
- return true;
- }
- }
- return false;
- }
-
- private void throwIfRemotePlaybackNotSupported() {
- if (!mRouteSupportsRemotePlayback) {
- throw new UnsupportedOperationException("The route does not support remote playback.");
- }
- }
-
- private void throwIfQueuingNotSupported() {
- if (!mRouteSupportsQueuing) {
- throw new UnsupportedOperationException("The route does not support queuing.");
- }
- }
-
- private void throwIfSessionManagementNotSupported() {
- if (!mRouteSupportsSessionManagement) {
- throw new UnsupportedOperationException("The route does not support "
- + "session management.");
- }
- }
-
- private void throwIfMessageNotSupported() {
- if (!mRouteSupportsMessaging) {
- throw new UnsupportedOperationException("The route does not support message.");
- }
- }
-
- private void throwIfNoCurrentSession() {
- if (mSessionId == null) {
- throw new IllegalStateException("There is no current session.");
- }
- }
-
- static String inferMissingResult(String request, String result) {
- if (result == null) {
- // Result is missing.
- return request;
- }
- if (request == null || request.equals(result)) {
- // Request didn't specify a value or result matches request.
- return result;
- }
- // Result conflicts with request.
- return null;
- }
-
- private static void logRequest(Intent intent) {
- if (DEBUG) {
- Log.d(TAG, "Sending request: " + intent);
- }
- }
-
- static String bundleToString(Bundle bundle) {
- if (bundle != null) {
- bundle.size(); // force bundle to be unparcelled
- return bundle.toString();
- }
- return "null";
- }
-
- private final class ActionReceiver extends BroadcastReceiver {
- public static final String ACTION_ITEM_STATUS_CHANGED =
- "androidx.mediarouter.media.actions.ACTION_ITEM_STATUS_CHANGED";
- public static final String ACTION_SESSION_STATUS_CHANGED =
- "androidx.mediarouter.media.actions.ACTION_SESSION_STATUS_CHANGED";
- public static final String ACTION_MESSAGE_RECEIVED =
- "androidx.mediarouter.media.actions.ACTION_MESSAGE_RECEIVED";
-
- ActionReceiver() {
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String sessionId = intent.getStringExtra(MediaControlIntent.EXTRA_SESSION_ID);
- if (sessionId == null || !sessionId.equals(mSessionId)) {
- Log.w(TAG, "Discarding spurious status callback "
- + "with missing or invalid session id: sessionId=" + sessionId);
- return;
- }
-
- MediaSessionStatus sessionStatus = MediaSessionStatus.fromBundle(
- intent.getBundleExtra(MediaControlIntent.EXTRA_SESSION_STATUS));
- String action = intent.getAction();
- if (action.equals(ACTION_ITEM_STATUS_CHANGED)) {
- String itemId = intent.getStringExtra(MediaControlIntent.EXTRA_ITEM_ID);
- if (itemId == null) {
- Log.w(TAG, "Discarding spurious status callback with missing item id.");
- return;
- }
-
- MediaItemStatus itemStatus = MediaItemStatus.fromBundle(
- intent.getBundleExtra(MediaControlIntent.EXTRA_ITEM_STATUS));
- if (itemStatus == null) {
- Log.w(TAG, "Discarding spurious status callback with missing item status.");
- return;
- }
-
- if (DEBUG) {
- Log.d(TAG, "Received item status callback: sessionId=" + sessionId
- + ", sessionStatus=" + sessionStatus
- + ", itemId=" + itemId
- + ", itemStatus=" + itemStatus);
- }
-
- if (mStatusCallback != null) {
- mStatusCallback.onItemStatusChanged(intent.getExtras(),
- sessionId, sessionStatus, itemId, itemStatus);
- }
- } else if (action.equals(ACTION_SESSION_STATUS_CHANGED)) {
- if (sessionStatus == null) {
- Log.w(TAG, "Discarding spurious media status callback with "
- +"missing session status.");
- return;
- }
-
- if (DEBUG) {
- Log.d(TAG, "Received session status callback: sessionId=" + sessionId
- + ", sessionStatus=" + sessionStatus);
- }
-
- if (mStatusCallback != null) {
- mStatusCallback.onSessionStatusChanged(intent.getExtras(),
- sessionId, sessionStatus);
- }
- } else if (action.equals(ACTION_MESSAGE_RECEIVED)) {
- if (DEBUG) {
- Log.d(TAG, "Received message callback: sessionId=" + sessionId);
- }
-
- if (mOnMessageReceivedListener != null) {
- mOnMessageReceivedListener.onMessageReceived(sessionId,
- intent.getBundleExtra(MediaControlIntent.EXTRA_MESSAGE));
- }
- }
- }
- }
-
- /**
- * A callback that will receive media status updates.
- */
- public static abstract class StatusCallback {
- /**
- * Called when the status of a media item changes.
- *
- * @param data The result data bundle.
- * @param sessionId The session id.
- * @param sessionStatus The session status, or null if unknown.
- * @param itemId The item id.
- * @param itemStatus The item status.
- */
- public void onItemStatusChanged(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus,
- String itemId, MediaItemStatus itemStatus) {
- }
-
- /**
- * Called when the status of a media session changes.
- *
- * @param data The result data bundle.
- * @param sessionId The session id.
- * @param sessionStatus The session status, or null if unknown.
- */
- public void onSessionStatusChanged(Bundle data,
- String sessionId, MediaSessionStatus sessionStatus) {
- }
-
- /**
- * Called when the session of the remote playback client changes.
- *
- * @param sessionId The new session id.
- */
- public void onSessionChanged(String sessionId) {
- }
- }
-
- /**
- * Base callback type for remote playback requests.
- */
- public static abstract class ActionCallback {
- /**
- * Called when a media control request fails.
- *
- * @param error A localized error message which may be shown to the user, or null
- * if the cause of the error is unclear.
- * @param code The error code, or {@link MediaControlIntent#ERROR_UNKNOWN} if unknown.
- * @param data The error data bundle, or null if none.
- */
- public void onError(String error, int code, Bundle data) {
- }
- }
-
- /**
- * Callback for remote playback requests that operate on items.
- */
- public static abstract class ItemActionCallback extends ActionCallback {
- /**
- * Called when the request succeeds.
- *
- * @param data The result data bundle.
- * @param sessionId The session id.
- * @param sessionStatus The session status, or null if unknown.
- * @param itemId The item id.
- * @param itemStatus The item status.
- */
- public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus,
- String itemId, MediaItemStatus itemStatus) {
- }
- }
-
- /**
- * Callback for remote playback requests that operate on sessions.
- */
- public static abstract class SessionActionCallback extends ActionCallback {
- /**
- * Called when the request succeeds.
- *
- * @param data The result data bundle.
- * @param sessionId The session id.
- * @param sessionStatus The session status, or null if unknown.
- */
- public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus) {
- }
- }
-
- /**
- * A callback that will receive messages from media sessions.
- */
- public interface OnMessageReceivedListener {
- /**
- * Called when a message received.
- *
- * @param sessionId The session id.
- * @param message A bundle message denoting {@link MediaControlIntent#EXTRA_MESSAGE}.
- */
- void onMessageReceived(String sessionId, Bundle message);
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/SystemMediaRouteProvider.java b/packages/MediaComponents/src/com/android/support/mediarouter/media/SystemMediaRouteProvider.java
deleted file mode 100644
index 53901a4..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/SystemMediaRouteProvider.java
+++ /dev/null
@@ -1,882 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.support.mediarouter.media;
-
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.media.AudioManager;
-import android.os.Build;
-import android.view.Display;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * Provides routes for built-in system destinations such as the local display
- * and speaker. On Jellybean and newer platform releases, queries the framework
- * MediaRouter for framework-provided routes and registers non-framework-provided
- * routes as user routes.
- */
-abstract class SystemMediaRouteProvider extends MediaRouteProvider {
- private static final String TAG = "SystemMediaRouteProvider";
-
- public static final String PACKAGE_NAME = "android";
- public static final String DEFAULT_ROUTE_ID = "DEFAULT_ROUTE";
-
- protected SystemMediaRouteProvider(Context context) {
- super(context, new ProviderMetadata(new ComponentName(PACKAGE_NAME,
- SystemMediaRouteProvider.class.getName())));
- }
-
- public static SystemMediaRouteProvider obtain(Context context, SyncCallback syncCallback) {
- if (Build.VERSION.SDK_INT >= 24) {
- return new Api24Impl(context, syncCallback);
- }
- if (Build.VERSION.SDK_INT >= 18) {
- return new JellybeanMr2Impl(context, syncCallback);
- }
- if (Build.VERSION.SDK_INT >= 17) {
- return new JellybeanMr1Impl(context, syncCallback);
- }
- if (Build.VERSION.SDK_INT >= 16) {
- return new JellybeanImpl(context, syncCallback);
- }
- return new LegacyImpl(context);
- }
-
- /**
- * Called by the media router when a route is added to synchronize state with
- * the framework media router.
- */
- public void onSyncRouteAdded(MediaRouter.RouteInfo route) {
- }
-
- /**
- * Called by the media router when a route is removed to synchronize state with
- * the framework media router.
- */
- public void onSyncRouteRemoved(MediaRouter.RouteInfo route) {
- }
-
- /**
- * Called by the media router when a route is changed to synchronize state with
- * the framework media router.
- */
- public void onSyncRouteChanged(MediaRouter.RouteInfo route) {
- }
-
- /**
- * Called by the media router when a route is selected to synchronize state with
- * the framework media router.
- */
- public void onSyncRouteSelected(MediaRouter.RouteInfo route) {
- }
-
- /**
- * Callbacks into the media router to synchronize state with the framework media router.
- */
- public interface SyncCallback {
- void onSystemRouteSelectedByDescriptorId(String id);
- }
-
- protected Object getDefaultRoute() {
- return null;
- }
-
- protected Object getSystemRoute(MediaRouter.RouteInfo route) {
- return null;
- }
-
- /**
- * Legacy implementation for platform versions prior to Jellybean.
- */
- static class LegacyImpl extends SystemMediaRouteProvider {
- static final int PLAYBACK_STREAM = AudioManager.STREAM_MUSIC;
-
- private static final ArrayList<IntentFilter> CONTROL_FILTERS;
- static {
- IntentFilter f = new IntentFilter();
- f.addCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO);
- f.addCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
-
- CONTROL_FILTERS = new ArrayList<IntentFilter>();
- CONTROL_FILTERS.add(f);
- }
-
- final AudioManager mAudioManager;
- private final VolumeChangeReceiver mVolumeChangeReceiver;
- int mLastReportedVolume = -1;
-
- public LegacyImpl(Context context) {
- super(context);
- mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
- mVolumeChangeReceiver = new VolumeChangeReceiver();
-
- context.registerReceiver(mVolumeChangeReceiver,
- new IntentFilter(VolumeChangeReceiver.VOLUME_CHANGED_ACTION));
- publishRoutes();
- }
-
- void publishRoutes() {
- Resources r = getContext().getResources();
- int maxVolume = mAudioManager.getStreamMaxVolume(PLAYBACK_STREAM);
- mLastReportedVolume = mAudioManager.getStreamVolume(PLAYBACK_STREAM);
- MediaRouteDescriptor defaultRoute = new MediaRouteDescriptor.Builder(
- DEFAULT_ROUTE_ID, r.getString(R.string.mr_system_route_name))
- .addControlFilters(CONTROL_FILTERS)
- .setPlaybackStream(PLAYBACK_STREAM)
- .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_LOCAL)
- .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
- .setVolumeMax(maxVolume)
- .setVolume(mLastReportedVolume)
- .build();
-
- MediaRouteProviderDescriptor providerDescriptor =
- new MediaRouteProviderDescriptor.Builder()
- .addRoute(defaultRoute)
- .build();
- setDescriptor(providerDescriptor);
- }
-
- @Override
- public RouteController onCreateRouteController(String routeId) {
- if (routeId.equals(DEFAULT_ROUTE_ID)) {
- return new DefaultRouteController();
- }
- return null;
- }
-
- final class DefaultRouteController extends RouteController {
- @Override
- public void onSetVolume(int volume) {
- mAudioManager.setStreamVolume(PLAYBACK_STREAM, volume, 0);
- publishRoutes();
- }
-
- @Override
- public void onUpdateVolume(int delta) {
- int volume = mAudioManager.getStreamVolume(PLAYBACK_STREAM);
- int maxVolume = mAudioManager.getStreamMaxVolume(PLAYBACK_STREAM);
- int newVolume = Math.min(maxVolume, Math.max(0, volume + delta));
- if (newVolume != volume) {
- mAudioManager.setStreamVolume(PLAYBACK_STREAM, volume, 0);
- }
- publishRoutes();
- }
- }
-
- final class VolumeChangeReceiver extends BroadcastReceiver {
- // These constants come from AudioManager.
- public static final String VOLUME_CHANGED_ACTION =
- "android.media.VOLUME_CHANGED_ACTION";
- public static final String EXTRA_VOLUME_STREAM_TYPE =
- "android.media.EXTRA_VOLUME_STREAM_TYPE";
- public static final String EXTRA_VOLUME_STREAM_VALUE =
- "android.media.EXTRA_VOLUME_STREAM_VALUE";
-
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(VOLUME_CHANGED_ACTION)) {
- final int streamType = intent.getIntExtra(EXTRA_VOLUME_STREAM_TYPE, -1);
- if (streamType == PLAYBACK_STREAM) {
- final int volume = intent.getIntExtra(EXTRA_VOLUME_STREAM_VALUE, -1);
- if (volume >= 0 && volume != mLastReportedVolume) {
- publishRoutes();
- }
- }
- }
- }
- }
- }
-
- /**
- * Jellybean implementation.
- */
- // @@RequiresApi(16)
- static class JellybeanImpl extends SystemMediaRouteProvider
- implements MediaRouterJellybean.Callback, MediaRouterJellybean.VolumeCallback {
- private static final ArrayList<IntentFilter> LIVE_AUDIO_CONTROL_FILTERS;
- static {
- IntentFilter f = new IntentFilter();
- f.addCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO);
-
- LIVE_AUDIO_CONTROL_FILTERS = new ArrayList<IntentFilter>();
- LIVE_AUDIO_CONTROL_FILTERS.add(f);
- }
-
- private static final ArrayList<IntentFilter> LIVE_VIDEO_CONTROL_FILTERS;
- static {
- IntentFilter f = new IntentFilter();
- f.addCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
-
- LIVE_VIDEO_CONTROL_FILTERS = new ArrayList<IntentFilter>();
- LIVE_VIDEO_CONTROL_FILTERS.add(f);
- }
-
- private final SyncCallback mSyncCallback;
-
- protected final Object mRouterObj;
- protected final Object mCallbackObj;
- protected final Object mVolumeCallbackObj;
- protected final Object mUserRouteCategoryObj;
- protected int mRouteTypes;
- protected boolean mActiveScan;
- protected boolean mCallbackRegistered;
-
- // Maintains an association from framework routes to support library routes.
- // Note that we cannot use the tag field for this because an application may
- // have published its own user routes to the framework media router and already
- // used the tag for its own purposes.
- protected final ArrayList<SystemRouteRecord> mSystemRouteRecords =
- new ArrayList<SystemRouteRecord>();
-
- // Maintains an association from support library routes to framework routes.
- protected final ArrayList<UserRouteRecord> mUserRouteRecords =
- new ArrayList<UserRouteRecord>();
-
- private MediaRouterJellybean.SelectRouteWorkaround mSelectRouteWorkaround;
- private MediaRouterJellybean.GetDefaultRouteWorkaround mGetDefaultRouteWorkaround;
-
- public JellybeanImpl(Context context, SyncCallback syncCallback) {
- super(context);
- mSyncCallback = syncCallback;
- mRouterObj = MediaRouterJellybean.getMediaRouter(context);
- mCallbackObj = createCallbackObj();
- mVolumeCallbackObj = createVolumeCallbackObj();
-
- Resources r = ApiHelper.getLibResources(context);
- mUserRouteCategoryObj = MediaRouterJellybean.createRouteCategory(
- mRouterObj, r.getString(R.string.mr_user_route_category_name), false);
-
- updateSystemRoutes();
- }
-
- @Override
- public RouteController onCreateRouteController(String routeId) {
- int index = findSystemRouteRecordByDescriptorId(routeId);
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- return new SystemRouteController(record.mRouteObj);
- }
- return null;
- }
-
- @Override
- public void onDiscoveryRequestChanged(MediaRouteDiscoveryRequest request) {
- int newRouteTypes = 0;
- boolean newActiveScan = false;
- if (request != null) {
- final MediaRouteSelector selector = request.getSelector();
- final List<String> categories = selector.getControlCategories();
- final int count = categories.size();
- for (int i = 0; i < count; i++) {
- String category = categories.get(i);
- if (category.equals(MediaControlIntent.CATEGORY_LIVE_AUDIO)) {
- newRouteTypes |= MediaRouterJellybean.ROUTE_TYPE_LIVE_AUDIO;
- } else if (category.equals(MediaControlIntent.CATEGORY_LIVE_VIDEO)) {
- newRouteTypes |= MediaRouterJellybean.ROUTE_TYPE_LIVE_VIDEO;
- } else {
- newRouteTypes |= MediaRouterJellybean.ROUTE_TYPE_USER;
- }
- }
- newActiveScan = request.isActiveScan();
- }
-
- if (mRouteTypes != newRouteTypes || mActiveScan != newActiveScan) {
- mRouteTypes = newRouteTypes;
- mActiveScan = newActiveScan;
- updateSystemRoutes();
- }
- }
-
- @Override
- public void onRouteAdded(Object routeObj) {
- if (addSystemRouteNoPublish(routeObj)) {
- publishRoutes();
- }
- }
-
- private void updateSystemRoutes() {
- updateCallback();
- boolean changed = false;
- for (Object routeObj : MediaRouterJellybean.getRoutes(mRouterObj)) {
- changed |= addSystemRouteNoPublish(routeObj);
- }
- if (changed) {
- publishRoutes();
- }
- }
-
- private boolean addSystemRouteNoPublish(Object routeObj) {
- if (getUserRouteRecord(routeObj) == null
- && findSystemRouteRecord(routeObj) < 0) {
- String id = assignRouteId(routeObj);
- SystemRouteRecord record = new SystemRouteRecord(routeObj, id);
- updateSystemRouteDescriptor(record);
- mSystemRouteRecords.add(record);
- return true;
- }
- return false;
- }
-
- private String assignRouteId(Object routeObj) {
- // TODO: The framework media router should supply a unique route id that
- // we can use here. For now we use a hash of the route name and take care
- // to dedupe it.
- boolean isDefault = (getDefaultRoute() == routeObj);
- String id = isDefault ? DEFAULT_ROUTE_ID :
- String.format(Locale.US, "ROUTE_%08x", getRouteName(routeObj).hashCode());
- if (findSystemRouteRecordByDescriptorId(id) < 0) {
- return id;
- }
- for (int i = 2; ; i++) {
- String newId = String.format(Locale.US, "%s_%d", id, i);
- if (findSystemRouteRecordByDescriptorId(newId) < 0) {
- return newId;
- }
- }
- }
-
- @Override
- public void onRouteRemoved(Object routeObj) {
- if (getUserRouteRecord(routeObj) == null) {
- int index = findSystemRouteRecord(routeObj);
- if (index >= 0) {
- mSystemRouteRecords.remove(index);
- publishRoutes();
- }
- }
- }
-
- @Override
- public void onRouteChanged(Object routeObj) {
- if (getUserRouteRecord(routeObj) == null) {
- int index = findSystemRouteRecord(routeObj);
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- updateSystemRouteDescriptor(record);
- publishRoutes();
- }
- }
- }
-
- @Override
- public void onRouteVolumeChanged(Object routeObj) {
- if (getUserRouteRecord(routeObj) == null) {
- int index = findSystemRouteRecord(routeObj);
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- int newVolume = MediaRouterJellybean.RouteInfo.getVolume(routeObj);
- if (newVolume != record.mRouteDescriptor.getVolume()) {
- record.mRouteDescriptor =
- new MediaRouteDescriptor.Builder(record.mRouteDescriptor)
- .setVolume(newVolume)
- .build();
- publishRoutes();
- }
- }
- }
- }
-
- @Override
- public void onRouteSelected(int type, Object routeObj) {
- if (routeObj != MediaRouterJellybean.getSelectedRoute(mRouterObj,
- MediaRouterJellybean.ALL_ROUTE_TYPES)) {
- // The currently selected route has already changed so this callback
- // is stale. Drop it to prevent getting into sync loops.
- return;
- }
-
- UserRouteRecord userRouteRecord = getUserRouteRecord(routeObj);
- if (userRouteRecord != null) {
- userRouteRecord.mRoute.select();
- } else {
- // Select the route if it already exists in the compat media router.
- // If not, we will select it instead when the route is added.
- int index = findSystemRouteRecord(routeObj);
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- mSyncCallback.onSystemRouteSelectedByDescriptorId(record.mRouteDescriptorId);
- }
- }
- }
-
- @Override
- public void onRouteUnselected(int type, Object routeObj) {
- // Nothing to do when a route is unselected.
- // We only need to handle when a route is selected.
- }
-
- @Override
- public void onRouteGrouped(Object routeObj, Object groupObj, int index) {
- // Route grouping is deprecated and no longer supported.
- }
-
- @Override
- public void onRouteUngrouped(Object routeObj, Object groupObj) {
- // Route grouping is deprecated and no longer supported.
- }
-
- @Override
- public void onVolumeSetRequest(Object routeObj, int volume) {
- UserRouteRecord record = getUserRouteRecord(routeObj);
- if (record != null) {
- record.mRoute.requestSetVolume(volume);
- }
- }
-
- @Override
- public void onVolumeUpdateRequest(Object routeObj, int direction) {
- UserRouteRecord record = getUserRouteRecord(routeObj);
- if (record != null) {
- record.mRoute.requestUpdateVolume(direction);
- }
- }
-
- @Override
- public void onSyncRouteAdded(MediaRouter.RouteInfo route) {
- if (route.getProviderInstance() != this) {
- Object routeObj = MediaRouterJellybean.createUserRoute(
- mRouterObj, mUserRouteCategoryObj);
- UserRouteRecord record = new UserRouteRecord(route, routeObj);
- MediaRouterJellybean.RouteInfo.setTag(routeObj, record);
- MediaRouterJellybean.UserRouteInfo.setVolumeCallback(routeObj, mVolumeCallbackObj);
- updateUserRouteProperties(record);
- mUserRouteRecords.add(record);
- MediaRouterJellybean.addUserRoute(mRouterObj, routeObj);
- } else {
- // If the newly added route is the counterpart of the currently selected
- // route in the framework media router then ensure it is selected in
- // the compat media router.
- Object routeObj = MediaRouterJellybean.getSelectedRoute(
- mRouterObj, MediaRouterJellybean.ALL_ROUTE_TYPES);
- int index = findSystemRouteRecord(routeObj);
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- if (record.mRouteDescriptorId.equals(route.getDescriptorId())) {
- route.select();
- }
- }
- }
- }
-
- @Override
- public void onSyncRouteRemoved(MediaRouter.RouteInfo route) {
- if (route.getProviderInstance() != this) {
- int index = findUserRouteRecord(route);
- if (index >= 0) {
- UserRouteRecord record = mUserRouteRecords.remove(index);
- MediaRouterJellybean.RouteInfo.setTag(record.mRouteObj, null);
- MediaRouterJellybean.UserRouteInfo.setVolumeCallback(record.mRouteObj, null);
- MediaRouterJellybean.removeUserRoute(mRouterObj, record.mRouteObj);
- }
- }
- }
-
- @Override
- public void onSyncRouteChanged(MediaRouter.RouteInfo route) {
- if (route.getProviderInstance() != this) {
- int index = findUserRouteRecord(route);
- if (index >= 0) {
- UserRouteRecord record = mUserRouteRecords.get(index);
- updateUserRouteProperties(record);
- }
- }
- }
-
- @Override
- public void onSyncRouteSelected(MediaRouter.RouteInfo route) {
- if (!route.isSelected()) {
- // The currently selected route has already changed so this callback
- // is stale. Drop it to prevent getting into sync loops.
- return;
- }
-
- if (route.getProviderInstance() != this) {
- int index = findUserRouteRecord(route);
- if (index >= 0) {
- UserRouteRecord record = mUserRouteRecords.get(index);
- selectRoute(record.mRouteObj);
- }
- } else {
- int index = findSystemRouteRecordByDescriptorId(route.getDescriptorId());
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- selectRoute(record.mRouteObj);
- }
- }
- }
-
- protected void publishRoutes() {
- MediaRouteProviderDescriptor.Builder builder =
- new MediaRouteProviderDescriptor.Builder();
- int count = mSystemRouteRecords.size();
- for (int i = 0; i < count; i++) {
- builder.addRoute(mSystemRouteRecords.get(i).mRouteDescriptor);
- }
-
- setDescriptor(builder.build());
- }
-
- protected int findSystemRouteRecord(Object routeObj) {
- final int count = mSystemRouteRecords.size();
- for (int i = 0; i < count; i++) {
- if (mSystemRouteRecords.get(i).mRouteObj == routeObj) {
- return i;
- }
- }
- return -1;
- }
-
- protected int findSystemRouteRecordByDescriptorId(String id) {
- final int count = mSystemRouteRecords.size();
- for (int i = 0; i < count; i++) {
- if (mSystemRouteRecords.get(i).mRouteDescriptorId.equals(id)) {
- return i;
- }
- }
- return -1;
- }
-
- protected int findUserRouteRecord(MediaRouter.RouteInfo route) {
- final int count = mUserRouteRecords.size();
- for (int i = 0; i < count; i++) {
- if (mUserRouteRecords.get(i).mRoute == route) {
- return i;
- }
- }
- return -1;
- }
-
- protected UserRouteRecord getUserRouteRecord(Object routeObj) {
- Object tag = MediaRouterJellybean.RouteInfo.getTag(routeObj);
- return tag instanceof UserRouteRecord ? (UserRouteRecord)tag : null;
- }
-
- protected void updateSystemRouteDescriptor(SystemRouteRecord record) {
- // We must always recreate the route descriptor when making any changes
- // because they are intended to be immutable once published.
- MediaRouteDescriptor.Builder builder = new MediaRouteDescriptor.Builder(
- record.mRouteDescriptorId, getRouteName(record.mRouteObj));
- onBuildSystemRouteDescriptor(record, builder);
- record.mRouteDescriptor = builder.build();
- }
-
- protected String getRouteName(Object routeObj) {
- // Routes should not have null names but it may happen for badly configured
- // user routes. We tolerate this by using an empty name string here but
- // such unnamed routes will be discarded by the media router upstream
- // (with a log message so we can track down the problem).
- CharSequence name = MediaRouterJellybean.RouteInfo.getName(routeObj, getContext());
- return name != null ? name.toString() : "";
- }
-
- protected void onBuildSystemRouteDescriptor(SystemRouteRecord record,
- MediaRouteDescriptor.Builder builder) {
- int supportedTypes = MediaRouterJellybean.RouteInfo.getSupportedTypes(
- record.mRouteObj);
- if ((supportedTypes & MediaRouterJellybean.ROUTE_TYPE_LIVE_AUDIO) != 0) {
- builder.addControlFilters(LIVE_AUDIO_CONTROL_FILTERS);
- }
- if ((supportedTypes & MediaRouterJellybean.ROUTE_TYPE_LIVE_VIDEO) != 0) {
- builder.addControlFilters(LIVE_VIDEO_CONTROL_FILTERS);
- }
-
- builder.setPlaybackType(
- MediaRouterJellybean.RouteInfo.getPlaybackType(record.mRouteObj));
- builder.setPlaybackStream(
- MediaRouterJellybean.RouteInfo.getPlaybackStream(record.mRouteObj));
- builder.setVolume(
- MediaRouterJellybean.RouteInfo.getVolume(record.mRouteObj));
- builder.setVolumeMax(
- MediaRouterJellybean.RouteInfo.getVolumeMax(record.mRouteObj));
- builder.setVolumeHandling(
- MediaRouterJellybean.RouteInfo.getVolumeHandling(record.mRouteObj));
- }
-
- protected void updateUserRouteProperties(UserRouteRecord record) {
- MediaRouterJellybean.UserRouteInfo.setName(
- record.mRouteObj, record.mRoute.getName());
- MediaRouterJellybean.UserRouteInfo.setPlaybackType(
- record.mRouteObj, record.mRoute.getPlaybackType());
- MediaRouterJellybean.UserRouteInfo.setPlaybackStream(
- record.mRouteObj, record.mRoute.getPlaybackStream());
- MediaRouterJellybean.UserRouteInfo.setVolume(
- record.mRouteObj, record.mRoute.getVolume());
- MediaRouterJellybean.UserRouteInfo.setVolumeMax(
- record.mRouteObj, record.mRoute.getVolumeMax());
- MediaRouterJellybean.UserRouteInfo.setVolumeHandling(
- record.mRouteObj, record.mRoute.getVolumeHandling());
- }
-
- protected void updateCallback() {
- if (mCallbackRegistered) {
- mCallbackRegistered = false;
- MediaRouterJellybean.removeCallback(mRouterObj, mCallbackObj);
- }
-
- if (mRouteTypes != 0) {
- mCallbackRegistered = true;
- MediaRouterJellybean.addCallback(mRouterObj, mRouteTypes, mCallbackObj);
- }
- }
-
- protected Object createCallbackObj() {
- return MediaRouterJellybean.createCallback(this);
- }
-
- protected Object createVolumeCallbackObj() {
- return MediaRouterJellybean.createVolumeCallback(this);
- }
-
- protected void selectRoute(Object routeObj) {
- if (mSelectRouteWorkaround == null) {
- mSelectRouteWorkaround = new MediaRouterJellybean.SelectRouteWorkaround();
- }
- mSelectRouteWorkaround.selectRoute(mRouterObj,
- MediaRouterJellybean.ALL_ROUTE_TYPES, routeObj);
- }
-
- @Override
- protected Object getDefaultRoute() {
- if (mGetDefaultRouteWorkaround == null) {
- mGetDefaultRouteWorkaround = new MediaRouterJellybean.GetDefaultRouteWorkaround();
- }
- return mGetDefaultRouteWorkaround.getDefaultRoute(mRouterObj);
- }
-
- @Override
- protected Object getSystemRoute(MediaRouter.RouteInfo route) {
- if (route == null) {
- return null;
- }
- int index = findSystemRouteRecordByDescriptorId(route.getDescriptorId());
- if (index >= 0) {
- return mSystemRouteRecords.get(index).mRouteObj;
- }
- return null;
- }
-
- /**
- * Represents a route that is provided by the framework media router
- * and published by this route provider to the support library media router.
- */
- protected static final class SystemRouteRecord {
- public final Object mRouteObj;
- public final String mRouteDescriptorId;
- public MediaRouteDescriptor mRouteDescriptor; // assigned immediately after creation
-
- public SystemRouteRecord(Object routeObj, String id) {
- mRouteObj = routeObj;
- mRouteDescriptorId = id;
- }
- }
-
- /**
- * Represents a route that is provided by the support library media router
- * and published by this route provider to the framework media router.
- */
- protected static final class UserRouteRecord {
- public final MediaRouter.RouteInfo mRoute;
- public final Object mRouteObj;
-
- public UserRouteRecord(MediaRouter.RouteInfo route, Object routeObj) {
- mRoute = route;
- mRouteObj = routeObj;
- }
- }
-
- protected static final class SystemRouteController extends RouteController {
- private final Object mRouteObj;
-
- public SystemRouteController(Object routeObj) {
- mRouteObj = routeObj;
- }
-
- @Override
- public void onSetVolume(int volume) {
- MediaRouterJellybean.RouteInfo.requestSetVolume(mRouteObj, volume);
- }
-
- @Override
- public void onUpdateVolume(int delta) {
- MediaRouterJellybean.RouteInfo.requestUpdateVolume(mRouteObj, delta);
- }
- }
- }
-
- /**
- * Jellybean MR1 implementation.
- */
- // @@RequiresApi(17)
- private static class JellybeanMr1Impl extends JellybeanImpl
- implements MediaRouterJellybeanMr1.Callback {
- private MediaRouterJellybeanMr1.ActiveScanWorkaround mActiveScanWorkaround;
- private MediaRouterJellybeanMr1.IsConnectingWorkaround mIsConnectingWorkaround;
-
- public JellybeanMr1Impl(Context context, SyncCallback syncCallback) {
- super(context, syncCallback);
- }
-
- @Override
- public void onRoutePresentationDisplayChanged(Object routeObj) {
- int index = findSystemRouteRecord(routeObj);
- if (index >= 0) {
- SystemRouteRecord record = mSystemRouteRecords.get(index);
- Display newPresentationDisplay =
- MediaRouterJellybeanMr1.RouteInfo.getPresentationDisplay(routeObj);
- int newPresentationDisplayId = (newPresentationDisplay != null
- ? newPresentationDisplay.getDisplayId() : -1);
- if (newPresentationDisplayId
- != record.mRouteDescriptor.getPresentationDisplayId()) {
- record.mRouteDescriptor =
- new MediaRouteDescriptor.Builder(record.mRouteDescriptor)
- .setPresentationDisplayId(newPresentationDisplayId)
- .build();
- publishRoutes();
- }
- }
- }
-
- @Override
- protected void onBuildSystemRouteDescriptor(SystemRouteRecord record,
- MediaRouteDescriptor.Builder builder) {
- super.onBuildSystemRouteDescriptor(record, builder);
-
- if (!MediaRouterJellybeanMr1.RouteInfo.isEnabled(record.mRouteObj)) {
- builder.setEnabled(false);
- }
-
- if (isConnecting(record)) {
- builder.setConnecting(true);
- }
-
- Display presentationDisplay =
- MediaRouterJellybeanMr1.RouteInfo.getPresentationDisplay(record.mRouteObj);
- if (presentationDisplay != null) {
- builder.setPresentationDisplayId(presentationDisplay.getDisplayId());
- }
- }
-
- @Override
- protected void updateCallback() {
- super.updateCallback();
-
- if (mActiveScanWorkaround == null) {
- mActiveScanWorkaround = new MediaRouterJellybeanMr1.ActiveScanWorkaround(
- getContext(), getHandler());
- }
- mActiveScanWorkaround.setActiveScanRouteTypes(mActiveScan ? mRouteTypes : 0);
- }
-
- @Override
- protected Object createCallbackObj() {
- return MediaRouterJellybeanMr1.createCallback(this);
- }
-
- protected boolean isConnecting(SystemRouteRecord record) {
- if (mIsConnectingWorkaround == null) {
- mIsConnectingWorkaround = new MediaRouterJellybeanMr1.IsConnectingWorkaround();
- }
- return mIsConnectingWorkaround.isConnecting(record.mRouteObj);
- }
- }
-
- /**
- * Jellybean MR2 implementation.
- */
- // @@RequiresApi(18)
- private static class JellybeanMr2Impl extends JellybeanMr1Impl {
- public JellybeanMr2Impl(Context context, SyncCallback syncCallback) {
- super(context, syncCallback);
- }
-
- @Override
- protected void onBuildSystemRouteDescriptor(SystemRouteRecord record,
- MediaRouteDescriptor.Builder builder) {
- super.onBuildSystemRouteDescriptor(record, builder);
-
- CharSequence description =
- MediaRouterJellybeanMr2.RouteInfo.getDescription(record.mRouteObj);
- if (description != null) {
- builder.setDescription(description.toString());
- }
- }
-
- @Override
- protected void selectRoute(Object routeObj) {
- MediaRouterJellybean.selectRoute(mRouterObj,
- MediaRouterJellybean.ALL_ROUTE_TYPES, routeObj);
- }
-
- @Override
- protected Object getDefaultRoute() {
- return MediaRouterJellybeanMr2.getDefaultRoute(mRouterObj);
- }
-
- @Override
- protected void updateUserRouteProperties(UserRouteRecord record) {
- super.updateUserRouteProperties(record);
-
- MediaRouterJellybeanMr2.UserRouteInfo.setDescription(
- record.mRouteObj, record.mRoute.getDescription());
- }
-
- @Override
- protected void updateCallback() {
- if (mCallbackRegistered) {
- MediaRouterJellybean.removeCallback(mRouterObj, mCallbackObj);
- }
-
- mCallbackRegistered = true;
- MediaRouterJellybeanMr2.addCallback(mRouterObj, mRouteTypes, mCallbackObj,
- MediaRouter.CALLBACK_FLAG_UNFILTERED_EVENTS
- | (mActiveScan ? MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN : 0));
- }
-
- @Override
- protected boolean isConnecting(SystemRouteRecord record) {
- return MediaRouterJellybeanMr2.RouteInfo.isConnecting(record.mRouteObj);
- }
- }
-
- /**
- * Api24 implementation.
- */
- // @@RequiresApi(24)
- private static class Api24Impl extends JellybeanMr2Impl {
- public Api24Impl(Context context, SyncCallback syncCallback) {
- super(context, syncCallback);
- }
-
- @Override
- protected void onBuildSystemRouteDescriptor(SystemRouteRecord record,
- MediaRouteDescriptor.Builder builder) {
- super.onBuildSystemRouteDescriptor(record, builder);
-
- builder.setDeviceType(MediaRouterApi24.RouteInfo.getDeviceType(record.mRouteObj));
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/support/mediarouter/media/package.html b/packages/MediaComponents/src/com/android/support/mediarouter/media/package.html
deleted file mode 100644
index be2aaf2..0000000
--- a/packages/MediaComponents/src/com/android/support/mediarouter/media/package.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<html>
-
-<body>
-
-<p>Contains APIs that control the routing of media channels and streams from the current device
- to external speakers and destination devices.</p>
-
-</body>
-</html>
diff --git a/packages/MediaComponents/src/com/android/widget/BaseLayout.java b/packages/MediaComponents/src/com/android/widget/BaseLayout.java
deleted file mode 100644
index fb6471d..0000000
--- a/packages/MediaComponents/src/com/android/widget/BaseLayout.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import android.graphics.drawable.Drawable;
-import android.media.update.ViewGroupProvider;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.view.ViewGroup.MarginLayoutParams;
-
-import java.util.ArrayList;
-
-public class BaseLayout extends ViewGroupImpl {
- private final ViewGroup mInstance;
- private final ViewGroupProvider mSuperProvider;
- private final ViewGroupProvider mPrivateProvider;
-
- private final ArrayList<View> mMatchParentChildren = new ArrayList<>(1);
-
- public BaseLayout(ViewGroup instance,
- ViewGroupProvider superProvider, ViewGroupProvider privateProvider) {
- super(instance, superProvider, privateProvider);
- mInstance = instance;
- mSuperProvider = superProvider;
- mPrivateProvider = privateProvider;
- }
-
- @Override
- public boolean checkLayoutParams_impl(LayoutParams p) {
- return p instanceof MarginLayoutParams;
- }
-
- @Override
- public LayoutParams generateDefaultLayoutParams_impl() {
- return new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
- }
-
- @Override
- public LayoutParams generateLayoutParams_impl(AttributeSet attrs) {
- return new MarginLayoutParams(mInstance.getContext(), attrs);
- }
-
- @Override
- public LayoutParams generateLayoutParams_impl(LayoutParams lp) {
- if (lp instanceof MarginLayoutParams) {
- return lp;
- }
- return new MarginLayoutParams(lp);
- }
-
- @Override
- public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) {
- int count = mInstance.getChildCount();
-
- final boolean measureMatchParentChildren =
- View.MeasureSpec.getMode(widthMeasureSpec) != View.MeasureSpec.EXACTLY ||
- View.MeasureSpec.getMode(heightMeasureSpec) != View.MeasureSpec.EXACTLY;
- mMatchParentChildren.clear();
-
- int maxHeight = 0;
- int maxWidth = 0;
- int childState = 0;
-
- for (int i = 0; i < count; i++) {
- final View child = mInstance.getChildAt(i);
- if (child.getVisibility() != View.GONE) {
- mPrivateProvider.measureChildWithMargins_impl(
- child, widthMeasureSpec, 0, heightMeasureSpec, 0);
- final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
- maxWidth = Math.max(maxWidth,
- child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
- maxHeight = Math.max(maxHeight,
- child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
- childState = childState | child.getMeasuredState();
- if (measureMatchParentChildren) {
- if (lp.width == LayoutParams.MATCH_PARENT ||
- lp.height == LayoutParams.MATCH_PARENT) {
- mMatchParentChildren.add(child);
- }
- }
- }
- }
-
- // Account for padding too
- maxWidth += getPaddingLeftWithForeground() + getPaddingRightWithForeground();
- maxHeight += getPaddingTopWithForeground() + getPaddingBottomWithForeground();
-
- // Check against our minimum height and width
- maxHeight = Math.max(maxHeight, mPrivateProvider.getSuggestedMinimumHeight_impl());
- maxWidth = Math.max(maxWidth, mPrivateProvider.getSuggestedMinimumWidth_impl());
-
- // Check against our foreground's minimum height and width
- final Drawable drawable = mInstance.getForeground();
- if (drawable != null) {
- maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
- maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
- }
-
- mPrivateProvider.setMeasuredDimension_impl(
- mInstance.resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
- mInstance.resolveSizeAndState(maxHeight, heightMeasureSpec,
- childState << View.MEASURED_HEIGHT_STATE_SHIFT));
-
- count = mMatchParentChildren.size();
- if (count > 1) {
- for (int i = 0; i < count; i++) {
- final View child = mMatchParentChildren.get(i);
- final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
-
- final int childWidthMeasureSpec;
- if (lp.width == LayoutParams.MATCH_PARENT) {
- final int width = Math.max(0, mInstance.getMeasuredWidth()
- - getPaddingLeftWithForeground() - getPaddingRightWithForeground()
- - lp.leftMargin - lp.rightMargin);
- childWidthMeasureSpec = View.MeasureSpec.makeMeasureSpec(
- width, View.MeasureSpec.EXACTLY);
- } else {
- childWidthMeasureSpec = mInstance.getChildMeasureSpec(widthMeasureSpec,
- getPaddingLeftWithForeground() + getPaddingRightWithForeground() +
- lp.leftMargin + lp.rightMargin,
- lp.width);
- }
-
- final int childHeightMeasureSpec;
- if (lp.height == LayoutParams.MATCH_PARENT) {
- final int height = Math.max(0, mInstance.getMeasuredHeight()
- - getPaddingTopWithForeground() - getPaddingBottomWithForeground()
- - lp.topMargin - lp.bottomMargin);
- childHeightMeasureSpec = View.MeasureSpec.makeMeasureSpec(
- height, View.MeasureSpec.EXACTLY);
- } else {
- childHeightMeasureSpec = mInstance.getChildMeasureSpec(heightMeasureSpec,
- getPaddingTopWithForeground() + getPaddingBottomWithForeground() +
- lp.topMargin + lp.bottomMargin,
- lp.height);
- }
-
- child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
- }
- }
- }
-
- @Override
- public void onLayout_impl(boolean changed, int left, int top, int right, int bottom) {
- final int count = mInstance.getChildCount();
-
- final int parentLeft = getPaddingLeftWithForeground();
- final int parentRight = right - left - getPaddingRightWithForeground();
-
- final int parentTop = getPaddingTopWithForeground();
- final int parentBottom = bottom - top - getPaddingBottomWithForeground();
-
- for (int i = 0; i < count; i++) {
- final View child = mInstance.getChildAt(i);
- if (child.getVisibility() != View.GONE) {
- final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
-
- final int width = child.getMeasuredWidth();
- final int height = child.getMeasuredHeight();
-
- int childLeft;
- int childTop;
-
- childLeft = parentLeft + (parentRight - parentLeft - width) / 2 +
- lp.leftMargin - lp.rightMargin;
-
- childTop = parentTop + (parentBottom - parentTop - height) / 2 +
- lp.topMargin - lp.bottomMargin;
-
- child.layout(childLeft, childTop, childLeft + width, childTop + height);
- }
- }
- }
-
- @Override
- public boolean shouldDelayChildPressedState_impl() {
- return false;
- }
-
- private int getPaddingLeftWithForeground() {
- return mInstance.isForegroundInsidePadding() ? Math.max(mInstance.getPaddingLeft(), 0) :
- mInstance.getPaddingLeft() + 0;
- }
-
- private int getPaddingRightWithForeground() {
- return mInstance.isForegroundInsidePadding() ? Math.max(mInstance.getPaddingRight(), 0) :
- mInstance.getPaddingRight() + 0;
- }
-
- private int getPaddingTopWithForeground() {
- return mInstance.isForegroundInsidePadding() ? Math.max(mInstance.getPaddingTop(), 0) :
- mInstance.getPaddingTop() + 0;
- }
-
- private int getPaddingBottomWithForeground() {
- return mInstance.isForegroundInsidePadding() ? Math.max(mInstance.getPaddingBottom(), 0) :
- mInstance.getPaddingBottom() + 0;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/widget/MediaControlView2Impl.java b/packages/MediaComponents/src/com/android/widget/MediaControlView2Impl.java
deleted file mode 100644
index ad85af4..0000000
--- a/packages/MediaComponents/src/com/android/widget/MediaControlView2Impl.java
+++ /dev/null
@@ -1,1721 +0,0 @@
-/*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Point;
-import android.media.MediaMetadata;
-import android.media.SessionToken2;
-import android.media.session.MediaController;
-import android.media.session.PlaybackState;
-import android.media.update.MediaControlView2Provider;
-import android.media.update.ViewGroupProvider;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.MediaControlView2;
-import android.widget.PopupWindow;
-import android.widget.ProgressBar;
-import android.widget.RelativeLayout;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-import android.widget.TextView;
-
-import androidx.annotation.Nullable;
-
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-import com.android.support.mediarouter.app.MediaRouteButton;
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Formatter;
-import java.util.List;
-import java.util.Locale;
-
-public class MediaControlView2Impl extends BaseLayout implements MediaControlView2Provider {
- private static final String TAG = "MediaControlView2";
-
- private final MediaControlView2 mInstance;
-
- static final String ARGUMENT_KEY_FULLSCREEN = "fullScreen";
-
- // TODO: Move these constants to public api to support custom video view.
- // TODO: Combine these constants into one regarding TrackInfo.
- static final String KEY_VIDEO_TRACK_COUNT = "VideoTrackCount";
- static final String KEY_AUDIO_TRACK_COUNT = "AudioTrackCount";
- static final String KEY_SUBTITLE_TRACK_COUNT = "SubtitleTrackCount";
- static final String KEY_PLAYBACK_SPEED = "PlaybackSpeed";
- static final String KEY_SELECTED_AUDIO_INDEX = "SelectedAudioIndex";
- static final String KEY_SELECTED_SUBTITLE_INDEX = "SelectedSubtitleIndex";
- static final String EVENT_UPDATE_TRACK_STATUS = "UpdateTrackStatus";
-
- // TODO: Remove this once integrating with MediaSession2 & MediaMetadata2
- static final String KEY_STATE_IS_ADVERTISEMENT = "MediaTypeAdvertisement";
- static final String EVENT_UPDATE_MEDIA_TYPE_STATUS = "UpdateMediaTypeStatus";
-
- // String for sending command to show subtitle to MediaSession.
- static final String COMMAND_SHOW_SUBTITLE = "showSubtitle";
- // String for sending command to hide subtitle to MediaSession.
- static final String COMMAND_HIDE_SUBTITLE = "hideSubtitle";
- // TODO: remove once the implementation is revised
- public static final String COMMAND_SET_FULLSCREEN = "setFullscreen";
- // String for sending command to select audio track to MediaSession.
- static final String COMMAND_SELECT_AUDIO_TRACK = "SelectTrack";
- // String for sending command to set playback speed to MediaSession.
- static final String COMMAND_SET_PLAYBACK_SPEED = "SetPlaybackSpeed";
- // String for sending command to mute audio to MediaSession.
- static final String COMMAND_MUTE= "Mute";
- // String for sending command to unmute audio to MediaSession.
- static final String COMMAND_UNMUTE = "Unmute";
-
- private static final int SETTINGS_MODE_AUDIO_TRACK = 0;
- private static final int SETTINGS_MODE_PLAYBACK_SPEED = 1;
- private static final int SETTINGS_MODE_HELP = 2;
- private static final int SETTINGS_MODE_SUBTITLE_TRACK = 3;
- private static final int SETTINGS_MODE_VIDEO_QUALITY = 4;
- private static final int SETTINGS_MODE_MAIN = 5;
- private static final int PLAYBACK_SPEED_1x_INDEX = 3;
-
- private static final int MEDIA_TYPE_DEFAULT = 0;
- private static final int MEDIA_TYPE_MUSIC = 1;
- private static final int MEDIA_TYPE_ADVERTISEMENT = 2;
-
- private static final int SIZE_TYPE_EMBEDDED = 0;
- private static final int SIZE_TYPE_FULL = 1;
- // TODO: add support for Minimal size type.
- private static final int SIZE_TYPE_MINIMAL = 2;
-
- private static final int MAX_PROGRESS = 1000;
- private static final int DEFAULT_PROGRESS_UPDATE_TIME_MS = 1000;
- private static final int REWIND_TIME_MS = 10000;
- private static final int FORWARD_TIME_MS = 30000;
- private static final int AD_SKIP_WAIT_TIME_MS = 5000;
- private static final int RESOURCE_NON_EXISTENT = -1;
- private static final String RESOURCE_EMPTY = "";
-
- private Resources mResources;
- private MediaController mController;
- private MediaController.TransportControls mControls;
- private PlaybackState mPlaybackState;
- private MediaMetadata mMetadata;
- private int mDuration;
- private int mPrevState;
- private int mPrevWidth;
- private int mPrevHeight;
- private int mOriginalLeftBarWidth;
- private int mVideoTrackCount;
- private int mAudioTrackCount;
- private int mSubtitleTrackCount;
- private int mSettingsMode;
- private int mSelectedSubtitleTrackIndex;
- private int mSelectedAudioTrackIndex;
- private int mSelectedVideoQualityIndex;
- private int mSelectedSpeedIndex;
- private int mEmbeddedSettingsItemWidth;
- private int mFullSettingsItemWidth;
- private int mEmbeddedSettingsItemHeight;
- private int mFullSettingsItemHeight;
- private int mSettingsWindowMargin;
- private int mMediaType;
- private int mSizeType;
- private long mPlaybackActions;
- private boolean mDragging;
- private boolean mIsFullScreen;
- private boolean mOverflowExpanded;
- private boolean mIsStopped;
- private boolean mSubtitleIsEnabled;
- private boolean mSeekAvailable;
- private boolean mIsAdvertisement;
- private boolean mIsMute;
- private boolean mNeedUXUpdate;
-
- // Relating to Title Bar View
- private ViewGroup mRoot;
- private View mTitleBar;
- private TextView mTitleView;
- private View mAdExternalLink;
- private ImageButton mBackButton;
- private MediaRouteButton mRouteButton;
- private MediaRouteSelector mRouteSelector;
-
- // Relating to Center View
- private ViewGroup mCenterView;
- private View mTransportControls;
- private ImageButton mPlayPauseButton;
- private ImageButton mFfwdButton;
- private ImageButton mRewButton;
- private ImageButton mNextButton;
- private ImageButton mPrevButton;
-
- // Relating to Minimal Extra View
- private LinearLayout mMinimalExtraView;
-
- // Relating to Progress Bar View
- private ProgressBar mProgress;
- private View mProgressBuffer;
-
- // Relating to Bottom Bar View
- private ViewGroup mBottomBar;
-
- // Relating to Bottom Bar Left View
- private ViewGroup mBottomBarLeftView;
- private ViewGroup mTimeView;
- private TextView mEndTime;
- private TextView mCurrentTime;
- private TextView mAdSkipView;
- private StringBuilder mFormatBuilder;
- private Formatter mFormatter;
-
- // Relating to Bottom Bar Right View
- private ViewGroup mBottomBarRightView;
- private ViewGroup mBasicControls;
- private ViewGroup mExtraControls;
- private ViewGroup mCustomButtons;
- private ImageButton mSubtitleButton;
- private ImageButton mFullScreenButton;
- private ImageButton mOverflowButtonRight;
- private ImageButton mOverflowButtonLeft;
- private ImageButton mMuteButton;
- private ImageButton mVideoQualityButton;
- private ImageButton mSettingsButton;
- private TextView mAdRemainingView;
-
- // Relating to Settings List View
- private ListView mSettingsListView;
- private PopupWindow mSettingsWindow;
- private SettingsAdapter mSettingsAdapter;
- private SubSettingsAdapter mSubSettingsAdapter;
- private List<String> mSettingsMainTextsList;
- private List<String> mSettingsSubTextsList;
- private List<Integer> mSettingsIconIdsList;
- private List<String> mSubtitleDescriptionsList;
- private List<String> mAudioTrackList;
- private List<String> mVideoQualityList;
- private List<String> mPlaybackSpeedTextList;
- private List<Float> mPlaybackSpeedList;
-
- public MediaControlView2Impl(MediaControlView2 instance,
- ViewGroupProvider superProvider, ViewGroupProvider privateProvider) {
- super(instance, superProvider, privateProvider);
- mInstance = instance;
- }
-
- @Override
- public void initialize(@Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- mResources = ApiHelper.getLibResources(mInstance.getContext());
- // Inflate MediaControlView2 from XML
- mRoot = makeControllerView();
- mInstance.addView(mRoot);
- }
-
- @Override
- public void setMediaSessionToken_impl(SessionToken2 token) {
- // TODO: implement this
- }
-
- @Override
- public void setOnFullScreenListener_impl(MediaControlView2.OnFullScreenListener l) {
- // TODO: implement this
- }
-
- @Override
- public void setController_impl(MediaController controller) {
- mController = controller;
- if (controller != null) {
- mControls = controller.getTransportControls();
- // Set mMetadata and mPlaybackState to existing MediaSession variables since they may
- // be called before the callback is called
- mPlaybackState = mController.getPlaybackState();
- mMetadata = mController.getMetadata();
- updateDuration();
- updateTitle();
-
- mController.registerCallback(new MediaControllerCallback());
- }
- }
-
- @Override
- public void setButtonVisibility_impl(int button, int visibility) {
- // TODO: add member variables for Fast-Forward/Prvious/Rewind buttons to save visibility in
- // order to prevent being overriden inside updateLayout().
- switch (button) {
- case MediaControlView2.BUTTON_PLAY_PAUSE:
- if (mPlayPauseButton != null && canPause()) {
- mPlayPauseButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_FFWD:
- if (mFfwdButton != null && canSeekForward()) {
- mFfwdButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_REW:
- if (mRewButton != null && canSeekBackward()) {
- mRewButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_NEXT:
- if (mNextButton != null) {
- mNextButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_PREV:
- if (mPrevButton != null) {
- mPrevButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_SUBTITLE:
- if (mSubtitleButton != null && mSubtitleTrackCount > 0) {
- mSubtitleButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_FULL_SCREEN:
- if (mFullScreenButton != null) {
- mFullScreenButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_OVERFLOW:
- if (mOverflowButtonRight != null) {
- mOverflowButtonRight.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_MUTE:
- if (mMuteButton != null) {
- mMuteButton.setVisibility(visibility);
- }
- break;
- case MediaControlView2.BUTTON_SETTINGS:
- if (mSettingsButton != null) {
- mSettingsButton.setVisibility(visibility);
- }
- break;
- default:
- break;
- }
- }
-
- @Override
- public void requestPlayButtonFocus_impl() {
- if (mPlayPauseButton != null) {
- mPlayPauseButton.requestFocus();
- }
- }
-
- @Override
- public CharSequence getAccessibilityClassName_impl() {
- return MediaControlView2.class.getName();
- }
-
- @Override
- public boolean onTouchEvent_impl(MotionEvent ev) {
- return false;
- }
-
- // TODO: Should this function be removed?
- @Override
- public boolean onTrackballEvent_impl(MotionEvent ev) {
- return false;
- }
-
- @Override
- public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure_impl(widthMeasureSpec, heightMeasureSpec);
-
- // Update layout when this view's width changes in order to avoid any UI overlap between
- // transport controls.
- if (mPrevWidth != mInstance.getMeasuredWidth()
- || mPrevHeight != mInstance.getMeasuredHeight() || mNeedUXUpdate) {
- // Dismiss SettingsWindow if it is showing.
- mSettingsWindow.dismiss();
-
- // These views may not have been initialized yet.
- if (mTransportControls.getWidth() == 0 || mTimeView.getWidth() == 0) {
- return;
- }
-
- int currWidth = mInstance.getMeasuredWidth();
- int currHeight = mInstance.getMeasuredHeight();
- WindowManager manager = (WindowManager) mInstance.getContext().getApplicationContext()
- .getSystemService(Context.WINDOW_SERVICE);
- Point screenSize = new Point();
- manager.getDefaultDisplay().getSize(screenSize);
- int screenWidth = screenSize.x;
- int screenHeight = screenSize.y;
- int fullIconSize = mResources.getDimensionPixelSize(R.dimen.mcv2_full_icon_size);
- int embeddedIconSize = mResources.getDimensionPixelSize(
- R.dimen.mcv2_embedded_icon_size);
- int marginSize = mResources.getDimensionPixelSize(R.dimen.mcv2_icon_margin);
-
- // TODO: add support for Advertisement Mode.
- if (mMediaType == MEDIA_TYPE_DEFAULT) {
- // Max number of icons inside BottomBarRightView for Music mode is 4.
- int maxIconCount = 4;
- updateLayout(maxIconCount, fullIconSize, embeddedIconSize, marginSize, currWidth,
- currHeight, screenWidth, screenHeight);
- } else if (mMediaType == MEDIA_TYPE_MUSIC) {
- if (mNeedUXUpdate) {
- // One-time operation for Music media type
- mBasicControls.removeView(mMuteButton);
- mExtraControls.addView(mMuteButton, 0);
- mVideoQualityButton.setVisibility(View.GONE);
- if (mFfwdButton != null) {
- mFfwdButton.setVisibility(View.GONE);
- }
- if (mRewButton != null) {
- mRewButton.setVisibility(View.GONE);
- }
- }
- mNeedUXUpdate = false;
-
- // Max number of icons inside BottomBarRightView for Music mode is 3.
- int maxIconCount = 3;
- updateLayout(maxIconCount, fullIconSize, embeddedIconSize, marginSize, currWidth,
- currHeight, screenWidth, screenHeight);
- }
- mPrevWidth = currWidth;
- mPrevHeight = currHeight;
- }
- // TODO: move this to a different location.
- // Update title bar parameters in order to avoid overlap between title view and the right
- // side of the title bar.
- updateTitleBarLayout();
- }
-
- @Override
- public void setEnabled_impl(boolean enabled) {
- super.setEnabled_impl(enabled);
-
- // TODO: Merge the below code with disableUnsupportedButtons().
- if (mPlayPauseButton != null) {
- mPlayPauseButton.setEnabled(enabled);
- }
- if (mFfwdButton != null) {
- mFfwdButton.setEnabled(enabled);
- }
- if (mRewButton != null) {
- mRewButton.setEnabled(enabled);
- }
- if (mNextButton != null) {
- mNextButton.setEnabled(enabled);
- }
- if (mPrevButton != null) {
- mPrevButton.setEnabled(enabled);
- }
- if (mProgress != null) {
- mProgress.setEnabled(enabled);
- }
- disableUnsupportedButtons();
- }
-
- @Override
- public void onVisibilityAggregated_impl(boolean isVisible) {
- super.onVisibilityAggregated_impl(isVisible);
-
- if (isVisible) {
- disableUnsupportedButtons();
- mInstance.removeCallbacks(mUpdateProgress);
- mInstance.post(mUpdateProgress);
- } else {
- mInstance.removeCallbacks(mUpdateProgress);
- }
- }
-
- public void setRouteSelector(MediaRouteSelector selector) {
- mRouteSelector = selector;
- if (mRouteSelector != null && !mRouteSelector.isEmpty()) {
- mRouteButton.setRouteSelector(selector, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
- mRouteButton.setVisibility(View.VISIBLE);
- } else {
- mRouteButton.setRouteSelector(MediaRouteSelector.EMPTY);
- mRouteButton.setVisibility(View.GONE);
- }
- }
-
- ///////////////////////////////////////////////////
- // Protected or private methods
- ///////////////////////////////////////////////////
-
- private boolean isPlaying() {
- if (mPlaybackState != null) {
- return mPlaybackState.getState() == PlaybackState.STATE_PLAYING;
- }
- return false;
- }
-
- private int getCurrentPosition() {
- mPlaybackState = mController.getPlaybackState();
- if (mPlaybackState != null) {
- return (int) mPlaybackState.getPosition();
- }
- return 0;
- }
-
- private int getBufferPercentage() {
- if (mDuration == 0) {
- return 0;
- }
- mPlaybackState = mController.getPlaybackState();
- if (mPlaybackState != null) {
- long bufferedPos = mPlaybackState.getBufferedPosition();
- return (bufferedPos == -1) ? -1 : (int) (bufferedPos * 100 / mDuration);
- }
- return 0;
- }
-
- private boolean canPause() {
- if (mPlaybackState != null) {
- return (mPlaybackState.getActions() & PlaybackState.ACTION_PAUSE) != 0;
- }
- return true;
- }
-
- private boolean canSeekBackward() {
- if (mPlaybackState != null) {
- return (mPlaybackState.getActions() & PlaybackState.ACTION_REWIND) != 0;
- }
- return true;
- }
-
- private boolean canSeekForward() {
- if (mPlaybackState != null) {
- return (mPlaybackState.getActions() & PlaybackState.ACTION_FAST_FORWARD) != 0;
- }
- return true;
- }
-
- /**
- * Create the view that holds the widgets that control playback.
- * Derived classes can override this to create their own.
- *
- * @return The controller view.
- * @hide This doesn't work as advertised
- */
- protected ViewGroup makeControllerView() {
- ViewGroup root = (ViewGroup) ApiHelper.inflateLibLayout(mInstance.getContext(),
- R.layout.media_controller);
- initControllerView(root);
- return root;
- }
-
- private void initControllerView(ViewGroup v) {
- // Relating to Title Bar View
- mTitleBar = v.findViewById(R.id.title_bar);
- mTitleView = v.findViewById(R.id.title_text);
- mAdExternalLink = v.findViewById(R.id.ad_external_link);
- mBackButton = v.findViewById(R.id.back);
- if (mBackButton != null) {
- mBackButton.setOnClickListener(mBackListener);
- mBackButton.setVisibility(View.GONE);
- }
- mRouteButton = v.findViewById(R.id.cast);
-
- // Relating to Center View
- mCenterView = v.findViewById(R.id.center_view);
- mTransportControls = inflateTransportControls(R.layout.embedded_transport_controls);
- mCenterView.addView(mTransportControls);
-
- // Relating to Minimal Extra View
- mMinimalExtraView = (LinearLayout) v.findViewById(R.id.minimal_extra_view);
- LinearLayout.LayoutParams params =
- (LinearLayout.LayoutParams) mMinimalExtraView.getLayoutParams();
- int iconSize = mResources.getDimensionPixelSize(R.dimen.mcv2_embedded_icon_size);
- int marginSize = mResources.getDimensionPixelSize(R.dimen.mcv2_icon_margin);
- params.setMargins(0, (iconSize + marginSize * 2) * (-1), 0, 0);
- mMinimalExtraView.setLayoutParams(params);
- mMinimalExtraView.setVisibility(View.GONE);
-
- // Relating to Progress Bar View
- mProgress = v.findViewById(R.id.progress);
- if (mProgress != null) {
- if (mProgress instanceof SeekBar) {
- SeekBar seeker = (SeekBar) mProgress;
- seeker.setOnSeekBarChangeListener(mSeekListener);
- seeker.setProgressDrawable(mResources.getDrawable(R.drawable.custom_progress));
- seeker.setThumb(mResources.getDrawable(R.drawable.custom_progress_thumb));
- }
- mProgress.setMax(MAX_PROGRESS);
- }
- mProgressBuffer = v.findViewById(R.id.progress_buffer);
-
- // Relating to Bottom Bar View
- mBottomBar = v.findViewById(R.id.bottom_bar);
-
- // Relating to Bottom Bar Left View
- mBottomBarLeftView = v.findViewById(R.id.bottom_bar_left);
- mTimeView = v.findViewById(R.id.time);
- mEndTime = v.findViewById(R.id.time_end);
- mCurrentTime = v.findViewById(R.id.time_current);
- mAdSkipView = v.findViewById(R.id.ad_skip_time);
- mFormatBuilder = new StringBuilder();
- mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
-
- // Relating to Bottom Bar Right View
- mBottomBarRightView = v.findViewById(R.id.bottom_bar_right);
- mBasicControls = v.findViewById(R.id.basic_controls);
- mExtraControls = v.findViewById(R.id.extra_controls);
- mCustomButtons = v.findViewById(R.id.custom_buttons);
- mSubtitleButton = v.findViewById(R.id.subtitle);
- if (mSubtitleButton != null) {
- mSubtitleButton.setOnClickListener(mSubtitleListener);
- }
- mFullScreenButton = v.findViewById(R.id.fullscreen);
- if (mFullScreenButton != null) {
- mFullScreenButton.setOnClickListener(mFullScreenListener);
- // TODO: Show Fullscreen button when only it is possible.
- }
- mOverflowButtonRight = v.findViewById(R.id.overflow_right);
- if (mOverflowButtonRight != null) {
- mOverflowButtonRight.setOnClickListener(mOverflowRightListener);
- }
- mOverflowButtonLeft = v.findViewById(R.id.overflow_left);
- if (mOverflowButtonLeft != null) {
- mOverflowButtonLeft.setOnClickListener(mOverflowLeftListener);
- }
- mMuteButton = v.findViewById(R.id.mute);
- if (mMuteButton != null) {
- mMuteButton.setOnClickListener(mMuteButtonListener);
- }
- mSettingsButton = v.findViewById(R.id.settings);
- if (mSettingsButton != null) {
- mSettingsButton.setOnClickListener(mSettingsButtonListener);
- }
- mVideoQualityButton = v.findViewById(R.id.video_quality);
- if (mVideoQualityButton != null) {
- mVideoQualityButton.setOnClickListener(mVideoQualityListener);
- }
- mAdRemainingView = v.findViewById(R.id.ad_remaining);
-
- // Relating to Settings List View
- initializeSettingsLists();
- mSettingsListView = (ListView) ApiHelper.inflateLibLayout(mInstance.getContext(),
- R.layout.settings_list);
- mSettingsAdapter = new SettingsAdapter(mSettingsMainTextsList, mSettingsSubTextsList,
- mSettingsIconIdsList);
- mSubSettingsAdapter = new SubSettingsAdapter(null, 0);
- mSettingsListView.setAdapter(mSettingsAdapter);
- mSettingsListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
- mSettingsListView.setOnItemClickListener(mSettingsItemClickListener);
-
- mEmbeddedSettingsItemWidth = mResources.getDimensionPixelSize(
- R.dimen.mcv2_embedded_settings_width);
- mFullSettingsItemWidth = mResources.getDimensionPixelSize(R.dimen.mcv2_full_settings_width);
- mEmbeddedSettingsItemHeight = mResources.getDimensionPixelSize(
- R.dimen.mcv2_embedded_settings_height);
- mFullSettingsItemHeight = mResources.getDimensionPixelSize(
- R.dimen.mcv2_full_settings_height);
- mSettingsWindowMargin = (-1) * mResources.getDimensionPixelSize(
- R.dimen.mcv2_settings_offset);
- mSettingsWindow = new PopupWindow(mSettingsListView, mEmbeddedSettingsItemWidth,
- ViewGroup.LayoutParams.WRAP_CONTENT, true);
- }
-
- /**
- * Disable pause or seek buttons if the stream cannot be paused or seeked.
- * This requires the control interface to be a MediaPlayerControlExt
- */
- private void disableUnsupportedButtons() {
- try {
- if (mPlayPauseButton != null && !canPause()) {
- mPlayPauseButton.setEnabled(false);
- }
- if (mRewButton != null && !canSeekBackward()) {
- mRewButton.setEnabled(false);
- }
- if (mFfwdButton != null && !canSeekForward()) {
- mFfwdButton.setEnabled(false);
- }
- // TODO What we really should do is add a canSeek to the MediaPlayerControl interface;
- // this scheme can break the case when applications want to allow seek through the
- // progress bar but disable forward/backward buttons.
- //
- // However, currently the flags SEEK_BACKWARD_AVAILABLE, SEEK_FORWARD_AVAILABLE,
- // and SEEK_AVAILABLE are all (un)set together; as such the aforementioned issue
- // shouldn't arise in existing applications.
- if (mProgress != null && !canSeekBackward() && !canSeekForward()) {
- mProgress.setEnabled(false);
- }
- } catch (IncompatibleClassChangeError ex) {
- // We were given an old version of the interface, that doesn't have
- // the canPause/canSeekXYZ methods. This is OK, it just means we
- // assume the media can be paused and seeked, and so we don't disable
- // the buttons.
- }
- }
-
- private final Runnable mUpdateProgress = new Runnable() {
- @Override
- public void run() {
- int pos = setProgress();
- boolean isShowing = mInstance.getVisibility() == View.VISIBLE;
- if (!mDragging && isShowing && isPlaying()) {
- mInstance.postDelayed(mUpdateProgress,
- DEFAULT_PROGRESS_UPDATE_TIME_MS - (pos % DEFAULT_PROGRESS_UPDATE_TIME_MS));
- }
- }
- };
-
- private String stringForTime(int timeMs) {
- int totalSeconds = timeMs / 1000;
-
- int seconds = totalSeconds % 60;
- int minutes = (totalSeconds / 60) % 60;
- int hours = totalSeconds / 3600;
-
- mFormatBuilder.setLength(0);
- if (hours > 0) {
- return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
- } else {
- return mFormatter.format("%02d:%02d", minutes, seconds).toString();
- }
- }
-
- private int setProgress() {
- if (mController == null || mDragging) {
- return 0;
- }
- int positionOnProgressBar = 0;
- int currentPosition = getCurrentPosition();
- if (mDuration > 0) {
- positionOnProgressBar = (int) (MAX_PROGRESS * (long) currentPosition / mDuration);
- }
- if (mProgress != null && currentPosition != mDuration) {
- mProgress.setProgress(positionOnProgressBar);
- // If the media is a local file, there is no need to set a buffer, so set secondary
- // progress to maximum.
- if (getBufferPercentage() < 0) {
- mProgress.setSecondaryProgress(MAX_PROGRESS);
- } else {
- mProgress.setSecondaryProgress(getBufferPercentage() * 10);
- }
- }
-
- if (mEndTime != null) {
- mEndTime.setText(stringForTime(mDuration));
-
- }
- if (mCurrentTime != null) {
- mCurrentTime.setText(stringForTime(currentPosition));
- }
-
- if (mIsAdvertisement) {
- // Update the remaining number of seconds until the first 5 seconds of the
- // advertisement.
- if (mAdSkipView != null) {
- if (currentPosition <= AD_SKIP_WAIT_TIME_MS) {
- if (mAdSkipView.getVisibility() == View.GONE) {
- mAdSkipView.setVisibility(View.VISIBLE);
- }
- String skipTimeText = mResources.getString(
- R.string.MediaControlView2_ad_skip_wait_time,
- ((AD_SKIP_WAIT_TIME_MS - currentPosition) / 1000 + 1));
- mAdSkipView.setText(skipTimeText);
- } else {
- if (mAdSkipView.getVisibility() == View.VISIBLE) {
- mAdSkipView.setVisibility(View.GONE);
- mNextButton.setEnabled(true);
- mNextButton.clearColorFilter();
- }
- }
- }
- // Update the remaining number of seconds of the advertisement.
- if (mAdRemainingView != null) {
- int remainingTime =
- (mDuration - currentPosition < 0) ? 0 : (mDuration - currentPosition);
- String remainingTimeText = mResources.getString(
- R.string.MediaControlView2_ad_remaining_time,
- stringForTime(remainingTime));
- mAdRemainingView.setText(remainingTimeText);
- }
- }
- return currentPosition;
- }
-
- private void togglePausePlayState() {
- if (isPlaying()) {
- mControls.pause();
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_play_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_play_button_desc));
- } else {
- mControls.play();
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_pause_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_pause_button_desc));
- }
- }
-
- // There are two scenarios that can trigger the seekbar listener to trigger:
- //
- // The first is the user using the touchpad to adjust the posititon of the
- // seekbar's thumb. In this case onStartTrackingTouch is called followed by
- // a number of onProgressChanged notifications, concluded by onStopTrackingTouch.
- // We're setting the field "mDragging" to true for the duration of the dragging
- // session to avoid jumps in the position in case of ongoing playback.
- //
- // The second scenario involves the user operating the scroll ball, in this
- // case there WON'T BE onStartTrackingTouch/onStopTrackingTouch notifications,
- // we will simply apply the updated position without suspending regular updates.
- private final OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {
- @Override
- public void onStartTrackingTouch(SeekBar bar) {
- if (!mSeekAvailable) {
- return;
- }
-
- mDragging = true;
-
- // By removing these pending progress messages we make sure
- // that a) we won't update the progress while the user adjusts
- // the seekbar and b) once the user is done dragging the thumb
- // we will post one of these messages to the queue again and
- // this ensures that there will be exactly one message queued up.
- mInstance.removeCallbacks(mUpdateProgress);
-
- // Check if playback is currently stopped. In this case, update the pause button to
- // show the play image instead of the replay image.
- if (mIsStopped) {
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_play_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_play_button_desc));
- mIsStopped = false;
- }
- }
-
- @Override
- public void onProgressChanged(SeekBar bar, int progress, boolean fromUser) {
- if (!mSeekAvailable) {
- return;
- }
- if (!fromUser) {
- // We're not interested in programmatically generated changes to
- // the progress bar's position.
- return;
- }
- if (mDuration > 0) {
- int position = (int) (((long) mDuration * progress) / MAX_PROGRESS);
- mControls.seekTo(position);
-
- if (mCurrentTime != null) {
- mCurrentTime.setText(stringForTime(position));
- }
- }
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar bar) {
- if (!mSeekAvailable) {
- return;
- }
- mDragging = false;
-
- setProgress();
-
- // Ensure that progress is properly updated in the future,
- // the call to show() does not guarantee this because it is a
- // no-op if we are already showing.
- mInstance.post(mUpdateProgress);
- }
- };
-
- private final View.OnClickListener mPlayPauseListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- togglePausePlayState();
- }
- };
-
- private final View.OnClickListener mRewListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- int pos = getCurrentPosition() - REWIND_TIME_MS;
- mControls.seekTo(pos);
- setProgress();
- }
- };
-
- private final View.OnClickListener mFfwdListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- int pos = getCurrentPosition() + FORWARD_TIME_MS;
- mControls.seekTo(pos);
- setProgress();
- }
- };
-
- private final View.OnClickListener mNextListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mControls.skipToNext();
- }
- };
-
- private final View.OnClickListener mPrevListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mControls.skipToPrevious();
- }
- };
-
- private final View.OnClickListener mBackListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO: implement
- }
- };
-
- private final View.OnClickListener mSubtitleListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mSettingsMode = SETTINGS_MODE_SUBTITLE_TRACK;
- mSubSettingsAdapter.setTexts(mSubtitleDescriptionsList);
- mSubSettingsAdapter.setCheckPosition(mSelectedSubtitleTrackIndex);
- displaySettingsWindow(mSubSettingsAdapter);
- }
- };
-
- private final View.OnClickListener mVideoQualityListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mSettingsMode = SETTINGS_MODE_VIDEO_QUALITY;
- mSubSettingsAdapter.setTexts(mVideoQualityList);
- mSubSettingsAdapter.setCheckPosition(mSelectedVideoQualityIndex);
- displaySettingsWindow(mSubSettingsAdapter);
- }
- };
-
- private final View.OnClickListener mFullScreenListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- final boolean isEnteringFullScreen = !mIsFullScreen;
- // TODO: Re-arrange the button layouts according to the UX.
- if (isEnteringFullScreen) {
- mFullScreenButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_fullscreen_exit, null));
- } else {
- mFullScreenButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_fullscreen, null));
- }
- Bundle args = new Bundle();
- args.putBoolean(ARGUMENT_KEY_FULLSCREEN, isEnteringFullScreen);
- mController.sendCommand(COMMAND_SET_FULLSCREEN, args, null);
-
- mIsFullScreen = isEnteringFullScreen;
- }
- };
-
- private final View.OnClickListener mOverflowRightListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mBasicControls.setVisibility(View.GONE);
- mExtraControls.setVisibility(View.VISIBLE);
- }
- };
-
- private final View.OnClickListener mOverflowLeftListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mBasicControls.setVisibility(View.VISIBLE);
- mExtraControls.setVisibility(View.GONE);
- }
- };
-
- private final View.OnClickListener mMuteButtonListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (!mIsMute) {
- mMuteButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_mute, null));
- mMuteButton.setContentDescription(
- mResources.getString(R.string.mcv2_muted_button_desc));
- mIsMute = true;
- mController.sendCommand(COMMAND_MUTE, null, null);
- } else {
- mMuteButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_unmute, null));
- mMuteButton.setContentDescription(
- mResources.getString(R.string.mcv2_unmuted_button_desc));
- mIsMute = false;
- mController.sendCommand(COMMAND_UNMUTE, null, null);
- }
- }
- };
-
- private final View.OnClickListener mSettingsButtonListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mSettingsMode = SETTINGS_MODE_MAIN;
- mSettingsAdapter.setSubTexts(mSettingsSubTextsList);
- displaySettingsWindow(mSettingsAdapter);
- }
- };
-
- private final AdapterView.OnItemClickListener mSettingsItemClickListener
- = new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- switch (mSettingsMode) {
- case SETTINGS_MODE_MAIN:
- if (position == SETTINGS_MODE_AUDIO_TRACK) {
- mSubSettingsAdapter.setTexts(mAudioTrackList);
- mSubSettingsAdapter.setCheckPosition(mSelectedAudioTrackIndex);
- mSettingsMode = SETTINGS_MODE_AUDIO_TRACK;
- } else if (position == SETTINGS_MODE_PLAYBACK_SPEED) {
- mSubSettingsAdapter.setTexts(mPlaybackSpeedTextList);
- mSubSettingsAdapter.setCheckPosition(mSelectedSpeedIndex);
- mSettingsMode = SETTINGS_MODE_PLAYBACK_SPEED;
- } else if (position == SETTINGS_MODE_HELP) {
- // TODO: implement this.
- mSettingsWindow.dismiss();
- return;
- }
- displaySettingsWindow(mSubSettingsAdapter);
- break;
- case SETTINGS_MODE_AUDIO_TRACK:
- if (position != mSelectedAudioTrackIndex) {
- mSelectedAudioTrackIndex = position;
- if (mAudioTrackCount > 0) {
- Bundle extra = new Bundle();
- extra.putInt(KEY_SELECTED_AUDIO_INDEX, position);
- mController.sendCommand(COMMAND_SELECT_AUDIO_TRACK, extra, null);
- }
- mSettingsSubTextsList.set(SETTINGS_MODE_AUDIO_TRACK,
- mSubSettingsAdapter.getMainText(position));
- }
- mSettingsWindow.dismiss();
- break;
- case SETTINGS_MODE_PLAYBACK_SPEED:
- if (position != mSelectedSpeedIndex) {
- mSelectedSpeedIndex = position;
- Bundle extra = new Bundle();
- extra.putFloat(KEY_PLAYBACK_SPEED, mPlaybackSpeedList.get(position));
- mController.sendCommand(COMMAND_SET_PLAYBACK_SPEED, extra, null);
- mSettingsSubTextsList.set(SETTINGS_MODE_PLAYBACK_SPEED,
- mSubSettingsAdapter.getMainText(position));
- }
- mSettingsWindow.dismiss();
- break;
- case SETTINGS_MODE_HELP:
- // TODO: implement this.
- break;
- case SETTINGS_MODE_SUBTITLE_TRACK:
- if (position != mSelectedSubtitleTrackIndex) {
- mSelectedSubtitleTrackIndex = position;
- if (position > 0) {
- Bundle extra = new Bundle();
- extra.putInt(KEY_SELECTED_SUBTITLE_INDEX, position - 1);
- mController.sendCommand(
- MediaControlView2Impl.COMMAND_SHOW_SUBTITLE, extra, null);
- mSubtitleButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_subtitle_on, null));
- mSubtitleButton.setContentDescription(
- mResources.getString(R.string.mcv2_cc_is_on));
- mSubtitleIsEnabled = true;
- } else {
- mController.sendCommand(
- MediaControlView2Impl.COMMAND_HIDE_SUBTITLE, null, null);
- mSubtitleButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_subtitle_off, null));
- mSubtitleButton.setContentDescription(
- mResources.getString(R.string.mcv2_cc_is_off));
-
- mSubtitleIsEnabled = false;
- }
- }
- mSettingsWindow.dismiss();
- break;
- case SETTINGS_MODE_VIDEO_QUALITY:
- // TODO: add support for video quality
- mSelectedVideoQualityIndex = position;
- mSettingsWindow.dismiss();
- break;
- }
- }
- };
-
- private void updateDuration() {
- if (mMetadata != null) {
- if (mMetadata.containsKey(MediaMetadata.METADATA_KEY_DURATION)) {
- mDuration = (int) mMetadata.getLong(MediaMetadata.METADATA_KEY_DURATION);
- // update progress bar
- setProgress();
- }
- }
- }
-
- private void updateTitle() {
- if (mMetadata != null) {
- if (mMetadata.containsKey(MediaMetadata.METADATA_KEY_TITLE)) {
- mTitleView.setText(mMetadata.getString(MediaMetadata.METADATA_KEY_TITLE));
- }
- }
- }
-
- // The title bar is made up of two separate LinearLayouts. If the sum of the two bars are
- // greater than the length of the title bar, reduce the size of the left bar (which makes the
- // TextView that contains the title of the media file shrink).
- private void updateTitleBarLayout() {
- if (mTitleBar != null) {
- int titleBarWidth = mTitleBar.getWidth();
-
- View leftBar = mTitleBar.findViewById(R.id.title_bar_left);
- View rightBar = mTitleBar.findViewById(R.id.title_bar_right);
- int leftBarWidth = leftBar.getWidth();
- int rightBarWidth = rightBar.getWidth();
-
- RelativeLayout.LayoutParams params =
- (RelativeLayout.LayoutParams) leftBar.getLayoutParams();
- if (leftBarWidth + rightBarWidth > titleBarWidth) {
- params.width = titleBarWidth - rightBarWidth;
- mOriginalLeftBarWidth = leftBarWidth;
- } else if (leftBarWidth + rightBarWidth < titleBarWidth && mOriginalLeftBarWidth != 0) {
- params.width = mOriginalLeftBarWidth;
- mOriginalLeftBarWidth = 0;
- }
- leftBar.setLayoutParams(params);
- }
- }
-
- private void updateAudioMetadata() {
- if (mMediaType != MEDIA_TYPE_MUSIC) {
- return;
- }
-
- if (mMetadata != null) {
- String titleText = "";
- String artistText = "";
- if (mMetadata.containsKey(MediaMetadata.METADATA_KEY_TITLE)) {
- titleText = mMetadata.getString(MediaMetadata.METADATA_KEY_TITLE);
- } else {
- titleText = mResources.getString(R.string.mcv2_music_title_unknown_text);
- }
-
- if (mMetadata.containsKey(MediaMetadata.METADATA_KEY_ARTIST)) {
- artistText = mMetadata.getString(MediaMetadata.METADATA_KEY_ARTIST);
- } else {
- artistText = mResources.getString(R.string.mcv2_music_artist_unknown_text);
- }
-
- // Update title for Embedded size type
- mTitleView.setText(titleText + " - " + artistText);
-
- // Set to true to update layout inside onMeasure()
- mNeedUXUpdate = true;
- }
- }
-
- private void updateLayout() {
- if (mIsAdvertisement) {
- mRewButton.setVisibility(View.GONE);
- mFfwdButton.setVisibility(View.GONE);
- mPrevButton.setVisibility(View.GONE);
- mTimeView.setVisibility(View.GONE);
-
- mAdSkipView.setVisibility(View.VISIBLE);
- mAdRemainingView.setVisibility(View.VISIBLE);
- mAdExternalLink.setVisibility(View.VISIBLE);
-
- mProgress.setEnabled(false);
- mNextButton.setEnabled(false);
- mNextButton.setColorFilter(R.color.gray);
- } else {
- mRewButton.setVisibility(View.VISIBLE);
- mFfwdButton.setVisibility(View.VISIBLE);
- mPrevButton.setVisibility(View.VISIBLE);
- mTimeView.setVisibility(View.VISIBLE);
-
- mAdSkipView.setVisibility(View.GONE);
- mAdRemainingView.setVisibility(View.GONE);
- mAdExternalLink.setVisibility(View.GONE);
-
- mProgress.setEnabled(true);
- mNextButton.setEnabled(true);
- mNextButton.clearColorFilter();
- disableUnsupportedButtons();
- }
- }
-
- private void updateLayout(int maxIconCount, int fullIconSize, int embeddedIconSize,
- int marginSize, int currWidth, int currHeight, int screenWidth, int screenHeight) {
- int fullBottomBarRightWidthMax = fullIconSize * maxIconCount
- + marginSize * (maxIconCount * 2);
- int embeddedBottomBarRightWidthMax = embeddedIconSize * maxIconCount
- + marginSize * (maxIconCount * 2);
- int fullWidth = mTransportControls.getWidth() + mTimeView.getWidth()
- + fullBottomBarRightWidthMax;
- int embeddedWidth = mTimeView.getWidth() + embeddedBottomBarRightWidthMax;
- int screenMaxLength = Math.max(screenWidth, screenHeight);
-
- if (fullWidth > screenMaxLength) {
- // TODO: screen may be smaller than the length needed for Full size.
- }
-
- boolean isFullSize = (mMediaType == MEDIA_TYPE_DEFAULT) ? (currWidth == screenMaxLength) :
- (currWidth == screenWidth && currHeight == screenHeight);
-
- if (isFullSize) {
- if (mSizeType != SIZE_TYPE_FULL) {
- updateLayoutForSizeChange(SIZE_TYPE_FULL);
- if (mMediaType == MEDIA_TYPE_MUSIC) {
- mTitleView.setVisibility(View.GONE);
- }
- }
- } else if (embeddedWidth <= currWidth) {
- if (mSizeType != SIZE_TYPE_EMBEDDED) {
- updateLayoutForSizeChange(SIZE_TYPE_EMBEDDED);
- if (mMediaType == MEDIA_TYPE_MUSIC) {
- mTitleView.setVisibility(View.VISIBLE);
- }
- }
- } else {
- if (mSizeType != SIZE_TYPE_MINIMAL) {
- updateLayoutForSizeChange(SIZE_TYPE_MINIMAL);
- if (mMediaType == MEDIA_TYPE_MUSIC) {
- mTitleView.setVisibility(View.GONE);
- }
- }
- }
- }
-
- private void updateLayoutForSizeChange(int sizeType) {
- mSizeType = sizeType;
- RelativeLayout.LayoutParams timeViewParams =
- (RelativeLayout.LayoutParams) mTimeView.getLayoutParams();
- SeekBar seeker = (SeekBar) mProgress;
- switch (mSizeType) {
- case SIZE_TYPE_EMBEDDED:
- // Relating to Title Bar
- mTitleBar.setVisibility(View.VISIBLE);
- mBackButton.setVisibility(View.GONE);
-
- // Relating to Full Screen Button
- mMinimalExtraView.setVisibility(View.GONE);
- mFullScreenButton = mBottomBarRightView.findViewById(R.id.fullscreen);
- mFullScreenButton.setOnClickListener(mFullScreenListener);
-
- // Relating to Center View
- mCenterView.removeAllViews();
- mBottomBarLeftView.removeView(mTransportControls);
- mBottomBarLeftView.setVisibility(View.GONE);
- mTransportControls = inflateTransportControls(R.layout.embedded_transport_controls);
- mCenterView.addView(mTransportControls);
-
- // Relating to Progress Bar
- seeker.setThumb(mResources.getDrawable(R.drawable.custom_progress_thumb));
- mProgressBuffer.setVisibility(View.VISIBLE);
-
- // Relating to Bottom Bar
- mBottomBar.setVisibility(View.VISIBLE);
- if (timeViewParams.getRule(RelativeLayout.LEFT_OF) != 0) {
- timeViewParams.removeRule(RelativeLayout.LEFT_OF);
- timeViewParams.addRule(RelativeLayout.RIGHT_OF, R.id.bottom_bar_left);
- }
- break;
- case SIZE_TYPE_FULL:
- // Relating to Title Bar
- mTitleBar.setVisibility(View.VISIBLE);
- mBackButton.setVisibility(View.VISIBLE);
-
- // Relating to Full Screen Button
- mMinimalExtraView.setVisibility(View.GONE);
- mFullScreenButton = mBottomBarRightView.findViewById(R.id.fullscreen);
- mFullScreenButton.setOnClickListener(mFullScreenListener);
-
- // Relating to Center View
- mCenterView.removeAllViews();
- mBottomBarLeftView.removeView(mTransportControls);
- mTransportControls = inflateTransportControls(R.layout.full_transport_controls);
- mBottomBarLeftView.addView(mTransportControls, 0);
- mBottomBarLeftView.setVisibility(View.VISIBLE);
-
- // Relating to Progress Bar
- seeker.setThumb(mResources.getDrawable(R.drawable.custom_progress_thumb));
- mProgressBuffer.setVisibility(View.VISIBLE);
-
- // Relating to Bottom Bar
- mBottomBar.setVisibility(View.VISIBLE);
- if (timeViewParams.getRule(RelativeLayout.RIGHT_OF) != 0) {
- timeViewParams.removeRule(RelativeLayout.RIGHT_OF);
- timeViewParams.addRule(RelativeLayout.LEFT_OF, R.id.bottom_bar_right);
- }
- break;
- case SIZE_TYPE_MINIMAL:
- // Relating to Title Bar
- mTitleBar.setVisibility(View.GONE);
- mBackButton.setVisibility(View.GONE);
-
- // Relating to Full Screen Button
- mMinimalExtraView.setVisibility(View.VISIBLE);
- mFullScreenButton = mMinimalExtraView.findViewById(R.id.fullscreen);
- mFullScreenButton.setOnClickListener(mFullScreenListener);
-
- // Relating to Center View
- mCenterView.removeAllViews();
- mBottomBarLeftView.removeView(mTransportControls);
- mTransportControls = inflateTransportControls(R.layout.minimal_transport_controls);
- mCenterView.addView(mTransportControls);
-
- // Relating to Progress Bar
- seeker.setThumb(null);
- mProgressBuffer.setVisibility(View.GONE);
-
- // Relating to Bottom Bar
- mBottomBar.setVisibility(View.GONE);
- break;
- }
- mTimeView.setLayoutParams(timeViewParams);
-
- if (isPlaying()) {
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_pause_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_pause_button_desc));
- } else {
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_play_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_play_button_desc));
- }
-
- if (mIsFullScreen) {
- mFullScreenButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_fullscreen_exit, null));
- } else {
- mFullScreenButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_fullscreen, null));
- }
- }
-
- private View inflateTransportControls(int layoutId) {
- View v = ApiHelper.inflateLibLayout(mInstance.getContext(), layoutId);
- mPlayPauseButton = v.findViewById(R.id.pause);
- if (mPlayPauseButton != null) {
- mPlayPauseButton.requestFocus();
- mPlayPauseButton.setOnClickListener(mPlayPauseListener);
- }
- mFfwdButton = v.findViewById(R.id.ffwd);
- if (mFfwdButton != null) {
- mFfwdButton.setOnClickListener(mFfwdListener);
- if (mMediaType == MEDIA_TYPE_MUSIC) {
- mFfwdButton.setVisibility(View.GONE);
- }
- }
- mRewButton = v.findViewById(R.id.rew);
- if (mRewButton != null) {
- mRewButton.setOnClickListener(mRewListener);
- if (mMediaType == MEDIA_TYPE_MUSIC) {
- mRewButton.setVisibility(View.GONE);
- }
- }
- // TODO: Add support for Next and Previous buttons
- mNextButton = v.findViewById(R.id.next);
- if (mNextButton != null) {
- mNextButton.setOnClickListener(mNextListener);
- mNextButton.setVisibility(View.GONE);
- }
- mPrevButton = v.findViewById(R.id.prev);
- if (mPrevButton != null) {
- mPrevButton.setOnClickListener(mPrevListener);
- mPrevButton.setVisibility(View.GONE);
- }
- return v;
- }
-
- private void initializeSettingsLists() {
- mSettingsMainTextsList = new ArrayList<String>();
- mSettingsMainTextsList.add(
- mResources.getString(R.string.MediaControlView2_audio_track_text));
- mSettingsMainTextsList.add(
- mResources.getString(R.string.MediaControlView2_playback_speed_text));
- mSettingsMainTextsList.add(
- mResources.getString(R.string.MediaControlView2_help_text));
-
- mSettingsSubTextsList = new ArrayList<String>();
- mSettingsSubTextsList.add(
- mResources.getString(R.string.MediaControlView2_audio_track_none_text));
- mSettingsSubTextsList.add(
- mResources.getStringArray(
- R.array.MediaControlView2_playback_speeds)[PLAYBACK_SPEED_1x_INDEX]);
- mSettingsSubTextsList.add(RESOURCE_EMPTY);
-
- mSettingsIconIdsList = new ArrayList<Integer>();
- mSettingsIconIdsList.add(R.drawable.ic_audiotrack);
- mSettingsIconIdsList.add(R.drawable.ic_play_circle_filled);
- mSettingsIconIdsList.add(R.drawable.ic_help);
-
- mAudioTrackList = new ArrayList<String>();
- mAudioTrackList.add(
- mResources.getString(R.string.MediaControlView2_audio_track_none_text));
-
- mVideoQualityList = new ArrayList<String>();
- mVideoQualityList.add(
- mResources.getString(R.string.MediaControlView2_video_quality_auto_text));
-
- mPlaybackSpeedTextList = new ArrayList<String>(Arrays.asList(
- mResources.getStringArray(R.array.MediaControlView2_playback_speeds)));
- // Select the "1x" speed as the default value.
- mSelectedSpeedIndex = PLAYBACK_SPEED_1x_INDEX;
-
- mPlaybackSpeedList = new ArrayList<Float>();
- int[] speeds = mResources.getIntArray(R.array.speed_multiplied_by_100);
- for (int i = 0; i < speeds.length; i++) {
- float speed = (float) speeds[i] / 100.0f;
- mPlaybackSpeedList.add(speed);
- }
- }
-
- private void displaySettingsWindow(BaseAdapter adapter) {
- // Set Adapter
- mSettingsListView.setAdapter(adapter);
-
- // Set width of window
- int itemWidth = (mSizeType == SIZE_TYPE_EMBEDDED)
- ? mEmbeddedSettingsItemWidth : mFullSettingsItemWidth;
- mSettingsWindow.setWidth(itemWidth);
-
- // Calculate height of window and show
- int itemHeight = (mSizeType == SIZE_TYPE_EMBEDDED)
- ? mEmbeddedSettingsItemHeight : mFullSettingsItemHeight;
- int totalHeight = adapter.getCount() * itemHeight;
- mSettingsWindow.dismiss();
- mSettingsWindow.showAsDropDown(mInstance, mSettingsWindowMargin,
- mSettingsWindowMargin - totalHeight, Gravity.BOTTOM | Gravity.RIGHT);
- }
-
- private class MediaControllerCallback extends MediaController.Callback {
- @Override
- public void onPlaybackStateChanged(PlaybackState state) {
- mPlaybackState = state;
-
- // Update pause button depending on playback state for the following two reasons:
- // 1) Need to handle case where app customizes playback state behavior when app
- // activity is resumed.
- // 2) Need to handle case where the media file reaches end of duration.
- if (mPlaybackState.getState() != mPrevState) {
- switch (mPlaybackState.getState()) {
- case PlaybackState.STATE_PLAYING:
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_pause_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_pause_button_desc));
- mInstance.removeCallbacks(mUpdateProgress);
- mInstance.post(mUpdateProgress);
- break;
- case PlaybackState.STATE_PAUSED:
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_play_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_play_button_desc));
- break;
- case PlaybackState.STATE_STOPPED:
- mPlayPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_replay_circle_filled, null));
- mPlayPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_replay_button_desc));
- mIsStopped = true;
- break;
- default:
- break;
- }
- mPrevState = mPlaybackState.getState();
- }
-
- if (mPlaybackActions != mPlaybackState.getActions()) {
- long newActions = mPlaybackState.getActions();
- if ((newActions & PlaybackState.ACTION_PAUSE) != 0) {
- mPlayPauseButton.setVisibility(View.VISIBLE);
- }
- if ((newActions & PlaybackState.ACTION_REWIND) != 0
- && mMediaType != MEDIA_TYPE_MUSIC) {
- if (mRewButton != null) {
- mRewButton.setVisibility(View.VISIBLE);
- }
- }
- if ((newActions & PlaybackState.ACTION_FAST_FORWARD) != 0
- && mMediaType != MEDIA_TYPE_MUSIC) {
- if (mFfwdButton != null) {
- mFfwdButton.setVisibility(View.VISIBLE);
- }
- }
- if ((newActions & PlaybackState.ACTION_SEEK_TO) != 0) {
- mSeekAvailable = true;
- } else {
- mSeekAvailable = false;
- }
- mPlaybackActions = newActions;
- }
-
- // Add buttons if custom actions are present.
- List<PlaybackState.CustomAction> customActions = mPlaybackState.getCustomActions();
- mCustomButtons.removeAllViews();
- if (customActions.size() > 0) {
- for (PlaybackState.CustomAction action : customActions) {
- ImageButton button = new ImageButton(mInstance.getContext(),
- null /* AttributeSet */, 0 /* Style */);
- // TODO: Apply R.style.BottomBarButton to this button using library context.
- // Refer Constructor with argument (int defStyleRes) of View.java
- button.setImageResource(action.getIcon());
- button.setTooltipText(action.getName());
- final String actionString = action.getAction().toString();
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO: Currently, we are just sending extras that came from session.
- // Is it the right behavior?
- mControls.sendCustomAction(actionString, action.getExtras());
- mInstance.setVisibility(View.VISIBLE);
- }
- });
- mCustomButtons.addView(button);
- }
- }
- }
-
- @Override
- public void onMetadataChanged(MediaMetadata metadata) {
- mMetadata = metadata;
- updateDuration();
- updateTitle();
- updateAudioMetadata();
- }
-
- @Override
- public void onSessionEvent(String event, Bundle extras) {
- switch (event) {
- case EVENT_UPDATE_TRACK_STATUS:
- mVideoTrackCount = extras.getInt(KEY_VIDEO_TRACK_COUNT);
- // If there is one or more audio tracks, and this information has not been
- // reflected into the Settings window yet, automatically check the first track.
- // Otherwise, the Audio Track selection will be defaulted to "None".
- mAudioTrackCount = extras.getInt(KEY_AUDIO_TRACK_COUNT);
- mAudioTrackList = new ArrayList<String>();
- if (mAudioTrackCount > 0) {
- // TODO: add more text about track info.
- for (int i = 0; i < mAudioTrackCount; i++) {
- String track = mResources.getString(
- R.string.MediaControlView2_audio_track_number_text, i + 1);
- mAudioTrackList.add(track);
- }
- // Change sub text inside the Settings window.
- mSettingsSubTextsList.set(SETTINGS_MODE_AUDIO_TRACK,
- mAudioTrackList.get(0));
- } else {
- mAudioTrackList.add(mResources.getString(
- R.string.MediaControlView2_audio_track_none_text));
- }
- if (mVideoTrackCount == 0 && mAudioTrackCount > 0) {
- mMediaType = MEDIA_TYPE_MUSIC;
- }
-
- mSubtitleTrackCount = extras.getInt(KEY_SUBTITLE_TRACK_COUNT);
- mSubtitleDescriptionsList = new ArrayList<String>();
- if (mSubtitleTrackCount > 0) {
- mSubtitleButton.setVisibility(View.VISIBLE);
- mSubtitleButton.setEnabled(true);
- mSubtitleDescriptionsList.add(mResources.getString(
- R.string.MediaControlView2_subtitle_off_text));
- for (int i = 0; i < mSubtitleTrackCount; i++) {
- String track = mResources.getString(
- R.string.MediaControlView2_subtitle_track_number_text, i + 1);
- mSubtitleDescriptionsList.add(track);
- }
- } else {
- mSubtitleButton.setVisibility(View.GONE);
- mSubtitleButton.setEnabled(false);
- }
- break;
- case EVENT_UPDATE_MEDIA_TYPE_STATUS:
- boolean newStatus = extras.getBoolean(KEY_STATE_IS_ADVERTISEMENT);
- if (newStatus != mIsAdvertisement) {
- mIsAdvertisement = newStatus;
- updateLayout();
- }
- break;
- }
- }
- }
-
- private class SettingsAdapter extends BaseAdapter {
- private List<Integer> mIconIds;
- private List<String> mMainTexts;
- private List<String> mSubTexts;
-
- public SettingsAdapter(List<String> mainTexts, @Nullable List<String> subTexts,
- @Nullable List<Integer> iconIds) {
- mMainTexts = mainTexts;
- mSubTexts = subTexts;
- mIconIds = iconIds;
- }
-
- public void updateSubTexts(List<String> subTexts) {
- mSubTexts = subTexts;
- notifyDataSetChanged();
- }
-
- public String getMainText(int position) {
- if (mMainTexts != null) {
- if (position < mMainTexts.size()) {
- return mMainTexts.get(position);
- }
- }
- return RESOURCE_EMPTY;
- }
-
- @Override
- public int getCount() {
- return (mMainTexts == null) ? 0 : mMainTexts.size();
- }
-
- @Override
- public long getItemId(int position) {
- // Auto-generated method stub--does not have any purpose here
- // TODO: implement this.
- return 0;
- }
-
- @Override
- public Object getItem(int position) {
- // Auto-generated method stub--does not have any purpose here
- // TODO: implement this.
- return null;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup container) {
- View row;
- if (mSizeType == SIZE_TYPE_FULL) {
- row = ApiHelper.inflateLibLayout(mInstance.getContext(),
- R.layout.full_settings_list_item);
- } else {
- row = ApiHelper.inflateLibLayout(mInstance.getContext(),
- R.layout.embedded_settings_list_item);
- }
- TextView mainTextView = (TextView) row.findViewById(R.id.main_text);
- TextView subTextView = (TextView) row.findViewById(R.id.sub_text);
- ImageView iconView = (ImageView) row.findViewById(R.id.icon);
-
- // Set main text
- mainTextView.setText(mMainTexts.get(position));
-
- // Remove sub text and center the main text if sub texts do not exist at all or the sub
- // text at this particular position is empty.
- if (mSubTexts == null || mSubTexts.get(position) == RESOURCE_EMPTY) {
- subTextView.setVisibility(View.GONE);
- } else {
- // Otherwise, set sub text.
- subTextView.setText(mSubTexts.get(position));
- }
-
- // Remove main icon and set visibility to gone if icons are set to null or the icon at
- // this particular position is set to RESOURCE_NON_EXISTENT.
- if (mIconIds == null || mIconIds.get(position) == RESOURCE_NON_EXISTENT) {
- iconView.setVisibility(View.GONE);
- } else {
- // Otherwise, set main icon.
- iconView.setImageDrawable(mResources.getDrawable(mIconIds.get(position), null));
- }
- return row;
- }
-
- public void setSubTexts(List<String> subTexts) {
- mSubTexts = subTexts;
- }
- }
-
- // TODO: extend this class from SettingsAdapter
- private class SubSettingsAdapter extends BaseAdapter {
- private List<String> mTexts;
- private int mCheckPosition;
-
- public SubSettingsAdapter(List<String> texts, int checkPosition) {
- mTexts = texts;
- mCheckPosition = checkPosition;
- }
-
- public String getMainText(int position) {
- if (mTexts != null) {
- if (position < mTexts.size()) {
- return mTexts.get(position);
- }
- }
- return RESOURCE_EMPTY;
- }
-
- @Override
- public int getCount() {
- return (mTexts == null) ? 0 : mTexts.size();
- }
-
- @Override
- public long getItemId(int position) {
- // Auto-generated method stub--does not have any purpose here
- // TODO: implement this.
- return 0;
- }
-
- @Override
- public Object getItem(int position) {
- // Auto-generated method stub--does not have any purpose here
- // TODO: implement this.
- return null;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup container) {
- View row;
- if (mSizeType == SIZE_TYPE_FULL) {
- row = ApiHelper.inflateLibLayout(mInstance.getContext(),
- R.layout.full_sub_settings_list_item);
- } else {
- row = ApiHelper.inflateLibLayout(mInstance.getContext(),
- R.layout.embedded_sub_settings_list_item);
- }
- TextView textView = (TextView) row.findViewById(R.id.text);
- ImageView checkView = (ImageView) row.findViewById(R.id.check);
-
- textView.setText(mTexts.get(position));
- if (position != mCheckPosition) {
- checkView.setVisibility(View.INVISIBLE);
- }
- return row;
- }
-
- public void setTexts(List<String> texts) {
- mTexts = texts;
- }
-
- public void setCheckPosition(int checkPosition) {
- mCheckPosition = checkPosition;
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/widget/VideoSurfaceView.java b/packages/MediaComponents/src/com/android/widget/VideoSurfaceView.java
deleted file mode 100644
index 061bc5b..0000000
--- a/packages/MediaComponents/src/com/android/widget/VideoSurfaceView.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import static android.widget.VideoView2.VIEW_TYPE_SURFACEVIEW;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.media.MediaPlayer2;
-import android.media.VideoSize;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-
-class VideoSurfaceView extends SurfaceView implements VideoViewInterface, SurfaceHolder.Callback {
- private static final String TAG = "VideoSurfaceView";
- private static final boolean DEBUG = true; // STOPSHIP: Log.isLoggable(TAG, Log.DEBUG);
- private SurfaceHolder mSurfaceHolder = null;
- private SurfaceListener mSurfaceListener = null;
- private MediaPlayer2 mMediaPlayer;
- // A flag to indicate taking over other view should be proceed.
- private boolean mIsTakingOverOldView;
- private VideoViewInterface mOldView;
-
-
- public VideoSurfaceView(Context context) {
- this(context, null);
- }
-
- public VideoSurfaceView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public VideoSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
- this(context, attrs, defStyleAttr, 0);
- }
-
- public VideoSurfaceView(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- getHolder().addCallback(this);
- }
-
- ////////////////////////////////////////////////////
- // implements VideoViewInterface
- ////////////////////////////////////////////////////
-
- @Override
- public boolean assignSurfaceToMediaPlayer(MediaPlayer2 mp) {
- Log.d(TAG, "assignSurfaceToMediaPlayer(): mSurfaceHolder: " + mSurfaceHolder);
- if (mp == null || !hasAvailableSurface()) {
- return false;
- }
- mp.setDisplay(mSurfaceHolder);
- return true;
- }
-
- @Override
- public void setSurfaceListener(SurfaceListener l) {
- mSurfaceListener = l;
- }
-
- @Override
- public int getViewType() {
- return VIEW_TYPE_SURFACEVIEW;
- }
-
- @Override
- public void setMediaPlayer(MediaPlayer2 mp) {
- mMediaPlayer = mp;
- if (mIsTakingOverOldView) {
- takeOver(mOldView);
- }
- }
-
- @Override
- public void takeOver(@NonNull VideoViewInterface oldView) {
- if (assignSurfaceToMediaPlayer(mMediaPlayer)) {
- ((View) oldView).setVisibility(GONE);
- mIsTakingOverOldView = false;
- mOldView = null;
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceTakeOverDone(this);
- }
- } else {
- mIsTakingOverOldView = true;
- mOldView = oldView;
- }
- }
-
- @Override
- public boolean hasAvailableSurface() {
- return (mSurfaceHolder != null && mSurfaceHolder.getSurface() != null);
- }
-
- ////////////////////////////////////////////////////
- // implements SurfaceHolder.Callback
- ////////////////////////////////////////////////////
-
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- Log.d(TAG, "surfaceCreated: mSurfaceHolder: " + mSurfaceHolder + ", new holder: " + holder);
- mSurfaceHolder = holder;
- if (mIsTakingOverOldView) {
- takeOver(mOldView);
- } else {
- assignSurfaceToMediaPlayer(mMediaPlayer);
- }
-
- if (mSurfaceListener != null) {
- Rect rect = mSurfaceHolder.getSurfaceFrame();
- mSurfaceListener.onSurfaceCreated(this, rect.width(), rect.height());
- }
- }
-
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceChanged(this, width, height);
- }
- }
-
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- // After we return from this we can't use the surface any more
- mSurfaceHolder = null;
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceDestroyed(this);
- }
- }
-
- // TODO: Investigate the way to move onMeasure() code into FrameLayout.
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int videoWidth = (mMediaPlayer == null) ? 0 : mMediaPlayer.getVideoSize().getWidth();
- int videoHeight = (mMediaPlayer == null) ? 0 : mMediaPlayer.getVideoSize().getHeight();
- if (DEBUG) {
- Log.d(TAG, "onMeasure(" + MeasureSpec.toString(widthMeasureSpec) + ", "
- + MeasureSpec.toString(heightMeasureSpec) + ")");
- Log.i(TAG, " measuredSize: " + getMeasuredWidth() + "/" + getMeasuredHeight());
- Log.i(TAG, " viewSize: " + getWidth() + "/" + getHeight());
- Log.i(TAG, " mVideoWidth/height: " + videoWidth + ", " + videoHeight);
- }
-
- int width = getDefaultSize(videoWidth, widthMeasureSpec);
- int height = getDefaultSize(videoHeight, heightMeasureSpec);
-
- if (videoWidth > 0 && videoHeight > 0) {
- int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
- int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
-
- width = widthSpecSize;
- height = heightSpecSize;
-
- // for compatibility, we adjust size based on aspect ratio
- if (videoWidth * height < width * videoHeight) {
- width = height * videoWidth / videoHeight;
- if (DEBUG) {
- Log.d(TAG, "image too wide, correcting. width: " + width);
- }
- } else if (videoWidth * height > width * videoHeight) {
- height = width * videoHeight / videoWidth;
- if (DEBUG) {
- Log.d(TAG, "image too tall, correcting. height: " + height);
- }
- }
- } else {
- // no size yet, just adopt the given spec sizes
- }
- setMeasuredDimension(width, height);
- if (DEBUG) {
- Log.i(TAG, "end of onMeasure()");
- Log.i(TAG, " measuredSize: " + getMeasuredWidth() + "/" + getMeasuredHeight());
- }
- }
-
- @Override
- public String toString() {
- return "ViewType: SurfaceView / Visibility: " + getVisibility()
- + " / surfaceHolder: " + mSurfaceHolder;
- }
-}
diff --git a/packages/MediaComponents/src/com/android/widget/VideoTextureView.java b/packages/MediaComponents/src/com/android/widget/VideoTextureView.java
deleted file mode 100644
index c2c1ca6..0000000
--- a/packages/MediaComponents/src/com/android/widget/VideoTextureView.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import static android.widget.VideoView2.VIEW_TYPE_TEXTUREVIEW;
-
-import android.content.Context;
-import android.graphics.SurfaceTexture;
-import android.media.MediaPlayer2;
-import android.media.VideoSize;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Surface;
-import android.view.TextureView;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-
-@RequiresApi(26)
-class VideoTextureView extends TextureView
- implements VideoViewInterface, TextureView.SurfaceTextureListener {
- private static final String TAG = "VideoTextureView";
- private static final boolean DEBUG = true; // STOPSHIP: Log.isLoggable(TAG, Log.DEBUG);
-
- private SurfaceTexture mSurfaceTexture;
- private Surface mSurface;
- private SurfaceListener mSurfaceListener;
- private MediaPlayer2 mMediaPlayer;
- // A flag to indicate taking over other view should be proceed.
- private boolean mIsTakingOverOldView;
- private VideoViewInterface mOldView;
-
- public VideoTextureView(Context context) {
- this(context, null);
- }
-
- public VideoTextureView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public VideoTextureView(Context context, AttributeSet attrs, int defStyleAttr) {
- this(context, attrs, defStyleAttr, 0);
- }
-
- public VideoTextureView(
- Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- setSurfaceTextureListener(this);
- }
-
- ////////////////////////////////////////////////////
- // implements VideoViewInterface
- ////////////////////////////////////////////////////
-
- @Override
- public boolean assignSurfaceToMediaPlayer(MediaPlayer2 mp) {
- Log.d(TAG, "assignSurfaceToMediaPlayer(): mSurfaceTexture: " + mSurfaceTexture);
- if (mp == null || !hasAvailableSurface()) {
- // Surface is not ready.
- return false;
- }
- mp.setSurface(mSurface);
- return true;
- }
-
- @Override
- public void setSurfaceListener(SurfaceListener l) {
- mSurfaceListener = l;
- }
-
- @Override
- public int getViewType() {
- return VIEW_TYPE_TEXTUREVIEW;
- }
-
- @Override
- public void setMediaPlayer(MediaPlayer2 mp) {
- mMediaPlayer = mp;
- if (mIsTakingOverOldView) {
- takeOver(mOldView);
- }
- }
-
- @Override
- public void takeOver(@NonNull VideoViewInterface oldView) {
- if (assignSurfaceToMediaPlayer(mMediaPlayer)) {
- ((View) oldView).setVisibility(GONE);
- mIsTakingOverOldView = false;
- mOldView = null;
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceTakeOverDone(this);
- }
- } else {
- mIsTakingOverOldView = true;
- mOldView = oldView;
- }
- }
-
- @Override
- public boolean hasAvailableSurface() {
- return (mSurfaceTexture != null && !mSurfaceTexture.isReleased() && mSurface != null);
- }
-
- ////////////////////////////////////////////////////
- // implements TextureView.SurfaceTextureListener
- ////////////////////////////////////////////////////
-
- @Override
- public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
- Log.d(TAG, "onSurfaceTextureAvailable: mSurfaceTexture: " + mSurfaceTexture
- + ", new surface: " + surfaceTexture);
- mSurfaceTexture = surfaceTexture;
- mSurface = new Surface(mSurfaceTexture);
- if (mIsTakingOverOldView) {
- takeOver(mOldView);
- } else {
- assignSurfaceToMediaPlayer(mMediaPlayer);
- }
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceCreated(this, width, height);
- }
- }
-
- @Override
- public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) {
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceChanged(this, width, height);
- }
- // requestLayout(); // TODO: figure out if it should be called here?
- }
-
- @Override
- public void onSurfaceTextureUpdated(SurfaceTexture surface) {
- // no-op
- }
-
- @Override
- public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
- if (mSurfaceListener != null) {
- mSurfaceListener.onSurfaceDestroyed(this);
- }
- mSurfaceTexture = null;
- mSurface = null;
- return true;
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int videoWidth = (mMediaPlayer == null) ? 0 : mMediaPlayer.getVideoSize().getWidth();
- int videoHeight = (mMediaPlayer == null) ? 0 : mMediaPlayer.getVideoSize().getHeight();
- if (DEBUG) {
- Log.d(TAG, "onMeasure(" + MeasureSpec.toString(widthMeasureSpec) + ", "
- + MeasureSpec.toString(heightMeasureSpec) + ")");
- Log.i(TAG, " measuredSize: " + getMeasuredWidth() + "/" + getMeasuredHeight());
- Log.i(TAG, " viewSize: " + getWidth() + "/" + getHeight());
- Log.i(TAG, " mVideoWidth/height: " + videoWidth + ", " + videoHeight);
- }
-
- int width = getDefaultSize(videoWidth, widthMeasureSpec);
- int height = getDefaultSize(videoHeight, heightMeasureSpec);
-
- if (videoWidth > 0 && videoHeight > 0) {
- int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
- int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
-
- width = widthSpecSize;
- height = heightSpecSize;
-
- // for compatibility, we adjust size based on aspect ratio
- if (videoWidth * height < width * videoHeight) {
- width = height * videoWidth / videoHeight;
- if (DEBUG) {
- Log.d(TAG, "image too wide, correcting. width: " + width);
- }
- } else if (videoWidth * height > width * videoHeight) {
- height = width * videoHeight / videoWidth;
- if (DEBUG) {
- Log.d(TAG, "image too tall, correcting. height: " + height);
- }
- }
- } else {
- // no size yet, just adopt the given spec sizes
- }
- setMeasuredDimension(width, height);
- if (DEBUG) {
- Log.i(TAG, "end of onMeasure()");
- Log.i(TAG, " measuredSize: " + getMeasuredWidth() + "/" + getMeasuredHeight());
- }
- }
-
- @Override
- public String toString() {
- return "ViewType: TextureView / Visibility: " + getVisibility()
- + " / surfaceTexture: " + mSurfaceTexture;
-
- }
-}
diff --git a/packages/MediaComponents/src/com/android/widget/VideoView2Impl.java b/packages/MediaComponents/src/com/android/widget/VideoView2Impl.java
deleted file mode 100644
index 3dae8f7..0000000
--- a/packages/MediaComponents/src/com/android/widget/VideoView2Impl.java
+++ /dev/null
@@ -1,1383 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import android.content.Context;
-import android.content.pm.ActivityInfo;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Point;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.media.AudioAttributes;
-import android.media.AudioFocusRequest;
-import android.media.AudioManager;
-import android.media.DataSourceDesc;
-import android.media.MediaItem2;
-import android.media.MediaMetadata;
-import android.media.MediaMetadata2;
-import android.media.MediaMetadataRetriever;
-import android.media.MediaPlayer2;
-import android.media.MediaPlayer2.EventCallback;
-import android.media.MediaPlayer2;
-import android.media.PlaybackParams;
-import android.media.SessionToken2;
-import android.media.SubtitleData;
-import android.media.TimedText;
-import android.media.VideoSize;
-import android.media.session.MediaController;
-import android.media.session.MediaController.PlaybackInfo;
-import android.media.session.MediaSession;
-import android.media.session.PlaybackState;
-import android.media.update.VideoView2Provider;
-import android.media.update.ViewGroupProvider;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.ResultReceiver;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.util.Pair;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup.LayoutParams;
-import android.view.WindowManager;
-import android.view.accessibility.AccessibilityManager;
-import android.widget.ImageView;
-import android.widget.MediaControlView2;
-import android.widget.TextView;
-import android.widget.VideoView2;
-
-import androidx.annotation.Nullable;
-
-import com.android.internal.graphics.palette.Palette;
-import com.android.media.RoutePlayer;
-import com.android.media.subtitle.ClosedCaptionRenderer;
-import com.android.media.subtitle.SubtitleController;
-import com.android.media.subtitle.SubtitleTrack;
-import com.android.media.update.ApiHelper;
-import com.android.media.update.R;
-import com.android.support.mediarouter.media.MediaControlIntent;
-import com.android.support.mediarouter.media.MediaItemStatus;
-import com.android.support.mediarouter.media.MediaRouteSelector;
-import com.android.support.mediarouter.media.MediaRouter;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Executor;
-
-public class VideoView2Impl extends BaseLayout
- implements VideoView2Provider, VideoViewInterface.SurfaceListener {
- private static final String TAG = "VideoView2";
- private static final boolean DEBUG = true; // STOPSHIP: Log.isLoggable(TAG, Log.DEBUG);
- private static final long DEFAULT_SHOW_CONTROLLER_INTERVAL_MS = 2000;
-
- private final VideoView2 mInstance;
-
- private static final int STATE_ERROR = -1;
- private static final int STATE_IDLE = 0;
- private static final int STATE_PREPARING = 1;
- private static final int STATE_PREPARED = 2;
- private static final int STATE_PLAYING = 3;
- private static final int STATE_PAUSED = 4;
- private static final int STATE_PLAYBACK_COMPLETED = 5;
-
- private static final int INVALID_TRACK_INDEX = -1;
- private static final float INVALID_SPEED = 0f;
-
- private static final int SIZE_TYPE_EMBEDDED = 0;
- private static final int SIZE_TYPE_FULL = 1;
- // TODO: add support for Minimal size type.
- private static final int SIZE_TYPE_MINIMAL = 2;
-
- private AccessibilityManager mAccessibilityManager;
- private AudioManager mAudioManager;
- private AudioAttributes mAudioAttributes;
- private int mAudioFocusType = AudioManager.AUDIOFOCUS_GAIN; // legacy focus gain
-
- private Pair<Executor, VideoView2.OnCustomActionListener> mCustomActionListenerRecord;
- private VideoView2.OnViewTypeChangedListener mViewTypeChangedListener;
- private VideoView2.OnFullScreenRequestListener mFullScreenRequestListener;
-
- private VideoViewInterface mCurrentView;
- private VideoTextureView mTextureView;
- private VideoSurfaceView mSurfaceView;
-
- private MediaPlayer2 mMediaPlayer;
- private DataSourceDesc mDsd;
- private MediaControlView2 mMediaControlView;
- private MediaSession mMediaSession;
- private MediaController mMediaController;
- private boolean mSeekable;
- private MediaMetadata2 mMediaMetadata;
- private MediaMetadataRetriever mRetriever;
- private boolean mNeedUpdateMediaType;
- private Bundle mMediaTypeData;
- private String mTitle;
-
- // TODO: move music view inside SurfaceView/TextureView or implement VideoViewInterface.
- private WindowManager mManager;
- private Resources mResources;
- private View mMusicView;
- private Drawable mMusicAlbumDrawable;
- private String mMusicTitleText;
- private String mMusicArtistText;
- private boolean mIsMusicMediaType;
- private int mPrevWidth;
- private int mPrevHeight;
- private int mDominantColor;
- private int mSizeType;
-
- private PlaybackState.Builder mStateBuilder;
- private List<PlaybackState.CustomAction> mCustomActionList;
- private int mTargetState = STATE_IDLE;
- private int mCurrentState = STATE_IDLE;
- private int mCurrentBufferPercentage;
- private long mSeekWhenPrepared; // recording the seek position while preparing
-
- private int mVideoWidth;
- private int mVideoHeight;
-
- private ArrayList<Integer> mVideoTrackIndices;
- private ArrayList<Integer> mAudioTrackIndices;
- private ArrayList<Pair<Integer, SubtitleTrack>> mSubtitleTrackIndices;
- private SubtitleController mSubtitleController;
-
- // selected video/audio/subtitle track index as MediaPlayer2 returns
- private int mSelectedVideoTrackIndex;
- private int mSelectedAudioTrackIndex;
- private int mSelectedSubtitleTrackIndex;
-
- private SubtitleView mSubtitleView;
- private boolean mSubtitleEnabled;
-
- private float mSpeed;
- // TODO: Remove mFallbackSpeed when integration with MediaPlayer2's new setPlaybackParams().
- // Refer: https://docs.google.com/document/d/1nzAfns6i2hJ3RkaUre3QMT6wsDedJ5ONLiA_OOBFFX8/edit
- private float mFallbackSpeed; // keep the original speed before 'pause' is called.
- private float mVolumeLevelFloat;
- private int mVolumeLevel;
-
- private long mShowControllerIntervalMs;
-
- private MediaRouter mMediaRouter;
- private MediaRouteSelector mRouteSelector;
- private MediaRouter.RouteInfo mRoute;
- private RoutePlayer mRoutePlayer;
-
- private final MediaRouter.Callback mRouterCallback = new MediaRouter.Callback() {
- @Override
- public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
- if (route.supportsControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
- // Stop local playback (if necessary)
- resetPlayer();
- mRoute = route;
- mRoutePlayer = new RoutePlayer(mInstance.getContext(), route);
- mRoutePlayer.setPlayerEventCallback(new RoutePlayer.PlayerEventCallback() {
- @Override
- public void onPlayerStateChanged(MediaItemStatus itemStatus) {
- PlaybackState.Builder psBuilder = new PlaybackState.Builder();
- psBuilder.setActions(RoutePlayer.PLAYBACK_ACTIONS);
- long position = itemStatus.getContentPosition();
- switch (itemStatus.getPlaybackState()) {
- case MediaItemStatus.PLAYBACK_STATE_PENDING:
- psBuilder.setState(PlaybackState.STATE_NONE, position, 0);
- mCurrentState = STATE_IDLE;
- break;
- case MediaItemStatus.PLAYBACK_STATE_PLAYING:
- psBuilder.setState(PlaybackState.STATE_PLAYING, position, 1);
- mCurrentState = STATE_PLAYING;
- break;
- case MediaItemStatus.PLAYBACK_STATE_PAUSED:
- psBuilder.setState(PlaybackState.STATE_PAUSED, position, 0);
- mCurrentState = STATE_PAUSED;
- break;
- case MediaItemStatus.PLAYBACK_STATE_BUFFERING:
- psBuilder.setState(PlaybackState.STATE_BUFFERING, position, 0);
- mCurrentState = STATE_PAUSED;
- break;
- case MediaItemStatus.PLAYBACK_STATE_FINISHED:
- psBuilder.setState(PlaybackState.STATE_STOPPED, position, 0);
- mCurrentState = STATE_PLAYBACK_COMPLETED;
- break;
- }
-
- PlaybackState pbState = psBuilder.build();
- mMediaSession.setPlaybackState(pbState);
-
- MediaMetadata.Builder mmBuilder = new MediaMetadata.Builder();
- mmBuilder.putLong(MediaMetadata.METADATA_KEY_DURATION,
- itemStatus.getContentDuration());
- mMediaSession.setMetadata(mmBuilder.build());
- }
- });
- // Start remote playback (if necessary)
- mRoutePlayer.openVideo(mDsd);
- }
- }
-
- @Override
- public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route, int reason) {
- if (mRoute != null && mRoutePlayer != null) {
- mRoutePlayer.release();
- mRoutePlayer = null;
- }
- if (mRoute == route) {
- mRoute = null;
- }
- if (reason != MediaRouter.UNSELECT_REASON_ROUTE_CHANGED) {
- // TODO: Resume local playback (if necessary)
- openVideo(mDsd);
- }
- }
- };
-
- public VideoView2Impl(VideoView2 instance,
- ViewGroupProvider superProvider, ViewGroupProvider privateProvider) {
- super(instance, superProvider, privateProvider);
- mInstance = instance;
- }
-
- @Override
- public void initialize(@Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- mVideoWidth = 0;
- mVideoHeight = 0;
- mSpeed = 1.0f;
- mFallbackSpeed = mSpeed;
- mSelectedSubtitleTrackIndex = INVALID_TRACK_INDEX;
- mSeekable = true;
- // TODO: add attributes to get this value.
- mShowControllerIntervalMs = DEFAULT_SHOW_CONTROLLER_INTERVAL_MS;
-
- mAccessibilityManager = AccessibilityManager.getInstance(mInstance.getContext());
-
- mAudioManager = (AudioManager) mInstance.getContext()
- .getSystemService(Context.AUDIO_SERVICE);
- mAudioAttributes = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA)
- .setContentType(AudioAttributes.CONTENT_TYPE_MOVIE).build();
- mInstance.setFocusable(true);
- mInstance.setFocusableInTouchMode(true);
- mInstance.requestFocus();
-
- // TODO: try to keep a single child at a time rather than always having both.
- mTextureView = new VideoTextureView(mInstance.getContext());
- mSurfaceView = new VideoSurfaceView(mInstance.getContext());
- LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT);
- mTextureView.setLayoutParams(params);
- mSurfaceView.setLayoutParams(params);
- mTextureView.setSurfaceListener(this);
- mSurfaceView.setSurfaceListener(this);
- mInstance.addView(mTextureView);
- mInstance.addView(mSurfaceView);
-
- mSubtitleView = new SubtitleView(mInstance.getContext());
- mSubtitleView.setLayoutParams(params);
- mSubtitleView.setBackgroundColor(0);
- mInstance.addView(mSubtitleView);
-
- boolean enableControlView = (attrs == null) || attrs.getAttributeBooleanValue(
- "http://schemas.android.com/apk/res/android",
- "enableControlView", true);
- if (enableControlView) {
- mMediaControlView = new MediaControlView2(mInstance.getContext());
- }
-
- mSubtitleEnabled = (attrs == null) || attrs.getAttributeBooleanValue(
- "http://schemas.android.com/apk/res/android",
- "enableSubtitle", false);
-
- // TODO: Choose TextureView when SurfaceView cannot be created.
- // Choose surface view by default
- int viewType = (attrs == null) ? VideoView2.VIEW_TYPE_SURFACEVIEW
- : attrs.getAttributeIntValue(
- "http://schemas.android.com/apk/res/android",
- "viewType", VideoView2.VIEW_TYPE_SURFACEVIEW);
- if (viewType == VideoView2.VIEW_TYPE_SURFACEVIEW) {
- Log.d(TAG, "viewType attribute is surfaceView.");
- mTextureView.setVisibility(View.GONE);
- mSurfaceView.setVisibility(View.VISIBLE);
- mCurrentView = mSurfaceView;
- } else if (viewType == VideoView2.VIEW_TYPE_TEXTUREVIEW) {
- Log.d(TAG, "viewType attribute is textureView.");
- mTextureView.setVisibility(View.VISIBLE);
- mSurfaceView.setVisibility(View.GONE);
- mCurrentView = mTextureView;
- }
-
- MediaRouteSelector.Builder builder = new MediaRouteSelector.Builder();
- builder.addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
- builder.addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO);
- builder.addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
- mRouteSelector = builder.build();
- }
-
- @Override
- public void setMediaControlView2_impl(MediaControlView2 mediaControlView, long intervalMs) {
- mMediaControlView = mediaControlView;
- mShowControllerIntervalMs = intervalMs;
- // TODO: Call MediaControlView2.setRouteSelector only when cast availalbe.
- ((MediaControlView2Impl) mMediaControlView.getProvider()).setRouteSelector(mRouteSelector);
-
- if (mInstance.isAttachedToWindow()) {
- attachMediaControlView();
- }
- }
-
- @Override
- public MediaController getMediaController_impl() {
- if (mMediaSession == null) {
- throw new IllegalStateException("MediaSession instance is not available.");
- }
- return mMediaController;
- }
-
- @Override
- public SessionToken2 getMediaSessionToken_impl() {
- // TODO: implement this
- return null;
- }
-
- @Override
- public MediaControlView2 getMediaControlView2_impl() {
- return mMediaControlView;
- }
-
- @Override
- public MediaMetadata2 getMediaMetadata_impl() {
- return mMediaMetadata;
- }
-
- @Override
- public void setMediaMetadata_impl(MediaMetadata2 metadata) {
- // TODO: integrate this with MediaSession2#MediaItem2
- mMediaMetadata = metadata;
-
- // TODO: add support for handling website link
- mMediaTypeData = new Bundle();
- boolean isAd = metadata == null ?
- false : metadata.getLong(MediaMetadata2.METADATA_KEY_ADVERTISEMENT) != 0;
- mMediaTypeData.putBoolean(
- MediaControlView2Impl.KEY_STATE_IS_ADVERTISEMENT, isAd);
-
- if (mMediaSession != null) {
- mMediaSession.sendSessionEvent(
- MediaControlView2Impl.EVENT_UPDATE_MEDIA_TYPE_STATUS, mMediaTypeData);
- } else {
- // Update later inside OnPreparedListener after MediaSession is initialized.
- mNeedUpdateMediaType = true;
- }
- }
-
- @Override
- public void setSubtitleEnabled_impl(boolean enable) {
- if (enable != mSubtitleEnabled) {
- selectOrDeselectSubtitle(enable);
- }
- mSubtitleEnabled = enable;
- }
-
- @Override
- public boolean isSubtitleEnabled_impl() {
- return mSubtitleEnabled;
- }
-
- // TODO: remove setSpeed_impl once MediaController2 is ready.
- @Override
- public void setSpeed_impl(float speed) {
- if (speed <= 0.0f) {
- Log.e(TAG, "Unsupported speed (" + speed + ") is ignored.");
- return;
- }
- mSpeed = speed;
- if (mMediaPlayer != null && mMediaPlayer.getState() == MediaPlayer2.PLAYER_STATE_PLAYING) {
- applySpeed();
- }
- updatePlaybackState();
- }
-
- @Override
- public void setAudioFocusRequest_impl(int focusGain) {
- if (focusGain != AudioManager.AUDIOFOCUS_NONE
- && focusGain != AudioManager.AUDIOFOCUS_GAIN
- && focusGain != AudioManager.AUDIOFOCUS_GAIN_TRANSIENT
- && focusGain != AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
- && focusGain != AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE) {
- throw new IllegalArgumentException("Illegal audio focus type " + focusGain);
- }
- mAudioFocusType = focusGain;
- }
-
- @Override
- public void setAudioAttributes_impl(AudioAttributes attributes) {
- if (attributes == null) {
- throw new IllegalArgumentException("Illegal null AudioAttributes");
- }
- mAudioAttributes = attributes;
- }
-
- @Override
- public void setVideoPath_impl(String path) {
- mInstance.setVideoUri(Uri.parse(path));
- }
-
- @Override
- public void setVideoUri_impl(Uri uri) {
- mInstance.setVideoUri(uri, null);
- }
-
- @Override
- public void setVideoUri_impl(Uri uri, Map<String, String> headers) {
- DataSourceDesc.Builder builder = new DataSourceDesc.Builder();
- builder.setDataSource(mInstance.getContext(), uri, headers, null);
- mInstance.setDataSource(builder.build());
- }
-
- @Override
- public void setMediaItem_impl(MediaItem2 mediaItem) {
- // TODO: implement this
- }
-
- @Override
- public void setDataSource_impl(DataSourceDesc dsd) {
- mDsd = dsd;
- mSeekWhenPrepared = 0;
- openVideo(dsd);
- }
-
- @Override
- public void setViewType_impl(int viewType) {
- if (viewType == mCurrentView.getViewType()) {
- return;
- }
- VideoViewInterface targetView;
- if (viewType == VideoView2.VIEW_TYPE_TEXTUREVIEW) {
- Log.d(TAG, "switching to TextureView");
- targetView = mTextureView;
- } else if (viewType == VideoView2.VIEW_TYPE_SURFACEVIEW) {
- Log.d(TAG, "switching to SurfaceView");
- targetView = mSurfaceView;
- } else {
- throw new IllegalArgumentException("Unknown view type: " + viewType);
- }
- ((View) targetView).setVisibility(View.VISIBLE);
- targetView.takeOver(mCurrentView);
- mInstance.requestLayout();
- }
-
- @Override
- public int getViewType_impl() {
- return mCurrentView.getViewType();
- }
-
- @Override
- public void setCustomActions_impl(
- List<PlaybackState.CustomAction> actionList,
- Executor executor, VideoView2.OnCustomActionListener listener) {
- mCustomActionList = actionList;
- mCustomActionListenerRecord = new Pair<>(executor, listener);
-
- // Create a new playback builder in order to clear existing the custom actions.
- mStateBuilder = null;
- updatePlaybackState();
- }
-
- @Override
- public void setOnViewTypeChangedListener_impl(VideoView2.OnViewTypeChangedListener l) {
- mViewTypeChangedListener = l;
- }
-
- @Override
- public void setFullScreenRequestListener_impl(VideoView2.OnFullScreenRequestListener l) {
- mFullScreenRequestListener = l;
- }
-
- @Override
- public void onAttachedToWindow_impl() {
- super.onAttachedToWindow_impl();
-
- // Create MediaSession
- mMediaSession = new MediaSession(mInstance.getContext(), "VideoView2MediaSession");
- mMediaSession.setCallback(new MediaSessionCallback());
- mMediaSession.setActive(true);
- mMediaController = mMediaSession.getController();
- mMediaRouter = MediaRouter.getInstance(mInstance.getContext());
- mMediaRouter.setMediaSession(mMediaSession);
- mMediaRouter.addCallback(mRouteSelector, mRouterCallback);
- attachMediaControlView();
- // TODO: remove this after moving MediaSession creating code inside initializing VideoView2
- if (mCurrentState == STATE_PREPARED) {
- extractTracks();
- extractMetadata();
- extractAudioMetadata();
- if (mNeedUpdateMediaType) {
- mMediaSession.sendSessionEvent(
- MediaControlView2Impl.EVENT_UPDATE_MEDIA_TYPE_STATUS,
- mMediaTypeData);
- mNeedUpdateMediaType = false;
- }
- }
- }
-
- @Override
- public void onDetachedFromWindow_impl() {
- super.onDetachedFromWindow_impl();
-
- mMediaSession.release();
- mMediaSession = null;
- mMediaController = null;
- }
-
- @Override
- public CharSequence getAccessibilityClassName_impl() {
- return VideoView2.class.getName();
- }
-
- @Override
- public boolean onTouchEvent_impl(MotionEvent ev) {
- if (DEBUG) {
- Log.d(TAG, "onTouchEvent(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState);
- }
- if (ev.getAction() == MotionEvent.ACTION_UP && mMediaControlView != null) {
- if (!mIsMusicMediaType || mSizeType != SIZE_TYPE_FULL) {
- toggleMediaControlViewVisibility();
- }
- }
-
- return super.onTouchEvent_impl(ev);
- }
-
- @Override
- public boolean onTrackballEvent_impl(MotionEvent ev) {
- if (ev.getAction() == MotionEvent.ACTION_UP && mMediaControlView != null) {
- if (!mIsMusicMediaType || mSizeType != SIZE_TYPE_FULL) {
- toggleMediaControlViewVisibility();
- }
- }
-
- return super.onTrackballEvent_impl(ev);
- }
-
- @Override
- public boolean dispatchTouchEvent_impl(MotionEvent ev) {
- // TODO: Test touch event handling logic thoroughly and simplify the logic.
- return super.dispatchTouchEvent_impl(ev);
- }
-
- @Override
- public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure_impl(widthMeasureSpec, heightMeasureSpec);
-
- if (mIsMusicMediaType) {
- if (mPrevWidth != mInstance.getMeasuredWidth()
- || mPrevHeight != mInstance.getMeasuredHeight()) {
- int currWidth = mInstance.getMeasuredWidth();
- int currHeight = mInstance.getMeasuredHeight();
- Point screenSize = new Point();
- mManager.getDefaultDisplay().getSize(screenSize);
- int screenWidth = screenSize.x;
- int screenHeight = screenSize.y;
-
- if (currWidth == screenWidth && currHeight == screenHeight) {
- int orientation = retrieveOrientation();
- if (orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
- inflateMusicView(R.layout.full_landscape_music);
- } else {
- inflateMusicView(R.layout.full_portrait_music);
- }
-
- if (mSizeType != SIZE_TYPE_FULL) {
- mSizeType = SIZE_TYPE_FULL;
- // Remove existing mFadeOut callback
- mMediaControlView.removeCallbacks(mFadeOut);
- mMediaControlView.setVisibility(View.VISIBLE);
- }
- } else {
- if (mSizeType != SIZE_TYPE_EMBEDDED) {
- mSizeType = SIZE_TYPE_EMBEDDED;
- inflateMusicView(R.layout.embedded_music);
- // Add new mFadeOut callback
- mMediaControlView.postDelayed(mFadeOut, mShowControllerIntervalMs);
- }
- }
- mPrevWidth = currWidth;
- mPrevHeight = currHeight;
- }
- }
- }
-
- ///////////////////////////////////////////////////
- // Implements VideoViewInterface.SurfaceListener
- ///////////////////////////////////////////////////
-
- @Override
- public void onSurfaceCreated(View view, int width, int height) {
- if (DEBUG) {
- Log.d(TAG, "onSurfaceCreated(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState + ", width/height: " + width + "/" + height
- + ", " + view.toString());
- }
- if (needToStart()) {
- mMediaController.getTransportControls().play();
- }
- }
-
- @Override
- public void onSurfaceDestroyed(View view) {
- if (DEBUG) {
- Log.d(TAG, "onSurfaceDestroyed(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState + ", " + view.toString());
- }
- }
-
- @Override
- public void onSurfaceChanged(View view, int width, int height) {
- // TODO: Do we need to call requestLayout here?
- if (DEBUG) {
- Log.d(TAG, "onSurfaceChanged(). width/height: " + width + "/" + height
- + ", " + view.toString());
- }
- }
-
- @Override
- public void onSurfaceTakeOverDone(VideoViewInterface view) {
- if (DEBUG) {
- Log.d(TAG, "onSurfaceTakeOverDone(). Now current view is: " + view);
- }
- mCurrentView = view;
- if (mViewTypeChangedListener != null) {
- mViewTypeChangedListener.onViewTypeChanged(mInstance, view.getViewType());
- }
- if (needToStart()) {
- mMediaController.getTransportControls().play();
- }
- }
-
- ///////////////////////////////////////////////////
- // Protected or private methods
- ///////////////////////////////////////////////////
-
- private void attachMediaControlView() {
- // Get MediaController from MediaSession and set it inside MediaControlView
- mMediaControlView.setController(mMediaSession.getController());
-
- LayoutParams params =
- new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
- mInstance.addView(mMediaControlView, params);
- }
-
- private boolean isInPlaybackState() {
- return (mMediaPlayer != null || mRoutePlayer != null)
- && mCurrentState != STATE_ERROR
- && mCurrentState != STATE_IDLE
- && mCurrentState != STATE_PREPARING;
- }
-
- private boolean needToStart() {
- return (mMediaPlayer != null || mRoutePlayer != null)
- && mCurrentState != STATE_PLAYING
- && mTargetState == STATE_PLAYING;
- }
-
- // Creates a MediaPlayer2 instance and prepare playback.
- private void openVideo(DataSourceDesc dsd) {
- Uri uri = dsd.getUri();
- Map<String, String> headers = dsd.getUriHeaders();
- resetPlayer();
- if (isRemotePlayback()) {
- mRoutePlayer.openVideo(dsd);
- return;
- }
- if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
- // TODO this should have a focus listener
- AudioFocusRequest focusRequest;
- focusRequest = new AudioFocusRequest.Builder(mAudioFocusType)
- .setAudioAttributes(mAudioAttributes)
- .build();
- mAudioManager.requestAudioFocus(focusRequest);
- }
-
- try {
- final Context context = mInstance.getContext();
-
- Log.d(TAG, "openVideo(): creating new MediaPlayer2 instance.");
- mMediaPlayer = new MediaPlayer2(context);
- mSurfaceView.setMediaPlayer(mMediaPlayer);
- mTextureView.setMediaPlayer(mMediaPlayer);
- mCurrentView.assignSurfaceToMediaPlayer(mMediaPlayer);
-
- // TODO: Add timely firing logic for more accurate sync between CC and video frame
- mSubtitleController = new SubtitleController(context);
- mSubtitleController.registerRenderer(new ClosedCaptionRenderer(context));
- mSubtitleController.setAnchor((SubtitleController.Anchor) mSubtitleView);
- Executor executor = new Executor() {
- @Override
- public void execute(Runnable runnable) {
- runnable.run();
- }
- };
- mMediaPlayer.registerEventCallback(executor, mMediaPlayer2Callback);
-
- mCurrentBufferPercentage = -1;
- mMediaPlayer.setDataSource(dsd);
- mMediaPlayer.setAudioAttributes(mAudioAttributes);
- // we don't set the target state here either, but preserve the
- // target state that was there before.
- mCurrentState = STATE_PREPARING;
- mMediaPlayer.prepare();
-
- // Save file name as title since the file may not have a title Metadata.
- mTitle = uri.getPath();
- String scheme = uri.getScheme();
- if (scheme != null && scheme.equals("file")) {
- mTitle = uri.getLastPathSegment();
- }
- mRetriever = new MediaMetadataRetriever();
- mRetriever.setDataSource(mInstance.getContext(), uri);
-
- if (DEBUG) {
- Log.d(TAG, "openVideo(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState);
- }
- } catch (IllegalArgumentException ex) {
- Log.w(TAG, "Unable to open content: " + uri, ex);
- mCurrentState = STATE_ERROR;
- mTargetState = STATE_ERROR;
- mMediaPlayer2Callback.onError(mMediaPlayer, dsd,
- MediaPlayer2.MEDIA_ERROR_UNKNOWN, MediaPlayer2.MEDIA_ERROR_IO);
- }
- }
-
- /*
- * Reset the media player in any state
- */
- private void resetPlayer() {
- if (mMediaPlayer != null) {
- final MediaPlayer2 player = mMediaPlayer;
- new AsyncTask<MediaPlayer2, Void, Void>() {
- @Override
- protected Void doInBackground(MediaPlayer2... players) {
- // TODO: Fix NPE while MediaPlayer2.close()
- //players[0].close();
- return null;
- }
- }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, player);
- mMediaPlayer = null;
- mTextureView.setMediaPlayer(null);
- mSurfaceView.setMediaPlayer(null);
- //mPendingSubtitleTracks.clear();
- mCurrentState = STATE_IDLE;
- mTargetState = STATE_IDLE;
- if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
- mAudioManager.abandonAudioFocus(null);
- }
- }
- mVideoWidth = 0;
- mVideoHeight = 0;
- }
-
- private void updatePlaybackState() {
- if (mStateBuilder == null) {
- // Add Play action as default
- long playbackActions = PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PAUSE;
- if (mSeekable) {
- playbackActions |= (PlaybackState.ACTION_REWIND |
- PlaybackState.ACTION_FAST_FORWARD | PlaybackState.ACTION_SEEK_TO);
- }
- mStateBuilder = new PlaybackState.Builder();
- mStateBuilder.setActions(playbackActions);
-
- if (mCustomActionList != null) {
- for (PlaybackState.CustomAction action : mCustomActionList) {
- mStateBuilder.addCustomAction(action);
- }
- }
- }
- mStateBuilder.setState(getCorrespondingPlaybackState(),
- mMediaPlayer.getCurrentPosition(), mSpeed);
- if (mCurrentState != STATE_ERROR
- && mCurrentState != STATE_IDLE
- && mCurrentState != STATE_PREPARING) {
- // TODO: this should be replaced with MediaPlayer2.getBufferedPosition() once it is
- // implemented.
- if (mCurrentBufferPercentage == -1) {
- mStateBuilder.setBufferedPosition(-1);
- } else {
- mStateBuilder.setBufferedPosition(
- (long) (mCurrentBufferPercentage / 100.0 * mMediaPlayer.getDuration()));
- }
- }
-
- // Set PlaybackState for MediaSession
- if (mMediaSession != null) {
- PlaybackState state = mStateBuilder.build();
- mMediaSession.setPlaybackState(state);
- }
- }
-
- private int getCorrespondingPlaybackState() {
- switch (mCurrentState) {
- case STATE_ERROR:
- return PlaybackState.STATE_ERROR;
- case STATE_IDLE:
- return PlaybackState.STATE_NONE;
- case STATE_PREPARING:
- return PlaybackState.STATE_CONNECTING;
- case STATE_PREPARED:
- return PlaybackState.STATE_PAUSED;
- case STATE_PLAYING:
- return PlaybackState.STATE_PLAYING;
- case STATE_PAUSED:
- return PlaybackState.STATE_PAUSED;
- case STATE_PLAYBACK_COMPLETED:
- return PlaybackState.STATE_STOPPED;
- default:
- return -1;
- }
- }
-
- private final Runnable mFadeOut = new Runnable() {
- @Override
- public void run() {
- if (mCurrentState == STATE_PLAYING) {
- mMediaControlView.setVisibility(View.GONE);
- }
- }
- };
-
- private void showController() {
- // TODO: Decide what to show when the state is not in playback state
- if (mMediaControlView == null || !isInPlaybackState()
- || (mIsMusicMediaType && mSizeType == SIZE_TYPE_FULL)) {
- return;
- }
- mMediaControlView.removeCallbacks(mFadeOut);
- mMediaControlView.setVisibility(View.VISIBLE);
- if (mShowControllerIntervalMs != 0
- && !mAccessibilityManager.isTouchExplorationEnabled()) {
- mMediaControlView.postDelayed(mFadeOut, mShowControllerIntervalMs);
- }
- }
-
- private void toggleMediaControlViewVisibility() {
- if (mMediaControlView.getVisibility() == View.VISIBLE) {
- mMediaControlView.removeCallbacks(mFadeOut);
- mMediaControlView.setVisibility(View.GONE);
- } else {
- showController();
- }
- }
-
- private void applySpeed() {
- PlaybackParams params = mMediaPlayer.getPlaybackParams().allowDefaults();
- if (mSpeed != params.getSpeed()) {
- try {
- params.setSpeed(mSpeed);
- mMediaPlayer.setPlaybackParams(params);
- mFallbackSpeed = mSpeed;
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "PlaybackParams has unsupported value: " + e);
- // TODO: should revise this part after integrating with MP2.
- // If mSpeed had an illegal value for speed rate, system will determine best
- // handling (see PlaybackParams.AUDIO_FALLBACK_MODE_DEFAULT).
- // Note: The pre-MP2 returns 0.0f when it is paused. In this case, VideoView2 will
- // use mFallbackSpeed instead.
- float fallbackSpeed = mMediaPlayer.getPlaybackParams().allowDefaults().getSpeed();
- if (fallbackSpeed > 0.0f) {
- mFallbackSpeed = fallbackSpeed;
- }
- mSpeed = mFallbackSpeed;
- }
- }
- }
-
- private boolean isRemotePlayback() {
- if (mMediaController == null) {
- return false;
- }
- PlaybackInfo playbackInfo = mMediaController.getPlaybackInfo();
- return playbackInfo != null
- && playbackInfo.getPlaybackType() == PlaybackInfo.PLAYBACK_TYPE_REMOTE;
- }
-
- private void selectOrDeselectSubtitle(boolean select) {
- if (!isInPlaybackState()) {
- return;
- }
- if (select) {
- if (mSubtitleTrackIndices.size() > 0) {
- // TODO: make this selection dynamic
- mSelectedSubtitleTrackIndex = mSubtitleTrackIndices.get(0).first;
- mSubtitleController.selectTrack(mSubtitleTrackIndices.get(0).second);
- mMediaPlayer.selectTrack(mSelectedSubtitleTrackIndex);
- mSubtitleView.setVisibility(View.VISIBLE);
- }
- } else {
- if (mSelectedSubtitleTrackIndex != INVALID_TRACK_INDEX) {
- mMediaPlayer.deselectTrack(mSelectedSubtitleTrackIndex);
- mSelectedSubtitleTrackIndex = INVALID_TRACK_INDEX;
- mSubtitleView.setVisibility(View.GONE);
- }
- }
- }
-
- private void extractTracks() {
- List<MediaPlayer2.TrackInfo> trackInfos = mMediaPlayer.getTrackInfo();
- mVideoTrackIndices = new ArrayList<>();
- mAudioTrackIndices = new ArrayList<>();
- mSubtitleTrackIndices = new ArrayList<>();
- mSubtitleController.reset();
- for (int i = 0; i < trackInfos.size(); ++i) {
- int trackType = trackInfos.get(i).getTrackType();
- if (trackType == MediaPlayer2.TrackInfo.MEDIA_TRACK_TYPE_VIDEO) {
- mVideoTrackIndices.add(i);
- } else if (trackType == MediaPlayer2.TrackInfo.MEDIA_TRACK_TYPE_AUDIO) {
- mAudioTrackIndices.add(i);
- } else if (trackType == MediaPlayer2.TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE
- || trackType == MediaPlayer2.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT) {
- SubtitleTrack track = mSubtitleController.addTrack(trackInfos.get(i).getFormat());
- if (track != null) {
- mSubtitleTrackIndices.add(new Pair<>(i, track));
- }
- }
- }
- // Select first tracks as default
- if (mVideoTrackIndices.size() > 0) {
- mSelectedVideoTrackIndex = 0;
- }
- if (mAudioTrackIndices.size() > 0) {
- mSelectedAudioTrackIndex = 0;
- }
- if (mVideoTrackIndices.size() == 0 && mAudioTrackIndices.size() > 0) {
- mIsMusicMediaType = true;
- }
-
- Bundle data = new Bundle();
- data.putInt(MediaControlView2Impl.KEY_VIDEO_TRACK_COUNT, mVideoTrackIndices.size());
- data.putInt(MediaControlView2Impl.KEY_AUDIO_TRACK_COUNT, mAudioTrackIndices.size());
- data.putInt(MediaControlView2Impl.KEY_SUBTITLE_TRACK_COUNT, mSubtitleTrackIndices.size());
- if (mSubtitleTrackIndices.size() > 0) {
- selectOrDeselectSubtitle(mSubtitleEnabled);
- }
- mMediaSession.sendSessionEvent(MediaControlView2Impl.EVENT_UPDATE_TRACK_STATUS, data);
- }
-
- private void extractMetadata() {
- // Get and set duration and title values as MediaMetadata for MediaControlView2
- MediaMetadata.Builder builder = new MediaMetadata.Builder();
- builder.putString(MediaMetadata.METADATA_KEY_TITLE, mTitle);
- builder.putLong(
- MediaMetadata.METADATA_KEY_DURATION, mMediaPlayer.getDuration());
-
- if (mMediaSession != null) {
- mMediaSession.setMetadata(builder.build());
- }
- }
-
- private void extractAudioMetadata() {
- if (!mIsMusicMediaType) {
- return;
- }
-
- mResources = ApiHelper.getLibResources(mInstance.getContext());
- mManager = (WindowManager) mInstance.getContext().getApplicationContext()
- .getSystemService(Context.WINDOW_SERVICE);
-
- byte[] album = mRetriever.getEmbeddedPicture();
- if (album != null) {
- Bitmap bitmap = BitmapFactory.decodeByteArray(album, 0, album.length);
- mMusicAlbumDrawable = new BitmapDrawable(bitmap);
-
- // TODO: replace with visualizer
- Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {
- public void onGenerated(Palette palette) {
- // TODO: add dominant color for default album image.
- mDominantColor = palette.getDominantColor(0);
- if (mMusicView != null) {
- mMusicView.setBackgroundColor(mDominantColor);
- }
- }
- });
- } else {
- mMusicAlbumDrawable = mResources.getDrawable(R.drawable.ic_default_album_image);
- }
-
- String title = mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
- if (title != null) {
- mMusicTitleText = title;
- } else {
- mMusicTitleText = mResources.getString(R.string.mcv2_music_title_unknown_text);
- }
-
- String artist = mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
- if (artist != null) {
- mMusicArtistText = artist;
- } else {
- mMusicArtistText = mResources.getString(R.string.mcv2_music_artist_unknown_text);
- }
-
- // Send title and artist string to MediaControlView2
- MediaMetadata.Builder builder = new MediaMetadata.Builder();
- builder.putString(MediaMetadata.METADATA_KEY_TITLE, mMusicTitleText);
- builder.putString(MediaMetadata.METADATA_KEY_ARTIST, mMusicArtistText);
- mMediaSession.setMetadata(builder.build());
-
- // Display Embedded mode as default
- mInstance.removeView(mSurfaceView);
- mInstance.removeView(mTextureView);
- inflateMusicView(R.layout.embedded_music);
- }
-
- private int retrieveOrientation() {
- DisplayMetrics dm = Resources.getSystem().getDisplayMetrics();
- int width = dm.widthPixels;
- int height = dm.heightPixels;
-
- return (height > width) ?
- ActivityInfo.SCREEN_ORIENTATION_PORTRAIT :
- ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
- }
-
- private void inflateMusicView(int layoutId) {
- mInstance.removeView(mMusicView);
-
- View v = ApiHelper.inflateLibLayout(mInstance.getContext(), layoutId);
- v.setBackgroundColor(mDominantColor);
-
- ImageView albumView = v.findViewById(R.id.album);
- if (albumView != null) {
- albumView.setImageDrawable(mMusicAlbumDrawable);
- }
-
- TextView titleView = v.findViewById(R.id.title);
- if (titleView != null) {
- titleView.setText(mMusicTitleText);
- }
-
- TextView artistView = v.findViewById(R.id.artist);
- if (artistView != null) {
- artistView.setText(mMusicArtistText);
- }
-
- mMusicView = v;
- mInstance.addView(mMusicView, 0);
- }
-
- EventCallback mMediaPlayer2Callback =
- new EventCallback() {
- @Override
- public void onSubtitleData(MediaPlayer2 mp, DataSourceDesc dsd, SubtitleData data) {
- if (DEBUG) {
- Log.d(TAG, "onSubtitleData(): getTrackIndex: " + data.getTrackIndex()
- + ", getCurrentPosition: " + mp.getCurrentPosition()
- + ", getStartTimeUs(): " + data.getStartTimeUs()
- + ", diff: "
- + (data.getStartTimeUs()/1000 - mp.getCurrentPosition())
- + "ms, getDurationUs(): " + data.getDurationUs()
- );
-
- }
- final int index = data.getTrackIndex();
- if (index != mSelectedSubtitleTrackIndex) {
- Log.d(TAG, "onSubtitleData(): getTrackIndex: " + data.getTrackIndex()
- + ", selected track index: " + mSelectedSubtitleTrackIndex);
- return;
- }
- for (Pair<Integer, SubtitleTrack> p : mSubtitleTrackIndices) {
- if (p.first == index) {
- SubtitleTrack track = p.second;
- track.onData(data);
- }
- }
- }
-
- @Override
- public void onVideoSizeChanged(
- MediaPlayer2 mp, DataSourceDesc dsd, VideoSize size) {
- if (DEBUG) {
- Log.d(TAG, "onVideoSizeChanged(): size: " + size.getWidth() + "/"
- + size.getHeight());
- }
- mVideoWidth = mp.getVideoSize().getWidth();
- mVideoHeight = mp.getVideoSize().getHeight();
- if (DEBUG) {
- Log.d(TAG, "onVideoSizeChanged(): mVideoSize:" + mVideoWidth + "/"
- + mVideoHeight);
- }
- if (mVideoWidth != 0 && mVideoHeight != 0) {
- mInstance.requestLayout();
- }
- }
-
- // TODO: Remove timed text related code later once relevant Renderer is defined.
- // This is just for debugging purpose.
- @Override
- public void onTimedText(
- MediaPlayer2 mp, DataSourceDesc dsd, TimedText text) {
- Log.d(TAG, "TimedText: " + text.getText());
- }
-
- @Override
- public void onInfo(
- MediaPlayer2 mp, DataSourceDesc dsd, int what, int extra) {
- if (what == MediaPlayer2.MEDIA_INFO_METADATA_UPDATE) {
- extractTracks();
- } else if (what == MediaPlayer2.MEDIA_INFO_PREPARED) {
- this.onPrepared(mp, dsd);
- } else if (what == MediaPlayer2.MEDIA_INFO_DATA_SOURCE_END) {
- this.onCompletion(mp, dsd);
- } else if (what == MediaPlayer2.MEDIA_INFO_BUFFERING_UPDATE) {
- this.onBufferingUpdate(mp, dsd, extra);
- } else if (what == MediaPlayer2.MEDIA_INFO_NOT_SEEKABLE) {
- mSeekable = false;
- }
- }
-
- @Override
- public void onError(
- MediaPlayer2 mp, DataSourceDesc dsd, int frameworkErr, int implErr) {
- if (DEBUG) {
- Log.d(TAG, "Error: " + frameworkErr + "," + implErr);
- }
- mCurrentState = STATE_ERROR;
- mTargetState = STATE_ERROR;
- mSeekable = true;
- updatePlaybackState();
-
- if (mMediaControlView != null) {
- mMediaControlView.setVisibility(View.GONE);
- }
- }
-
- @Override
- public void onCallCompleted(MediaPlayer2 mp, DataSourceDesc dsd, int what,
- int status) {
- if (what == MediaPlayer2.CALL_COMPLETED_SEEK_TO && status == 0) {
- updatePlaybackState();
- }
- }
-
- private void onPrepared(MediaPlayer2 mp, DataSourceDesc dsd) {
- if (DEBUG) {
- Log.d(TAG, "OnPreparedListener(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState);
- }
- mCurrentState = STATE_PREPARED;
- // Create and set playback state for MediaControlView2
- updatePlaybackState();
-
- // TODO: change this to send TrackInfos to MediaControlView2
- // TODO: create MediaSession when initializing VideoView2
- if (mMediaSession != null) {
- extractTracks();
- extractMetadata();
- extractAudioMetadata();
- }
-
- if (mMediaControlView != null) {
- mMediaControlView.setEnabled(true);
- }
- int videoWidth = mp.getVideoSize().getWidth();
- int videoHeight = mp.getVideoSize().getHeight();
-
- // mSeekWhenPrepared may be changed after seekTo() call
- long seekToPosition = mSeekWhenPrepared;
- if (seekToPosition != 0) {
- mMediaController.getTransportControls().seekTo(seekToPosition);
- }
-
- if (videoWidth != 0 && videoHeight != 0) {
- if (videoWidth != mVideoWidth || videoHeight != mVideoHeight) {
- if (DEBUG) {
- Log.i(TAG, "OnPreparedListener() : ");
- Log.i(TAG, " video size: " + videoWidth + "/" + videoHeight);
- Log.i(TAG, " measuredSize: " + mInstance.getMeasuredWidth() + "/"
- + mInstance.getMeasuredHeight());
- Log.i(TAG, " viewSize: " + mInstance.getWidth() + "/"
- + mInstance.getHeight());
- }
- mVideoWidth = videoWidth;
- mVideoHeight = videoHeight;
- mInstance.requestLayout();
- }
-
- if (needToStart()) {
- mMediaController.getTransportControls().play();
- }
- } else {
- // We don't know the video size yet, but should start anyway.
- // The video size might be reported to us later.
- if (needToStart()) {
- mMediaController.getTransportControls().play();
- }
- }
- }
-
- private void onCompletion(MediaPlayer2 mp, DataSourceDesc dsd) {
- mCurrentState = STATE_PLAYBACK_COMPLETED;
- mTargetState = STATE_PLAYBACK_COMPLETED;
- mSeekable = true;
- updatePlaybackState();
- if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
- mAudioManager.abandonAudioFocus(null);
- }
- }
-
- private void onBufferingUpdate(MediaPlayer2 mp, DataSourceDesc dsd, int percent) {
- mCurrentBufferPercentage = percent;
- updatePlaybackState();
- }
- };
-
- private class MediaSessionCallback extends MediaSession.Callback {
- @Override
- public void onCommand(String command, Bundle args, ResultReceiver receiver) {
- if (isRemotePlayback()) {
- mRoutePlayer.onCommand(command, args, receiver);
- } else {
- switch (command) {
- case MediaControlView2Impl.COMMAND_SHOW_SUBTITLE:
- int subtitleIndex = args.getInt(
- MediaControlView2Impl.KEY_SELECTED_SUBTITLE_INDEX,
- INVALID_TRACK_INDEX);
- if (subtitleIndex != INVALID_TRACK_INDEX) {
- int subtitleTrackIndex = mSubtitleTrackIndices.get(subtitleIndex).first;
- if (subtitleTrackIndex != mSelectedSubtitleTrackIndex) {
- mSelectedSubtitleTrackIndex = subtitleTrackIndex;
- mInstance.setSubtitleEnabled(true);
- }
- }
- break;
- case MediaControlView2Impl.COMMAND_HIDE_SUBTITLE:
- mInstance.setSubtitleEnabled(false);
- break;
- case MediaControlView2Impl.COMMAND_SET_FULLSCREEN:
- if (mFullScreenRequestListener != null) {
- mFullScreenRequestListener.onFullScreenRequest(
- mInstance,
- args.getBoolean(MediaControlView2Impl.ARGUMENT_KEY_FULLSCREEN));
- }
- break;
- case MediaControlView2Impl.COMMAND_SELECT_AUDIO_TRACK:
- int audioIndex = args.getInt(MediaControlView2Impl.KEY_SELECTED_AUDIO_INDEX,
- INVALID_TRACK_INDEX);
- if (audioIndex != INVALID_TRACK_INDEX) {
- int audioTrackIndex = mAudioTrackIndices.get(audioIndex);
- if (audioTrackIndex != mSelectedAudioTrackIndex) {
- mSelectedAudioTrackIndex = audioTrackIndex;
- mMediaPlayer.selectTrack(mSelectedAudioTrackIndex);
- }
- }
- break;
- case MediaControlView2Impl.COMMAND_SET_PLAYBACK_SPEED:
- float speed = args.getFloat(
- MediaControlView2Impl.KEY_PLAYBACK_SPEED, INVALID_SPEED);
- if (speed != INVALID_SPEED && speed != mSpeed) {
- mInstance.setSpeed(speed);
- mSpeed = speed;
- }
- break;
- case MediaControlView2Impl.COMMAND_MUTE:
- mVolumeLevel = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
- mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
- break;
- case MediaControlView2Impl.COMMAND_UNMUTE:
- mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mVolumeLevel, 0);
- break;
- }
- }
- showController();
- }
-
- @Override
- public void onCustomAction(String action, Bundle extras) {
- mCustomActionListenerRecord.first.execute(() ->
- mCustomActionListenerRecord.second.onCustomAction(action, extras));
- showController();
- }
-
- @Override
- public void onPlay() {
- if (isInPlaybackState() && (mCurrentView.hasAvailableSurface() || mIsMusicMediaType)) {
- if (isRemotePlayback()) {
- mRoutePlayer.onPlay();
- } else {
- applySpeed();
- mMediaPlayer.play();
- mCurrentState = STATE_PLAYING;
- updatePlaybackState();
- }
- mCurrentState = STATE_PLAYING;
- }
- mTargetState = STATE_PLAYING;
- if (DEBUG) {
- Log.d(TAG, "onPlay(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState);
- }
- showController();
- }
-
- @Override
- public void onPause() {
- if (isInPlaybackState()) {
- if (isRemotePlayback()) {
- mRoutePlayer.onPause();
- mCurrentState = STATE_PAUSED;
- } else if (mMediaPlayer.getState() == MediaPlayer2.PLAYER_STATE_PLAYING) {
- mMediaPlayer.pause();
- mCurrentState = STATE_PAUSED;
- updatePlaybackState();
- }
- }
- mTargetState = STATE_PAUSED;
- if (DEBUG) {
- Log.d(TAG, "onPause(). mCurrentState=" + mCurrentState
- + ", mTargetState=" + mTargetState);
- }
- showController();
- }
-
- @Override
- public void onSeekTo(long pos) {
- if (isInPlaybackState()) {
- if (isRemotePlayback()) {
- mRoutePlayer.onSeekTo(pos);
- } else {
- mMediaPlayer.seekTo(pos, MediaPlayer2.SEEK_PREVIOUS_SYNC);
- mSeekWhenPrepared = 0;
- }
- } else {
- mSeekWhenPrepared = pos;
- }
- showController();
- }
-
- @Override
- public void onStop() {
- if (isRemotePlayback()) {
- mRoutePlayer.onStop();
- } else {
- resetPlayer();
- }
- showController();
- }
- }
-}
diff --git a/packages/MediaComponents/src/com/android/widget/ViewGroupImpl.java b/packages/MediaComponents/src/com/android/widget/ViewGroupImpl.java
deleted file mode 100644
index 5a06826..0000000
--- a/packages/MediaComponents/src/com/android/widget/ViewGroupImpl.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.widget;
-
-import android.media.update.ViewGroupProvider;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-
-public abstract class ViewGroupImpl implements ViewGroupProvider {
- private final ViewGroupProvider mSuperProvider;
-
- public ViewGroupImpl(ViewGroup instance,
- ViewGroupProvider superProvider, ViewGroupProvider privateProvider) {
- mSuperProvider = superProvider;
- }
-
- @Override
- public void onAttachedToWindow_impl() {
- mSuperProvider.onAttachedToWindow_impl();
- }
-
- @Override
- public void onDetachedFromWindow_impl() {
- mSuperProvider.onDetachedFromWindow_impl();
- }
-
- @Override
- public CharSequence getAccessibilityClassName_impl() {
- return mSuperProvider.getAccessibilityClassName_impl();
- }
-
- @Override
- public boolean onTouchEvent_impl(MotionEvent ev) {
- return mSuperProvider.onTouchEvent_impl(ev);
- }
-
- @Override
- public boolean onTrackballEvent_impl(MotionEvent ev) {
- return mSuperProvider.onTrackballEvent_impl(ev);
- }
-
- @Override
- public void onFinishInflate_impl() {
- mSuperProvider.onFinishInflate_impl();
- }
-
- @Override
- public void setEnabled_impl(boolean enabled) {
- mSuperProvider.setEnabled_impl(enabled);
- }
-
- @Override
- public void onVisibilityAggregated_impl(boolean isVisible) {
- mSuperProvider.onVisibilityAggregated_impl(isVisible);
- }
-
- @Override
- public void onLayout_impl(boolean changed, int left, int top, int right, int bottom) {
- mSuperProvider.onLayout_impl(changed, left, top, right, bottom);
- }
-
- @Override
- public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) {
- mSuperProvider.onMeasure_impl(widthMeasureSpec, heightMeasureSpec);
- }
-
- @Override
- public int getSuggestedMinimumWidth_impl() {
- return mSuperProvider.getSuggestedMinimumWidth_impl();
- }
-
- @Override
- public int getSuggestedMinimumHeight_impl() {
- return mSuperProvider.getSuggestedMinimumHeight_impl();
- }
-
- @Override
- public void setMeasuredDimension_impl(int measuredWidth, int measuredHeight) {
- mSuperProvider.setMeasuredDimension_impl(measuredWidth, measuredHeight);
- }
-
- @Override
- public boolean dispatchTouchEvent_impl(MotionEvent ev) {
- return mSuperProvider.dispatchTouchEvent_impl(ev);
- }
-
- @Override
- public boolean checkLayoutParams_impl(ViewGroup.LayoutParams p) {
- return mSuperProvider.checkLayoutParams_impl(p);
- }
-
- @Override
- public ViewGroup.LayoutParams generateDefaultLayoutParams_impl() {
- return mSuperProvider.generateDefaultLayoutParams_impl();
- }
-
- @Override
- public ViewGroup.LayoutParams generateLayoutParams_impl(AttributeSet attrs) {
- return mSuperProvider.generateLayoutParams_impl(attrs);
- }
-
- @Override
- public ViewGroup.LayoutParams generateLayoutParams_impl(ViewGroup.LayoutParams lp) {
- return mSuperProvider.generateLayoutParams_impl(lp);
- }
-
- @Override
- public boolean shouldDelayChildPressedState_impl() {
- return mSuperProvider.shouldDelayChildPressedState_impl();
- }
-
- @Override
- public void measureChildWithMargins_impl(View child,
- int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) {
- mSuperProvider.measureChildWithMargins_impl(child,
- parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed);
- }
-}
diff --git a/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp b/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp
index 2b5debf..84c2ec7 100644
--- a/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp
+++ b/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp
@@ -257,6 +257,10 @@
// Add new entry into mOutputs
mOutputs[surfaceId] = gbp;
mConsumerBufferCount[surfaceId] = maxConsumerBuffers;
+ if (mConsumerBufferCount[surfaceId] > mMaxHalBuffers) {
+ SP_LOGW("%s: Consumer buffer count %zu larger than max. Hal buffers: %zu", __FUNCTION__,
+ mConsumerBufferCount[surfaceId], mMaxHalBuffers);
+ }
mNotifiers[gbp] = listener;
mOutputSlots[gbp] = std::make_unique<OutputSlots>(totalBufferCount);
@@ -328,11 +332,7 @@
}
mNotifiers[gbp] = nullptr;
- if (mConsumerBufferCount[surfaceId] < mMaxHalBuffers) {
- mMaxConsumerBuffers -= mConsumerBufferCount[surfaceId];
- } else {
- SP_LOGE("%s: Cached consumer buffer count mismatch!", __FUNCTION__);
- }
+ mMaxConsumerBuffers -= mConsumerBufferCount[surfaceId];
mConsumerBufferCount[surfaceId] = 0;
return res;