Merge "Fix broken java doc. DO NOT MERGE" into lmp-dev
diff --git a/v17/leanback/res/drawable-v21/lb_control_button_primary.xml b/v17/leanback/res/drawable-v21/lb_control_button_primary.xml
new file mode 100644
index 0000000..eb081a1
--- /dev/null
+++ b/v17/leanback/res/drawable-v21/lb_control_button_primary.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 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.
+-->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="?android:attr/colorControlHighlight" >
+
+ <item android:id="@android:id/mask">
+ <selector android:constantSize="true" >
+ <item android:state_focused="true">
+ <shape android:shape="oval" >
+
+ <!-- Color not used since this is a ripple mask -->
+ <solid android:color="@color/lb_control_button_color" />
+
+ <size
+ android:height="@dimen/lb_control_button_diameter"
+ android:width="@dimen/lb_control_button_diameter" />
+ </shape>
+ </item>
+ </selector>
+ </item>
+
+</ripple>
\ No newline at end of file
diff --git a/v17/leanback/res/drawable-v21/lb_control_button_secondary.xml b/v17/leanback/res/drawable-v21/lb_control_button_secondary.xml
new file mode 100644
index 0000000..6c67206
--- /dev/null
+++ b/v17/leanback/res/drawable-v21/lb_control_button_secondary.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 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.
+-->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="?android:attr/colorControlHighlight" >
+
+ <item android:id="@android:id/mask">
+ <selector android:constantSize="true" >
+ <item android:state_focused="true">
+ <shape android:shape="oval" >
+
+ <!-- Color not used since this is a ripple mask -->
+ <solid android:color="@color/lb_control_button_color" />
+
+ <size
+ android:height="@dimen/lb_control_button_secondary_diameter"
+ android:width="@dimen/lb_control_button_secondary_diameter" />
+ </shape>
+ </item>
+ </selector>
+ </item>
+
+</ripple>
\ No newline at end of file
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_cc.png b/v17/leanback/res/drawable-xhdpi/lb_ic_cc.png
new file mode 100644
index 0000000..518c063
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_cc.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_fast_forward.png b/v17/leanback/res/drawable-xhdpi/lb_ic_fast_forward.png
new file mode 100644
index 0000000..c5afb69
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_fast_forward.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_fast_rewind.png b/v17/leanback/res/drawable-xhdpi/lb_ic_fast_rewind.png
new file mode 100644
index 0000000..d9774ef
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_fast_rewind.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_hq.png b/v17/leanback/res/drawable-xhdpi/lb_ic_hq.png
new file mode 100644
index 0000000..f797d38
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_hq.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_loop.png b/v17/leanback/res/drawable-xhdpi/lb_ic_loop.png
new file mode 100644
index 0000000..1676892
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_loop.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_more.png b/v17/leanback/res/drawable-xhdpi/lb_ic_more.png
new file mode 100644
index 0000000..ef62a69
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_more.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_pause.png b/v17/leanback/res/drawable-xhdpi/lb_ic_pause.png
new file mode 100644
index 0000000..01e07f7
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_pause.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_play.png b/v17/leanback/res/drawable-xhdpi/lb_ic_play.png
new file mode 100644
index 0000000..1556076
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_play.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_playback_loop.png b/v17/leanback/res/drawable-xhdpi/lb_ic_playback_loop.png
new file mode 100644
index 0000000..f444ca4
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_playback_loop.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_replay.png b/v17/leanback/res/drawable-xhdpi/lb_ic_replay.png
new file mode 100644
index 0000000..a76d8fe
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_replay.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_shuffle.png b/v17/leanback/res/drawable-xhdpi/lb_ic_shuffle.png
new file mode 100644
index 0000000..32cf2dc
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_shuffle.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_skip_next.png b/v17/leanback/res/drawable-xhdpi/lb_ic_skip_next.png
new file mode 100644
index 0000000..2173375
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_skip_next.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_skip_previous.png b/v17/leanback/res/drawable-xhdpi/lb_ic_skip_previous.png
new file mode 100644
index 0000000..2c6035a
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_skip_previous.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_stop.png b/v17/leanback/res/drawable-xhdpi/lb_ic_stop.png
new file mode 100644
index 0000000..b96f297
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_stop.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down.png b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down.png
new file mode 100644
index 0000000..85dd902
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down_outline.png b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down_outline.png
new file mode 100644
index 0000000..2208fdf
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_down_outline.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up.png b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up.png
new file mode 100644
index 0000000..b24b146
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up.png
Binary files differ
diff --git a/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up_outline.png b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up_outline.png
new file mode 100644
index 0000000..d6a5240
--- /dev/null
+++ b/v17/leanback/res/drawable-xhdpi/lb_ic_thumb_up_outline.png
Binary files differ
diff --git a/v17/leanback/res/drawable/lb_control_button_primary.xml b/v17/leanback/res/drawable/lb_control_button_primary.xml
new file mode 100644
index 0000000..4528f95
--- /dev/null
+++ b/v17/leanback/res/drawable/lb_control_button_primary.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 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" android:constantSize="true" >
+ <item android:state_focused="true">
+ <shape android:shape="oval">
+ <solid android:color="@color/lb_control_button_color" />
+ <size
+ android:height="@dimen/lb_control_button_diameter"
+ android:width="@dimen/lb_control_button_diameter" />
+ </shape>
+ </item>
+</selector>
diff --git a/v17/leanback/res/drawable/lb_control_button_secondary.xml b/v17/leanback/res/drawable/lb_control_button_secondary.xml
new file mode 100644
index 0000000..9e52645
--- /dev/null
+++ b/v17/leanback/res/drawable/lb_control_button_secondary.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 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" android:constantSize="true" >
+ <item android:state_focused="true">
+ <shape android:shape="oval">
+ <solid android:color="@color/lb_control_button_color" />
+ <size
+ android:height="@dimen/lb_control_button_secondary_diameter"
+ android:width="@dimen/lb_control_button_secondary_diameter" />
+ </shape>
+ </item>
+</selector>
diff --git a/v17/leanback/res/drawable/lb_playback_progress_bar.xml b/v17/leanback/res/drawable/lb_playback_progress_bar.xml
new file mode 100644
index 0000000..8cbb03c
--- /dev/null
+++ b/v17/leanback/res/drawable/lb_playback_progress_bar.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 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>
+ <solid android:color="#16FFFFFF" />
+
+ <corners
+ android:bottomLeftRadius="0dp"
+ android:bottomRightRadius="0dp"
+ android:topLeftRadius="2dp"
+ android:topRightRadius="2dp" />
+ </shape>
+ </item>
+ <item android:id="@android:id/secondaryProgress">
+ <clip>
+ <shape>
+ <solid android:color="#1DFFFFFF" />
+
+ <corners
+ android:bottomLeftRadius="0dp"
+ android:bottomRightRadius="0dp"
+ android:topLeftRadius="2dp"
+ android:topRightRadius="2dp" />
+ </shape>
+ </clip>
+ </item>
+ <item android:id="@android:id/progress">
+ <clip>
+ <shape>
+ <solid android:color="#00ff00" />
+
+ <corners
+ android:bottomLeftRadius="0dp"
+ android:bottomRightRadius="0dp"
+ android:topLeftRadius="2dp"
+ android:topRightRadius="2dp" />
+ </shape>
+ </clip>
+ </item>
+
+</layer-list>
diff --git a/v17/leanback/res/layout/lb_control_bar.xml b/v17/leanback/res/layout/lb_control_bar.xml
new file mode 100644
index 0000000..4b82dcc
--- /dev/null
+++ b/v17/leanback/res/layout/lb_control_bar.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 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:id="@+id/control_bar"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" />
diff --git a/v17/leanback/res/layout/lb_control_button_primary.xml b/v17/leanback/res/layout/lb_control_button_primary.xml
new file mode 100644
index 0000000..86e3e0d
--- /dev/null
+++ b/v17/leanback/res/layout/lb_control_button_primary.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" >
+
+ <ImageView
+ android:id="@+id/button"
+ style="?attr/playbackControlsButtonStyle"
+ android:layout_width="@dimen/lb_control_button_diameter"
+ android:layout_height="@dimen/lb_control_button_height"
+ android:scaleType="center"
+ android:src="@drawable/lb_control_button_primary" />
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="@dimen/lb_control_icon_width"
+ android:layout_height="@dimen/lb_control_icon_height"
+ android:layout_gravity="center" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/v17/leanback/res/layout/lb_control_button_secondary.xml b/v17/leanback/res/layout/lb_control_button_secondary.xml
new file mode 100644
index 0000000..4d0cafd
--- /dev/null
+++ b/v17/leanback/res/layout/lb_control_button_secondary.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" >
+
+ <ImageView
+ android:id="@+id/button"
+ style="?attr/playbackControlsButtonStyle"
+ android:layout_width="@dimen/lb_control_button_secondary_diameter"
+ android:layout_height="@dimen/lb_control_button_secondary_height"
+ android:scaleType="center"
+ android:src="@drawable/lb_control_button_secondary" />
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="@dimen/lb_control_icon_width"
+ android:layout_height="@dimen/lb_control_icon_height"
+ android:layout_gravity="center" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/v17/leanback/res/layout/lb_playback_controls.xml b/v17/leanback/res/layout/lb_playback_controls.xml
new file mode 100644
index 0000000..bdc049c
--- /dev/null
+++ b/v17/leanback/res/layout/lb_playback_controls.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 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="wrap_content"
+ android:orientation="vertical" >
+
+ <ProgressBar
+ android:id="@+id/playback_progress"
+ style="?android:attr/progressBarStyleHorizontal"
+ android:layout_width="match_parent"
+ android:layout_height="4dp"
+ android:maxHeight="4dp"
+ android:minHeight="4dp"
+ android:progressDrawable="@drawable/lb_playback_progress_bar" />
+
+ <FrameLayout
+ android:id="@+id/controls_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" >
+
+ <LinearLayout
+ android:id="@+id/control_bar"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:orientation="horizontal" />
+
+ <FrameLayout
+ android:id="@+id/more_actions_dock"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="right" />
+
+ <TextView
+ android:id="@+id/current_time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top|left"
+ android:layout_marginLeft="16dp"
+ android:fontFamily="sans-serif"
+ android:paddingTop="12dp"
+ android:textColor="#b2eeeeee"
+ android:textSize="12sp" />
+
+ <TextView
+ android:id="@+id/total_time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top|right"
+ android:layout_marginRight="16dp"
+ android:fontFamily="sans-serif"
+ android:paddingTop="12dp"
+ android:textColor="#b2eeeeee"
+ android:textSize="12sp" />
+ </FrameLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/v17/leanback/res/layout/lb_playback_controls_row.xml b/v17/leanback/res/layout/lb_playback_controls_row.xml
new file mode 100644
index 0000000..a4484a2
--- /dev/null
+++ b/v17/leanback/res/layout/lb_playback_controls_row.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 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="wrap_content"
+ android:orientation="vertical"
+ android:paddingBottom="@dimen/lb_playback_controls_margin_bottom"
+ android:paddingLeft="@dimen/lb_playback_controls_margin_left"
+ android:paddingRight="@dimen/lb_playback_controls_margin_right" >
+
+ <!-- Background is applied to this inner layout -->
+
+ <LinearLayout
+ android:id="@+id/controls_card"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/lb_playback_controls_card_height"
+ android:orientation="horizontal" >
+
+ <ImageView
+ android:id="@+id/image"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:adjustViewBounds="true"
+ android:scaleType="fitStart" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" >
+
+ <FrameLayout
+ android:id="@+id/description_dock"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_marginEnd="@dimen/lb_playback_description_margin_end"
+ android:layout_marginStart="@dimen/lb_playback_description_margin_start"
+ android:layout_marginTop="@dimen/lb_playback_description_margin_top"
+ android:layout_weight="1"
+ android:gravity="top" />
+
+ <!-- Space here prevents room only for title and subtitle above -->
+
+ <Space
+ android:id="@+id/spacer"
+ android:layout_width="match_parent"
+ android:layout_height="12dp" />
+
+ <FrameLayout
+ android:id="@+id/controls_dock"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/lb_playback_description_margin_end"
+ android:layout_marginStart="@dimen/lb_playback_description_margin_start" />
+
+ </LinearLayout>
+ </LinearLayout>
+
+ <FrameLayout
+ android:id="@+id/secondary_controls_dock"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="@dimen/lb_secondary_controls_margin_top" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/v17/leanback/res/values/attrs.xml b/v17/leanback/res/values/attrs.xml
index ecacc55..0713edb 100644
--- a/v17/leanback/res/values/attrs.xml
+++ b/v17/leanback/res/values/attrs.xml
@@ -180,6 +180,9 @@
<attr name="detailsDescriptionBodyStyle" format="reference" />
<attr name="detailsActionButtonStyle" format="reference" />
+ <!-- for playback controls -->
+ <attr name="playbackControlsButtonStyle" format="reference" />
+
<!-- style for a vertical grid of items -->
<attr name="itemsVerticalGridStyle" format="reference" />
diff --git a/v17/leanback/res/values/colors.xml b/v17/leanback/res/values/colors.xml
index 5fc7e0a..912f87e 100644
--- a/v17/leanback/res/values/colors.xml
+++ b/v17/leanback/res/values/colors.xml
@@ -52,4 +52,7 @@
<color name="lb_default_brand_color">#FF455A64</color>
<color name="lb_default_search_color">#FFFFAA3F</color>
+
+ <color name="lb_control_button_color">#66EEEEEE</color>
+
</resources>
diff --git a/v17/leanback/res/values/dimens.xml b/v17/leanback/res/values/dimens.xml
index 30bc8e8..ce8fc74 100644
--- a/v17/leanback/res/values/dimens.xml
+++ b/v17/leanback/res/values/dimens.xml
@@ -104,6 +104,23 @@
<dimen name="lb_action_icon_margin">12dp</dimen>
<dimen name="lb_action_text_size">16sp</dimen>
+ <dimen name="lb_playback_controls_align_bottom">48dp</dimen>
+ <dimen name="lb_playback_controls_card_height">176dp</dimen>
+ <dimen name="lb_playback_controls_margin_left">132dp</dimen>
+ <dimen name="lb_playback_controls_margin_right">132dp</dimen>
+ <dimen name="lb_playback_controls_margin_bottom">20dp</dimen>
+ <dimen name="lb_playback_description_margin_top">24dp</dimen>
+ <dimen name="lb_playback_description_margin_start">24dp</dimen>
+ <dimen name="lb_playback_description_margin_end">24dp</dimen>
+ <dimen name="lb_secondary_controls_margin_top">12dp</dimen>
+
+ <dimen name="lb_control_button_diameter">76dp</dimen>
+ <dimen name="lb_control_button_height">64dp</dimen>
+ <dimen name="lb_control_button_secondary_diameter">48dp</dimen>
+ <dimen name="lb_control_button_secondary_height">48dp</dimen>
+ <dimen name="lb_control_icon_width">32dp</dimen>
+ <dimen name="lb_control_icon_height">32dp</dimen>
+
<dimen name="lb_error_image_max_height">120dp</dimen>
<integer name="lb_error_message_max_lines">1</integer>
<dimen name="lb_error_message_max_width">600dp</dimen>
diff --git a/v17/leanback/res/values/ids.xml b/v17/leanback/res/values/ids.xml
index 05a6304..6bcff36 100644
--- a/v17/leanback/res/values/ids.xml
+++ b/v17/leanback/res/values/ids.xml
@@ -17,4 +17,16 @@
<resources>
<item type="id" name="lb_focus_animator" />
<item type="id" name="lb_header_transition_position" />
- </resources>
\ No newline at end of file
+
+ <item type="id" name="lb_control_play_pause" />
+ <item type="id" name="lb_control_fast_forward" />
+ <item type="id" name="lb_control_fast_rewind" />
+ <item type="id" name="lb_control_skip_next" />
+ <item type="id" name="lb_control_skip_previous" />
+ <item type="id" name="lb_control_more_actions" />
+ <item type="id" name="lb_control_thumbs_up" />
+ <item type="id" name="lb_control_thumbs_down" />
+ <item type="id" name="lb_control_repeat" />
+ <item type="id" name="lb_control_shuffle" />
+
+ </resources>
diff --git a/v17/leanback/res/values/styles.xml b/v17/leanback/res/values/styles.xml
index 1d43795..245d424 100644
--- a/v17/leanback/res/values/styles.xml
+++ b/v17/leanback/res/values/styles.xml
@@ -212,7 +212,7 @@
<item name="android:ellipsize">end</item>
</style>
- <style name="Widget.Leanback.DetailsActionButtonStyle" parent="android:Widget.Holo.Button.Borderless">
+ <style name="Widget.Leanback.DetailsActionButtonStyle" parent="android:Widget.Material.Button.Borderless">
<item name="android:textAppearance">@style/TextAppearance.Leanback.DetailsActionButton</item>
<item name="android:includeFontPadding">false</item>
<item name="android:drawablePadding">@dimen/lb_action_icon_margin</item>
@@ -222,6 +222,11 @@
<item name="android:paddingRight">@dimen/lb_action_padding_horizontal</item>
</style>
+ <style name="Widget.Leanback.PlaybackControlsButtonStyle" >
+ <item name="android:focusable">true</item>
+ <item name="android:focusableInTouchMode">true</item>
+ </style>
+
<style name="Widget.Leanback.ErrorMessageStyle">
<item name="android:textAppearance">@style/TextAppearance.Leanback.ErrorMessage</item>
<item name="android:includeFontPadding">false</item>
diff --git a/v17/leanback/res/values/themes.xml b/v17/leanback/res/values/themes.xml
index fee4967..b13e720 100644
--- a/v17/leanback/res/values/themes.xml
+++ b/v17/leanback/res/values/themes.xml
@@ -57,6 +57,7 @@
<item name="detailsDescriptionSubtitleStyle">@style/Widget.Leanback.DetailsDescriptionSubtitleStyle</item>
<item name="detailsDescriptionBodyStyle">@style/Widget.Leanback.DetailsDescriptionBodyStyle</item>
<item name="detailsActionButtonStyle">@style/Widget.Leanback.DetailsActionButtonStyle</item>
+ <item name="playbackControlsButtonStyle">@style/Widget.Leanback.PlaybackControlsButtonStyle</item>
<item name="errorMessageStyle">@style/Widget.Leanback.ErrorMessageStyle</item>
diff --git a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
index c06cf1c..1b04c8f 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
@@ -154,7 +154,7 @@
}
};
- private void setVerticalGridViewLayout(VerticalGridView listview) {
+ void setVerticalGridViewLayout(VerticalGridView listview) {
// align the top edge of item to a fixed position
listview.setItemAlignmentOffset(0);
listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
@@ -163,13 +163,16 @@
listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
}
+ VerticalGridView getVerticalGridView() {
+ return mRowsFragment == null ? null : mRowsFragment.getVerticalGridView();
+ }
+
/**
* Setup dimensions that are only meaningful when the child Fragments are inside
* DetailsFragment.
*/
private void setupChildFragmentLayout() {
- VerticalGridView containerList = mRowsFragment.getVerticalGridView();
- setVerticalGridViewLayout(containerList);
+ setVerticalGridViewLayout(mRowsFragment.getVerticalGridView());
}
@Override
diff --git a/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlayFragment.java b/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlayFragment.java
new file mode 100644
index 0000000..988e47e
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlayFragment.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.app;
+
+import android.os.Bundle;
+import android.support.v17.leanback.R;
+import android.support.v17.leanback.widget.ObjectAdapter;
+import android.support.v17.leanback.widget.VerticalGridView;
+
+
+/**
+ * A fragment for displaying playback controls and related content.
+ */
+public class PlaybackOverlayFragment extends DetailsFragment {
+
+ private int mAlignPosition;
+
+ /**
+ * Sets the list of rows for the fragment.
+ */
+ @Override
+ public void setAdapter(ObjectAdapter adapter) {
+ super.setAdapter(adapter);
+ setVerticalGridViewLayout(getVerticalGridView());
+ }
+
+ @Override
+ void setVerticalGridViewLayout(VerticalGridView listview) {
+ if (listview == null || getAdapter() == null) {
+ return;
+ }
+ final int alignPosition = getAdapter().size() > 1 ? mAlignPosition : 0;
+ listview.setItemAlignmentOffset(alignPosition);
+ listview.setItemAlignmentOffsetPercent(100);
+ listview.setWindowAlignmentOffset(0);
+ listview.setWindowAlignmentOffsetPercent(100);
+ listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_HIGH_EDGE);
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mAlignPosition =
+ getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_align_bottom);
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ControlBarPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/ControlBarPresenter.java
new file mode 100644
index 0000000..5bdcf25
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ControlBarPresenter.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.widget;
+
+import android.support.v17.leanback.R;
+import android.util.SparseArray;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+/**
+ * A presenter that assumes a LinearLayout container for a series
+ * of control buttons backed by objects of type {@link Action}.
+ *
+ * Different layouts may be passed to the presenter constructor.
+ * The layout must contain a view with id control_bar.
+ */
+class ControlBarPresenter extends Presenter {
+
+ private static final int MAX_CONTROLS = 7;
+
+ /**
+ * The data type expected by this presenter.
+ */
+ static class BoundData {
+ /**
+ * Adapter containing objects of type {@link Action}.
+ */
+ ObjectAdapter adapter;
+
+ /**
+ * The presenter to be used for the adapter objects.
+ */
+ Presenter presenter;
+ }
+
+ /**
+ * A ViewHolder for an actions bar.
+ */
+ class ViewHolder extends Presenter.ViewHolder {
+ ObjectAdapter mAdapter;
+ Presenter mPresenter;
+ LinearLayout mControlBar;
+ SparseArray<Presenter.ViewHolder> mViewHolders =
+ new SparseArray<Presenter.ViewHolder>();
+ ObjectAdapter.DataObserver mDataObserver;
+
+ /**
+ * Constructor for the ViewHolder.
+ */
+ ViewHolder(View rootView) {
+ super(rootView);
+ mControlBar = (LinearLayout) rootView.findViewById(R.id.control_bar);
+ if (mControlBar == null) {
+ throw new IllegalStateException("Couldn't find control_bar");
+ }
+ mDataObserver = new ObjectAdapter.DataObserver() {
+ @Override
+ public void onChanged() {
+ showControls(mAdapter, mPresenter);
+ }
+ @Override
+ public void onItemRangeChanged(int positionStart, int itemCount) {
+ for (int i = 0; i < itemCount; i++) {
+ bindControlToAction(positionStart + i, mAdapter, mPresenter);
+ }
+ }
+ };
+ }
+
+ void showControls(ObjectAdapter adapter, Presenter presenter) {
+ View focusedChild = mControlBar.getFocusedChild();
+ mControlBar.removeAllViews();
+ for (int position = 0; position < adapter.size() && position < MAX_CONTROLS;
+ position++) {
+ bindControlToAction(position, adapter, presenter);
+ }
+ if (focusedChild != null) {
+ focusedChild.requestFocus();
+ }
+ }
+
+ void bindControlToAction(final int position, ObjectAdapter adapter, Presenter presenter) {
+ Presenter.ViewHolder vh = mViewHolders.get(position);
+ Object item = adapter.get(position);
+ if (vh == null) {
+ vh = presenter.onCreateViewHolder(mControlBar);
+ mViewHolders.put(position, vh);
+ presenter.setOnClickListener(vh, new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Object item = getAdapter().get(position);
+ if (mOnActionClickedListener != null && item instanceof Action) {
+ mOnActionClickedListener.onActionClicked((Action) item);
+ }
+ }
+ });
+ }
+ if (vh.view.getParent() == null) {
+ mControlBar.addView(vh.view);
+ }
+ presenter.onBindViewHolder(vh, item);
+ }
+
+ ObjectAdapter getAdapter() {
+ return mAdapter;
+ }
+ }
+
+ private OnActionClickedListener mOnActionClickedListener;
+ private int mLayoutResourceId;
+
+ /**
+ * Constructor for a ControlBarPresenter.
+ *
+ * @param layoutResourceId The resource id of the layout for this presenter.
+ */
+ public ControlBarPresenter(int layoutResourceId) {
+ mLayoutResourceId = layoutResourceId;
+ }
+
+ /**
+ * Returns the layout resource id.
+ */
+ public int getLayoutResourceId() {
+ return mLayoutResourceId;
+ }
+
+ /**
+ * Sets the listener for {@link Action} click events.
+ */
+ public void setOnActionClickedListener(OnActionClickedListener listener) {
+ mOnActionClickedListener = listener;
+ }
+
+ /**
+ * Gets the listener for {@link Action} click events.
+ */
+ public OnActionClickedListener getOnActionClickedListener() {
+ return mOnActionClickedListener;
+ }
+
+ @Override
+ public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
+ View v = LayoutInflater.from(parent.getContext())
+ .inflate(getLayoutResourceId(), parent, false);
+ return new ViewHolder(v);
+ }
+
+ @Override
+ public void onBindViewHolder(Presenter.ViewHolder holder, Object item) {
+ ViewHolder vh = (ViewHolder) holder;
+ BoundData data = (BoundData) item;
+ if (vh.mAdapter != data.adapter) {
+ vh.mAdapter = data.adapter;
+ vh.mAdapter.registerObserver(vh.mDataObserver);
+ }
+ vh.mPresenter = data.presenter;
+ vh.showControls(vh.mAdapter, vh.mPresenter);
+ }
+
+ @Override
+ public void onUnbindViewHolder(Presenter.ViewHolder holder) {
+ ViewHolder vh = (ViewHolder) holder;
+ vh.mAdapter.unregisterObserver(vh.mDataObserver);
+ vh.mAdapter = null;
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ControlButtonPresenterSelector.java b/v17/leanback/src/android/support/v17/leanback/widget/ControlButtonPresenterSelector.java
new file mode 100644
index 0000000..de95729
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ControlButtonPresenterSelector.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.widget;
+
+import android.support.v17.leanback.R;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+/**
+ * ControlButtonPresenterSelector displays primary and secondary
+ * controls for a {@link PlaybackControlsRow}.
+ *
+ * Binds to items of type {@link Action}.
+ */
+public class ControlButtonPresenterSelector extends PresenterSelector {
+
+ private final Presenter mPrimaryPresenter =
+ new ControlButtonPresenter(R.layout.lb_control_button_primary);
+ private final Presenter mSecondaryPresenter =
+ new ControlButtonPresenter(R.layout.lb_control_button_secondary);
+
+ /**
+ * Returns the presenter for primary controls.
+ */
+ public Presenter getPrimaryPresenter() {
+ return mPrimaryPresenter;
+ }
+
+ /**
+ * Returns the presenter for secondary controls.
+ */
+ public Presenter getSecondaryPresenter() {
+ return mSecondaryPresenter;
+ }
+
+ /**
+ * Always returns the presenter for primary controls.
+ */
+ public Presenter getPresenter(Object item) {
+ return mPrimaryPresenter;
+ }
+
+ static class ActionViewHolder extends Presenter.ViewHolder {
+ ImageView mIcon;
+ View mFocusableView;
+
+ public ActionViewHolder(View view) {
+ super(view);
+ mIcon = (ImageView) view.findViewById(R.id.icon);
+ mFocusableView = view.findViewById(R.id.button);
+ }
+ }
+
+ static class ControlButtonPresenter extends Presenter {
+ private int mLayoutResourceId;
+
+ ControlButtonPresenter(int layoutResourceId) {
+ mLayoutResourceId = layoutResourceId;
+ }
+
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent) {
+ View v = LayoutInflater.from(parent.getContext())
+ .inflate(mLayoutResourceId, parent, false);
+ return new ActionViewHolder(v);
+ }
+
+ @Override
+ public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
+ Action action = (Action) item;
+ ActionViewHolder vh = (ActionViewHolder) viewHolder;
+ vh.mIcon.setImageDrawable(action.getIcon());
+ }
+
+ @Override
+ public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
+ ActionViewHolder vh = (ActionViewHolder) viewHolder;
+ vh.mIcon.setImageDrawable(null);
+ }
+
+ @Override
+ public void setOnClickListener(Presenter.ViewHolder viewHolder,
+ View.OnClickListener listener) {
+ ((ActionViewHolder) viewHolder).mFocusableView.setOnClickListener(listener);
+ }
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsPresenter.java
new file mode 100644
index 0000000..018cb67
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsPresenter.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.widget;
+
+import android.support.v17.leanback.R;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+/**
+ * A presenter for a control bar that supports "more actions",
+ * and toggling the set of controls between primary and secondary
+ * sets of {@link Actions}.
+ */
+class PlaybackControlsPresenter extends ControlBarPresenter {
+
+ /**
+ * The data type expected by this presenter.
+ */
+ static class BoundData extends ControlBarPresenter.BoundData {
+ /**
+ * The adapter containing secondary actions.
+ */
+ ObjectAdapter secondaryActionsAdapter;
+ }
+
+ class ViewHolder extends ControlBarPresenter.ViewHolder {
+ ObjectAdapter mMoreActionsAdapter;
+ ObjectAdapter.DataObserver mMoreActionsObserver;
+ FrameLayout mMoreActionsDock;
+ Presenter.ViewHolder mMoreActionsViewHolder;
+ boolean mMoreActionsShowing;
+
+ ViewHolder(View rootView) {
+ super(rootView);
+ mMoreActionsDock = (FrameLayout) rootView.findViewById(R.id.more_actions_dock);
+ mMoreActionsObserver = new ObjectAdapter.DataObserver() {
+ @Override
+ public void onChanged() {
+ if (mMoreActionsShowing) {
+ showControls(mMoreActionsAdapter, mPresenter);
+ }
+ }
+ @Override
+ public void onItemRangeChanged(int positionStart, int itemCount) {
+ if (mMoreActionsShowing) {
+ for (int i = 0; i < itemCount; i++) {
+ bindControlToAction(positionStart + i,
+ mMoreActionsAdapter, mPresenter);
+ }
+ }
+ }
+ };
+ }
+
+ void showMoreActions() {
+ if (mMoreActionsViewHolder == null) {
+ Action action = new PlaybackControlsRow.MoreActions(mMoreActionsDock.getContext());
+ mMoreActionsViewHolder = mPresenter.onCreateViewHolder(mMoreActionsDock);
+ mPresenter.onBindViewHolder(mMoreActionsViewHolder, action);
+ mPresenter.setOnClickListener(mMoreActionsViewHolder, new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ toggleMoreActions();
+ }
+ });
+ }
+ mMoreActionsDock.addView(mMoreActionsViewHolder.view);
+ }
+
+ void toggleMoreActions() {
+ mMoreActionsShowing = !mMoreActionsShowing;
+ showControls(getAdapter(), mPresenter);
+ }
+
+ @Override
+ ObjectAdapter getAdapter() {
+ return mMoreActionsShowing ? mMoreActionsAdapter : mAdapter;
+ }
+ }
+
+ private boolean mMoreActionsEnabled = true;
+
+ /**
+ * Constructor for a PlaybackControlsRowPresenter.
+ *
+ * @param layoutResourceId The resource id of the layout for this presenter.
+ */
+ public PlaybackControlsPresenter(int layoutResourceId) {
+ super(layoutResourceId);
+ }
+
+ /**
+ * Enables the display of secondary actions.
+ * A "more actions" button will be displayed. When "more actions" is selected,
+ * the primary actions are replaced with the secondary actions.
+ */
+ public void enableSecondaryActions(boolean enable) {
+ mMoreActionsEnabled = enable;
+ }
+
+ /**
+ * Returns true if secondary actions are enabled.
+ */
+ public boolean areMoreActionsEnabled() {
+ return mMoreActionsEnabled;
+ }
+
+ @Override
+ public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
+ View v = LayoutInflater.from(parent.getContext())
+ .inflate(getLayoutResourceId(), parent, false);
+ return new ViewHolder(v);
+ }
+
+ @Override
+ public void onBindViewHolder(Presenter.ViewHolder holder, Object item) {
+ super.onBindViewHolder(holder, item);
+
+ ViewHolder vh = (ViewHolder) holder;
+ BoundData data = (BoundData) item;
+ if (vh.mMoreActionsAdapter != data.secondaryActionsAdapter) {
+ vh.mMoreActionsAdapter = data.secondaryActionsAdapter;
+ vh.mMoreActionsAdapter.registerObserver(vh.mMoreActionsObserver);
+ }
+ if (mMoreActionsEnabled) {
+ vh.showMoreActions();
+ }
+ }
+
+ @Override
+ public void onUnbindViewHolder(Presenter.ViewHolder holder) {
+ super.onUnbindViewHolder(holder);
+ ViewHolder vh = (ViewHolder) holder;
+ vh.mMoreActionsAdapter.unregisterObserver(vh.mMoreActionsObserver);
+ vh.mMoreActionsAdapter = null;
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsRow.java b/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsRow.java
new file mode 100644
index 0000000..56e08ac
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsRow.java
@@ -0,0 +1,345 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.widget;
+
+import android.support.v17.leanback.R;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+
+/**
+ * A row of playback controls to be displayed by a {@link PlaybackControlsRowPresenter}.
+ *
+ * This row consists of some optional item detail, a series of primary actions,
+ * and an optional series of secondary actions.
+ *
+ * Controls are specified via an {@link ObjectAdapter} containing one or more
+ * {@link Action}s.
+ *
+ * Adapters should have their {@link PresenterSelector} set to an instance of
+ * {@link ControlButtonPresenterSelector}.
+ *
+ */
+public class PlaybackControlsRow extends Row {
+
+ /**
+ * An action displaying icons for play and pause.
+ */
+ public static class PlayPauseAction extends Action {
+ Drawable mPlayIcon;
+ Drawable mPauseIcon;
+
+ /**
+ * Constructor
+ * @param context Context used for loading resources.
+ */
+ public PlayPauseAction(Context context) {
+ super(R.id.lb_control_play_pause);
+ mPlayIcon = context.getResources().getDrawable(R.drawable.lb_ic_play);
+ mPauseIcon = context.getResources().getDrawable(R.drawable.lb_ic_pause);
+ play();
+ }
+
+ /**
+ * Display the play icon.
+ */
+ public void play() {
+ setIcon(mPlayIcon);
+ }
+
+ /**
+ * Display the pause icon.
+ */
+ public void pause() {
+ setIcon(mPauseIcon);
+ }
+
+ /**
+ * Toggle between the play and pause icon.
+ */
+ public void toggle() {
+ setIcon(getIcon() == mPlayIcon ? mPauseIcon : mPlayIcon);
+ }
+ }
+
+ /**
+ * An action displaying an icon for fast forward.
+ */
+ public static class FastForwardAction extends Action {
+ /**
+ * Constructor
+ * @param context Context used for loading resources.
+ */
+ public FastForwardAction(Context context) {
+ super(R.id.lb_control_fast_forward);
+ setIcon(context.getResources().getDrawable(R.drawable.lb_ic_fast_forward));
+ }
+ }
+
+ /**
+ * An action displaying an icon for rewind.
+ */
+ public static class RewindAction extends Action {
+ /**
+ * Constructor
+ * @param context Context used for loading resources.
+ */
+ public RewindAction(Context context) {
+ super(R.id.lb_control_fast_rewind);
+ setIcon(context.getResources().getDrawable(R.drawable.lb_ic_fast_rewind));
+ }
+ }
+
+ /**
+ * An action displaying an icon for skip next.
+ */
+ public static class SkipNextAction extends Action {
+ /**
+ * Constructor
+ * @param context Context used for loading resources.
+ */
+ public SkipNextAction(Context context) {
+ super(R.id.lb_control_skip_next);
+ setIcon(context.getResources().getDrawable(R.drawable.lb_ic_skip_next));
+ }
+ }
+
+ /**
+ * An action displaying an icon for skip previous.
+ */
+ public static class SkipPreviousAction extends Action {
+ /**
+ * Constructor
+ * @param context Context used for loading resources.
+ */
+ public SkipPreviousAction(Context context) {
+ super(R.id.lb_control_skip_previous);
+ setIcon(context.getResources().getDrawable(R.drawable.lb_ic_skip_previous));
+ }
+ }
+
+ /**
+ * An action displaying an icon for "more actions".
+ */
+ public static class MoreActions extends Action {
+ /**
+ * Constructor
+ * @param context Context used for loading resources.
+ */
+ public MoreActions(Context context) {
+ super(R.id.lb_control_more_actions);
+ setIcon(context.getResources().getDrawable(R.drawable.lb_ic_more));
+ }
+ }
+
+ /**
+ * An action displaying an icon for thumbs up.
+ */
+ public static class ThumbsUpAction extends Action {
+ /**
+ * Constructor
+ * @param context Context used for loading resources.
+ */
+ public ThumbsUpAction(Context context) {
+ super(R.id.lb_control_thumbs_up);
+ setIcon(context.getResources().getDrawable(R.drawable.lb_ic_thumb_up));
+ }
+ }
+
+ /**
+ * An action displaying an icon for thumbs down.
+ */
+ public static class ThumbsDownAction extends Action {
+ /**
+ * Constructor
+ * @param context Context used for loading resources.
+ */
+ public ThumbsDownAction(Context context) {
+ super(R.id.lb_control_thumbs_down);
+ setIcon(context.getResources().getDrawable(R.drawable.lb_ic_thumb_down));
+ }
+ }
+
+ /**
+ * An action for displaying three repeat states: none, one, or all.
+ */
+ public static class RepeatAction extends Action {
+ private static int NONE = 0;
+ private static int ONE = 1;
+ private static int ALL = 2;
+ private Drawable[] mRepeatIcon = new Drawable[3];
+ private int mState;
+
+ /**
+ * Constructor
+ * @param context Context used for loading resources.
+ */
+ public RepeatAction(Context context) {
+ super(R.id.lb_control_repeat);
+ Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
+ R.drawable.lb_ic_loop);
+ mRepeatIcon[NONE] = new BitmapDrawable(context.getResources(),
+ bitmap);
+ mRepeatIcon[ONE] = new BitmapDrawable(context.getResources(),
+ createBitmap(bitmap, Color.CYAN));
+ mRepeatIcon[ALL] = new BitmapDrawable(context.getResources(),
+ createBitmap(bitmap, Color.GREEN));
+ repeatNone();
+ }
+
+ /**
+ * Display the icon for repeat-none.
+ */
+ public void repeatNone() {
+ setIcon(mRepeatIcon[mState = NONE]);
+ }
+
+ /**
+ * Display the icon for repeat-one.
+ */
+ public void repeatOne() {
+ setIcon(mRepeatIcon[mState = ONE]);
+ }
+
+ /**
+ * Display the icon for repeat-all.
+ */
+ public void repeatAll() {
+ setIcon(mRepeatIcon[mState = ALL]);
+ }
+
+ /**
+ * Display the next icon in the series.
+ */
+ public void next() {
+ mState = mState == ALL ? NONE : mState + 1;
+ setIcon(mRepeatIcon[mState]);
+ }
+ }
+
+ /**
+ * An action for displaying a shuffle icon.
+ */
+ public static class ShuffleAction extends Action {
+ /**
+ * Constructor
+ * @param context Context used for loading resources.
+ */
+ public ShuffleAction(Context context) {
+ super(R.id.lb_control_shuffle);
+ setIcon(context.getResources().getDrawable(R.drawable.lb_ic_shuffle));
+ }
+ }
+
+ private static Bitmap createBitmap(Bitmap bitmap, int color) {
+ Bitmap dst = bitmap.copy(bitmap.getConfig(), true);
+ Canvas canvas = new Canvas(dst);
+ Paint paint = new Paint();
+ paint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP));
+ canvas.drawBitmap(bitmap, 0, 0, paint);
+ return dst;
+ }
+
+ private Object mItem;
+ private Drawable mImageDrawable;
+ private ObjectAdapter mPrimaryActionsAdapter;
+ private ObjectAdapter mSecondaryActionsAdapter;
+
+ /**
+ * Constructor for a PlaybackControlsRow that displays some details from
+ * the given item.
+ *
+ * @param item The main item for the row.
+ */
+ public PlaybackControlsRow(Object item) {
+ mItem = item;
+ }
+
+ /**
+ * Constructor for a PlaybackControlsRow that has no item details.
+ */
+ public PlaybackControlsRow() {
+ }
+
+ /**
+ * Gets the main item for the details page.
+ */
+ public final Object getItem() {
+ return mItem;
+ }
+
+ /**
+ * Sets a {link @Drawable} image for this row.
+ *
+ * @param drawable The drawable to set.
+ */
+ public final void setImageDrawable(Drawable drawable) {
+ mImageDrawable = drawable;
+ }
+
+ /**
+ * Sets a {@link Bitmap} for this row.
+ *
+ * @param context The context to retrieve display metrics from.
+ * @param bm The bitmap to set.
+ */
+ public final void setImageBitmap(Context context, Bitmap bm) {
+ mImageDrawable = new BitmapDrawable(context.getResources(), bm);
+ }
+
+ /**
+ * Gets the image {@link Drawable} of this row.
+ *
+ * @return The overview's image drawable, or null if no drawable has been
+ * assigned.
+ */
+ public final Drawable getImageDrawable() {
+ return mImageDrawable;
+ }
+
+ /**
+ * Sets the primary actions {@link ObjectAdapter}.
+ */
+ public final void setPrimaryActionsAdapter(ObjectAdapter adapter) {
+ mPrimaryActionsAdapter = adapter;
+ }
+
+ /**
+ * Sets the secondary actions {@link ObjectAdapter}.
+ */
+ public final void setSecondaryActionsAdapter(ObjectAdapter adapter) {
+ mSecondaryActionsAdapter = adapter;
+ }
+
+ /**
+ * Returns the primary actions {@link ObjectAdapter}.
+ */
+ public final ObjectAdapter getPrimaryActionsAdapter() {
+ return mPrimaryActionsAdapter;
+ }
+
+ /**
+ * Returns the secondary actions {@link ObjectAdapter}.
+ */
+ public final ObjectAdapter getSecondaryActionsAdapter() {
+ return mSecondaryActionsAdapter;
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsRowPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsRowPresenter.java
new file mode 100644
index 0000000..0f11a6a
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/PlaybackControlsRowPresenter.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.widget;
+
+import android.support.v17.leanback.R;
+import android.content.Context;
+import android.graphics.Color;
+import android.util.TypedValue;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.view.ViewGroup.MarginLayoutParams;
+import android.widget.ImageView;
+
+/**
+ * A PlaybackControlsRowPresenter renders a {@link PlaybackControlsRow} to display a
+ * series of playback control buttons. Typically this row will be the first row in a fragment
+ * such as the {@link android.support.v17.leanback.app.PlaybackOverlayFragment
+ * PlaybackControlsFragment}.
+ */
+public class PlaybackControlsRowPresenter extends RowPresenter {
+
+ /**
+ * A ViewHolder for the PlaybackControlsRow.
+ */
+ public static class ViewHolder extends RowPresenter.ViewHolder {
+ final ViewGroup mCard;
+ final ImageView mImageView;
+ final ViewGroup mDescriptionDock;
+ final ViewGroup mControlsDock;
+ final ViewGroup mSecondaryControlsDock;
+ final View mSpacer;
+ int mCardHeight;
+ int mControlsDockMarginStart;
+ int mControlsDockMarginEnd;
+ Presenter.ViewHolder mDescriptionVh;
+ Presenter.ViewHolder mControlsVh;
+ Presenter.ViewHolder mSecondaryControlsVh;
+ PlaybackControlsPresenter.BoundData mControlsBoundData =
+ new PlaybackControlsPresenter.BoundData();
+ ControlBarPresenter.BoundData mSecondaryBoundData = new ControlBarPresenter.BoundData();
+
+ ViewHolder(View rootView) {
+ super(rootView);
+ mCard = (ViewGroup) rootView.findViewById(R.id.controls_card);
+ mImageView = (ImageView) rootView.findViewById(R.id.image);
+ mDescriptionDock = (ViewGroup) rootView.findViewById(R.id.description_dock);
+ mControlsDock = (ViewGroup) rootView.findViewById(R.id.controls_dock);
+ mSecondaryControlsDock =
+ (ViewGroup) rootView.findViewById(R.id.secondary_controls_dock);
+ mSpacer = rootView.findViewById(R.id.spacer);
+ }
+
+ Presenter getPresenter(Object item, boolean primary) {
+ ObjectAdapter adapter = primary ?
+ ((PlaybackControlsRow) getRow()).getPrimaryActionsAdapter() :
+ ((PlaybackControlsRow) getRow()).getSecondaryActionsAdapter();
+ if (adapter.getPresenterSelector() instanceof ControlButtonPresenterSelector) {
+ ControlButtonPresenterSelector selector =
+ (ControlButtonPresenterSelector) adapter.getPresenterSelector();
+ return primary ? selector.getPrimaryPresenter() :
+ selector.getSecondaryPresenter();
+ }
+ return adapter.getPresenter(item);
+ }
+ }
+
+ private int mBackgroundColor = Color.TRANSPARENT;
+ private boolean mBackgroundColorSet;
+ private boolean mSecondaryActionsHidden;
+ private Presenter mDescriptionPresenter;
+ private PlaybackControlsPresenter mPlaybackControlsPresenter;
+ private ControlBarPresenter mSecondaryControlsPresenter;
+
+ /**
+ * Constructor for a PlaybackControlsRowPresenter.
+ *
+ * @param descriptionPresenter Presenter for displaying item details.
+ */
+ public PlaybackControlsRowPresenter(Presenter descriptionPresenter) {
+ setHeaderPresenter(null);
+ setSelectEffectEnabled(false);
+
+ mDescriptionPresenter = descriptionPresenter;
+ mPlaybackControlsPresenter = new PlaybackControlsPresenter(R.layout.lb_playback_controls);
+ mSecondaryControlsPresenter = new ControlBarPresenter(R.layout.lb_control_bar);
+ }
+
+ /**
+ * Constructor for a PlaybackControlsRowPresenter.
+ */
+ public PlaybackControlsRowPresenter() {
+ this(null);
+ }
+
+ /**
+ * Sets the listener for {@link Action} click events.
+ */
+ public void setOnActionClickedListener(OnActionClickedListener listener) {
+ mPlaybackControlsPresenter.setOnActionClickedListener(listener);
+ mSecondaryControlsPresenter.setOnActionClickedListener(listener);
+ }
+
+ /**
+ * Gets the listener for {@link Action} click events.
+ */
+ public OnActionClickedListener getOnActionClickedListener() {
+ return mPlaybackControlsPresenter.getOnActionClickedListener();
+ }
+
+ /**
+ * Sets the background color. If not set, a default from the theme will be used.
+ */
+ public void setBackgroundColor(int color) {
+ mBackgroundColor = color;
+ mBackgroundColorSet = true;
+ }
+
+ /**
+ * Returns the background color. If no background color was set, transparent
+ * is returned.
+ */
+ public int getBackgroundColor() {
+ return mBackgroundColor;
+ }
+
+ /**
+ * Sets the secondary actions to be hidden behind a "more actions" button.
+ * When "more actions" is selected, the primary actions are replaced with
+ * the secondary actions.
+ */
+ public void setSecondaryActionsHidden(boolean hidden) {
+ mSecondaryActionsHidden = hidden;
+ }
+
+ /**
+ * Returns true if secondary actions are hidden.
+ */
+ public boolean areSecondaryActionsHidden() {
+ return mSecondaryActionsHidden;
+ }
+
+ private int getDefaultBackgroundColor(Context context) {
+ TypedValue outValue = new TypedValue();
+ context.getTheme().resolveAttribute(R.attr.defaultBrandColor, outValue, true);
+ return context.getResources().getColor(outValue.resourceId);
+ }
+
+ @Override
+ protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
+ View v = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.lb_playback_controls_row, parent, false);
+ ViewHolder vh = new ViewHolder(v);
+ initRow(vh);
+ return vh;
+ }
+
+ private void initRow(ViewHolder vh) {
+ vh.mCardHeight = vh.mCard.getLayoutParams().height;
+
+ MarginLayoutParams lp = (MarginLayoutParams) vh.mControlsDock.getLayoutParams();
+ vh.mControlsDockMarginStart = lp.getMarginStart();
+ vh.mControlsDockMarginEnd = lp.getMarginEnd();
+
+ if (mDescriptionPresenter != null) {
+ vh.mDescriptionVh = mDescriptionPresenter.onCreateViewHolder(vh.mDescriptionDock);
+ vh.mDescriptionDock.addView(vh.mDescriptionVh.view);
+ }
+
+ vh.mControlsVh = mPlaybackControlsPresenter.onCreateViewHolder(vh.mControlsDock);
+ vh.mControlsDock.addView(vh.mControlsVh.view);
+
+ vh.mSecondaryControlsVh =
+ mSecondaryControlsPresenter.onCreateViewHolder(vh.mSecondaryControlsDock);
+ if (!mSecondaryActionsHidden) {
+ vh.mSecondaryControlsDock.addView(vh.mSecondaryControlsVh.view);
+ }
+ }
+
+ private void setBackground(View view) {
+ view.setBackgroundColor(mBackgroundColorSet ?
+ mBackgroundColor : getDefaultBackgroundColor(view.getContext()));
+ ShadowHelper.getInstance().setZ(view, 0f);
+ }
+
+ @Override
+ protected void onBindRowViewHolder(RowPresenter.ViewHolder holder, Object item) {
+ super.onBindRowViewHolder(holder, item);
+
+ ViewHolder vh = (ViewHolder) holder;
+ PlaybackControlsRow row = (PlaybackControlsRow) vh.getRow();
+
+ mPlaybackControlsPresenter.enableSecondaryActions(mSecondaryActionsHidden);
+
+ if (row.getItem() == null) {
+ LayoutParams lp = vh.mCard.getLayoutParams();
+ lp.height = LayoutParams.WRAP_CONTENT;
+ vh.mCard.setLayoutParams(lp);
+ vh.mDescriptionDock.setVisibility(View.GONE);
+ vh.mSpacer.setVisibility(View.GONE);
+ } else {
+ LayoutParams lp = vh.mCard.getLayoutParams();
+ lp.height = vh.mCardHeight;
+ vh.mCard.setLayoutParams(lp);
+ vh.mDescriptionDock.setVisibility(View.VISIBLE);
+ if (vh.mDescriptionVh != null) {
+ mDescriptionPresenter.onBindViewHolder(vh.mDescriptionVh, row.getItem());
+ }
+ vh.mSpacer.setVisibility(View.VISIBLE);
+ }
+
+ MarginLayoutParams lp = (MarginLayoutParams) vh.mControlsDock.getLayoutParams();
+ if (row.getImageDrawable() == null || row.getItem() == null) {
+ setBackground(vh.mControlsDock);
+ vh.mCard.setBackgroundColor(Color.TRANSPARENT);
+ lp.setMarginStart(0);
+ lp.setMarginEnd(0);
+ } else {
+ vh.mImageView.setImageDrawable(row.getImageDrawable());
+ setBackground(vh.mCard);
+ vh.mControlsDock.setBackgroundColor(Color.TRANSPARENT);
+ lp.setMarginStart(vh.mControlsDockMarginStart);
+ lp.setMarginEnd(vh.mControlsDockMarginEnd);
+ }
+ vh.mControlsDock.setLayoutParams(lp);
+
+ vh.mControlsBoundData.adapter = row.getPrimaryActionsAdapter();
+ vh.mControlsBoundData.secondaryActionsAdapter = row.getSecondaryActionsAdapter();
+ vh.mControlsBoundData.presenter = vh.getPresenter(
+ row.getPrimaryActionsAdapter().get(0), true);
+ mPlaybackControlsPresenter.onBindViewHolder(vh.mControlsVh, vh.mControlsBoundData);
+
+ vh.mSecondaryBoundData.adapter = row.getSecondaryActionsAdapter();
+ vh.mSecondaryBoundData.presenter = vh.getPresenter(
+ row.getSecondaryActionsAdapter().get(0), false);
+ mSecondaryControlsPresenter.onBindViewHolder(vh.mSecondaryControlsVh,
+ vh.mSecondaryBoundData);
+ }
+
+ @Override
+ protected void onUnbindRowViewHolder(RowPresenter.ViewHolder holder) {
+ super.onUnbindRowViewHolder(holder);
+
+ ViewHolder vh = (ViewHolder) holder;
+ if (vh.mDescriptionVh != null) {
+ mDescriptionPresenter.onUnbindViewHolder(vh.mDescriptionVh);
+ }
+ mPlaybackControlsPresenter.onUnbindViewHolder(vh.mControlsVh);
+ mSecondaryControlsPresenter.onUnbindViewHolder(vh.mSecondaryControlsVh);
+ }
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/Presenter.java b/v17/leanback/src/android/support/v17/leanback/widget/Presenter.java
index deffa45..ed7714d 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/Presenter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/Presenter.java
@@ -108,4 +108,17 @@
public void onViewDetachedFromWindow(ViewHolder holder) {
}
+ /**
+ * Called to set a click listener for the given view holder.
+ *
+ * The default implementation sets the click listener on the root view in the view holder.
+ * If the root view isn't focusable this method should be overridden to set the listener
+ * on the appropriate focusable child view(s).
+ *
+ * @param holder The view holder containing the view(s) on which the listener should be set.
+ * @param listener The click listener to be set.
+ */
+ public void setOnClickListener(ViewHolder holder, View.OnClickListener listener) {
+ holder.view.setOnClickListener(listener);
+ }
}
diff --git a/v4/Android.mk b/v4/Android.mk
index b78ab12..dbebab4 100644
--- a/v4/Android.mk
+++ b/v4/Android.mk
@@ -154,10 +154,9 @@
# -----------------------------------------------------------------------
# A helper sub-library that makes direct use of the upcoming API.
-# TODO: Apply a real name and SDK version when available
include $(CLEAR_VARS)
LOCAL_MODULE := android-support-v4-api20
-LOCAL_SDK_VERSION := current
+LOCAL_SDK_VERSION := 20
LOCAL_SRC_FILES := $(call all-java-files-under, api20)
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-kitkat
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/v4/api20/android/support/v4/app/NotificationCompatApi20.java b/v4/api20/android/support/v4/app/NotificationCompatApi20.java
index 41e1255..40b1386 100644
--- a/v4/api20/android/support/v4/app/NotificationCompatApi20.java
+++ b/v4/api20/android/support/v4/app/NotificationCompatApi20.java
@@ -31,15 +31,15 @@
public static class Builder implements NotificationBuilderWithBuilderAccessor,
NotificationBuilderWithActions {
private Notification.Builder b;
+ private Bundle mExtras;
public Builder(Context context, Notification n,
CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
RemoteViews tickerView, int number,
PendingIntent contentIntent, PendingIntent fullScreenIntent, Bitmap largeIcon,
- int mProgressMax, int mProgress, boolean mProgressIndeterminate,
+ int progressMax, int progress, boolean progressIndeterminate,
boolean useChronometer, int priority, CharSequence subText, boolean localOnly,
- String category, ArrayList<String> people, Bundle extras, int color,
- int visibility, Notification publicVersion, String groupKey, boolean groupSummary,
+ ArrayList<String> people, Bundle extras, String groupKey, boolean groupSummary,
String sortKey) {
b = new Notification.Builder(context)
.setWhen(n.when)
@@ -65,35 +65,24 @@
.setNumber(number)
.setUsesChronometer(useChronometer)
.setPriority(priority)
- .setProgress(mProgressMax, mProgress, mProgressIndeterminate)
+ .setProgress(progressMax, progress, progressIndeterminate)
.setLocalOnly(localOnly)
- .setCategory(category)
- .setExtras(extras)
- .setColor(color)
- .setVisibility(visibility)
- .setPublicVersion(publicVersion)
.setGroup(groupKey)
.setGroupSummary(groupSummary)
.setSortKey(sortKey);
- for (String person: people) {
- b.addPerson(person);
+ mExtras = new Bundle();
+ if (extras != null) {
+ mExtras.putAll(extras);
+ }
+ if (people != null && !people.isEmpty()) {
+ mExtras.putStringArray(Notification.EXTRA_PEOPLE,
+ people.toArray(new String[people.size()]));
}
}
@Override
public void addAction(NotificationCompatBase.Action action) {
- Notification.Action.Builder actionBuilder = new Notification.Action.Builder(
- action.getIcon(), action.getTitle(), action.getActionIntent());
- if (action.getRemoteInputs() != null) {
- for (RemoteInput remoteInput : RemoteInputCompatApi20.fromCompat(
- action.getRemoteInputs())) {
- actionBuilder.addRemoteInput(remoteInput);
- }
- }
- if (action.getExtras() != null) {
- actionBuilder.addExtras(action.getExtras());
- }
- b.addAction(actionBuilder.build());
+ NotificationCompatApi20.addAction(b, action);
}
@Override
@@ -102,10 +91,26 @@
}
public Notification build() {
+ b.setExtras(mExtras);
return b.build();
}
}
+ public static void addAction(Notification.Builder b, NotificationCompatBase.Action action) {
+ Notification.Action.Builder actionBuilder = new Notification.Action.Builder(
+ action.getIcon(), action.getTitle(), action.getActionIntent());
+ if (action.getRemoteInputs() != null) {
+ for (RemoteInput remoteInput : RemoteInputCompatApi20.fromCompat(
+ action.getRemoteInputs())) {
+ actionBuilder.addRemoteInput(remoteInput);
+ }
+ }
+ if (action.getExtras() != null) {
+ actionBuilder.addExtras(action.getExtras());
+ }
+ b.addAction(actionBuilder.build());
+ }
+
public static NotificationCompatBase.Action getAction(Notification notif,
int actionIndex, NotificationCompatBase.Action.Factory actionFactory,
RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
diff --git a/v4/api21/android/support/v4/app/NotificationCompatApi21.java b/v4/api21/android/support/v4/app/NotificationCompatApi21.java
index 5eb38e3..cdeabb1 100644
--- a/v4/api21/android/support/v4/app/NotificationCompatApi21.java
+++ b/v4/api21/android/support/v4/app/NotificationCompatApi21.java
@@ -17,6 +17,13 @@
package android.support.v4.app;
import android.app.Notification;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.widget.RemoteViews;
+
+import java.util.ArrayList;
class NotificationCompatApi21 {
@@ -35,8 +42,74 @@
public static final String CATEGORY_RECOMMENDATION = Notification.CATEGORY_RECOMMENDATION;
public static final String CATEGORY_STATUS = Notification.CATEGORY_STATUS;
+ public static class Builder implements NotificationBuilderWithBuilderAccessor,
+ NotificationBuilderWithActions {
+ private Notification.Builder b;
+
+ public Builder(Context context, Notification n,
+ CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
+ RemoteViews tickerView, int number,
+ PendingIntent contentIntent, PendingIntent fullScreenIntent, Bitmap largeIcon,
+ int progressMax, int progress, boolean progressIndeterminate,
+ boolean useChronometer, int priority, CharSequence subText, boolean localOnly,
+ String category, ArrayList<String> people, Bundle extras, int color,
+ int visibility, Notification publicVersion, String groupKey, boolean groupSummary,
+ String sortKey) {
+ b = new Notification.Builder(context)
+ .setWhen(n.when)
+ .setSmallIcon(n.icon, n.iconLevel)
+ .setContent(n.contentView)
+ .setTicker(n.tickerText, tickerView)
+ .setSound(n.sound, n.audioStreamType)
+ .setVibrate(n.vibrate)
+ .setLights(n.ledARGB, n.ledOnMS, n.ledOffMS)
+ .setOngoing((n.flags & Notification.FLAG_ONGOING_EVENT) != 0)
+ .setOnlyAlertOnce((n.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0)
+ .setAutoCancel((n.flags & Notification.FLAG_AUTO_CANCEL) != 0)
+ .setDefaults(n.defaults)
+ .setContentTitle(contentTitle)
+ .setContentText(contentText)
+ .setSubText(subText)
+ .setContentInfo(contentInfo)
+ .setContentIntent(contentIntent)
+ .setDeleteIntent(n.deleteIntent)
+ .setFullScreenIntent(fullScreenIntent,
+ (n.flags & Notification.FLAG_HIGH_PRIORITY) != 0)
+ .setLargeIcon(largeIcon)
+ .setNumber(number)
+ .setUsesChronometer(useChronometer)
+ .setPriority(priority)
+ .setProgress(progressMax, progress, progressIndeterminate)
+ .setLocalOnly(localOnly)
+ .setExtras(extras)
+ .setGroup(groupKey)
+ .setGroupSummary(groupSummary)
+ .setSortKey(sortKey)
+ .setCategory(category)
+ .setColor(color)
+ .setVisibility(visibility)
+ .setPublicVersion(publicVersion);
+ for (String person: people) {
+ b.addPerson(person);
+ }
+ }
+
+ @Override
+ public void addAction(NotificationCompatBase.Action action) {
+ NotificationCompatApi20.addAction(b, action);
+ }
+
+ @Override
+ public Notification.Builder getBuilder() {
+ return b;
+ }
+
+ public Notification build() {
+ return b.build();
+ }
+ }
+
public static String getCategory(Notification notif) {
return notif.category;
}
-
}
diff --git a/v4/ics/android/support/v4/app/NotificationCompatIceCreamSandwich.java b/v4/ics/android/support/v4/app/NotificationCompatIceCreamSandwich.java
index 3c74842..97912d9 100644
--- a/v4/ics/android/support/v4/app/NotificationCompatIceCreamSandwich.java
+++ b/v4/ics/android/support/v4/app/NotificationCompatIceCreamSandwich.java
@@ -27,7 +27,7 @@
CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
RemoteViews tickerView, int number,
PendingIntent contentIntent, PendingIntent fullScreenIntent, Bitmap largeIcon,
- int mProgressMax, int mProgress, boolean mProgressIndeterminate) {
+ int progressMax, int progress, boolean progressIndeterminate) {
Notification.Builder b = new Notification.Builder(context)
.setWhen(n.when)
.setSmallIcon(n.icon, n.iconLevel)
@@ -49,7 +49,7 @@
(n.flags & Notification.FLAG_HIGH_PRIORITY) != 0)
.setLargeIcon(largeIcon)
.setNumber(number)
- .setProgress(mProgressMax, mProgress, mProgressIndeterminate);
+ .setProgress(progressMax, progress, progressIndeterminate);
return b.getNotification();
}
diff --git a/v4/java/android/support/v4/app/ActionBarDrawerToggle.java b/v4/java/android/support/v4/app/ActionBarDrawerToggle.java
index eec4a16..5dc596b 100644
--- a/v4/java/android/support/v4/app/ActionBarDrawerToggle.java
+++ b/v4/java/android/support/v4/app/ActionBarDrawerToggle.java
@@ -19,7 +19,6 @@
import android.app.Activity;
import android.content.Context;
-import android.content.pm.ApplicationInfo;
import android.content.res.Configuration;
import android.graphics.Canvas;
import android.graphics.Rect;
@@ -29,6 +28,7 @@
import android.support.annotation.DrawableRes;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
+import android.support.v4.content.ContextCompat;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.DrawerLayout;
@@ -188,8 +188,9 @@
private final Delegate mActivityImpl;
private final DrawerLayout mDrawerLayout;
private boolean mDrawerIndicatorEnabled = true;
+ private boolean mHasCustomUpIndicator;
- private Drawable mThemeImage;
+ private Drawable mHomeAsUpIndicator;
private Drawable mDrawerImage;
private SlideDrawable mSlider;
private final int mDrawerImageResource;
@@ -267,8 +268,8 @@
mOpenDrawerContentDescRes = openDrawerContentDescRes;
mCloseDrawerContentDescRes = closeDrawerContentDescRes;
- mThemeImage = getThemeUpIndicator();
- mDrawerImage = activity.getResources().getDrawable(drawerImageRes);
+ mHomeAsUpIndicator = getThemeUpIndicator();
+ mDrawerImage = ContextCompat.getDrawable(activity, drawerImageRes);
mSlider = new SlideDrawable(mDrawerImage);
mSlider.setOffset(animate ? TOGGLE_DRAWABLE_OFFSET : 0);
}
@@ -296,6 +297,51 @@
}
/**
+ * Set the up indicator to display when the drawer indicator is not
+ * enabled.
+ * <p>
+ * If you pass <code>null</code> to this method, the default drawable from
+ * the theme will be used.
+ *
+ * @param indicator A drawable to use for the up indicator, or null to use
+ * the theme's default
+ * @see #setDrawerIndicatorEnabled(boolean)
+ */
+ public void setHomeAsUpIndicator(Drawable indicator) {
+ if (indicator == null) {
+ mHomeAsUpIndicator = getThemeUpIndicator();
+ mHasCustomUpIndicator = false;
+ } else {
+ mHomeAsUpIndicator = indicator;
+ mHasCustomUpIndicator = true;
+ }
+
+ if (!mDrawerIndicatorEnabled) {
+ setActionBarUpIndicator(mHomeAsUpIndicator, 0);
+ }
+ }
+
+ /**
+ * Set the up indicator to display when the drawer indicator is not
+ * enabled.
+ * <p>
+ * If you pass 0 to this method, the default drawable from the theme will
+ * be used.
+ *
+ * @param resId Resource ID of a drawable to use for the up indicator, or 0
+ * to use the theme's default
+ * @see #setDrawerIndicatorEnabled(boolean)
+ */
+ public void setHomeAsUpIndicator(int resId) {
+ Drawable indicator = null;
+ if (resId != 0) {
+ indicator = ContextCompat.getDrawable(mActivity, resId);
+ }
+
+ setHomeAsUpIndicator(indicator);
+ }
+
+ /**
* Enable or disable the drawer indicator. The indicator defaults to enabled.
*
* <p>When the indicator is disabled, the <code>ActionBar</code> will revert to displaying
@@ -311,7 +357,7 @@
setActionBarUpIndicator(mSlider, mDrawerLayout.isDrawerOpen(GravityCompat.START) ?
mCloseDrawerContentDescRes : mOpenDrawerContentDescRes);
} else {
- setActionBarUpIndicator(mThemeImage, 0);
+ setActionBarUpIndicator(mHomeAsUpIndicator, 0);
}
mDrawerIndicatorEnabled = enable;
}
@@ -334,8 +380,10 @@
*/
public void onConfigurationChanged(Configuration newConfig) {
// Reload drawables that can change with configuration
- mThemeImage = getThemeUpIndicator();
- mDrawerImage = mActivity.getResources().getDrawable(mDrawerImageResource);
+ if (!mHasCustomUpIndicator) {
+ mHomeAsUpIndicator = getThemeUpIndicator();
+ }
+ mDrawerImage = ContextCompat.getDrawable(mActivity, mDrawerImageResource);
syncState();
}
diff --git a/v4/java/android/support/v4/app/NotificationCompat.java b/v4/java/android/support/v4/app/NotificationCompat.java
index 02c7629..c3e6c5b 100644
--- a/v4/java/android/support/v4/app/NotificationCompat.java
+++ b/v4/java/android/support/v4/app/NotificationCompat.java
@@ -639,8 +639,7 @@
b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
b.mProgressMax, b.mProgress, b.mProgressIndeterminate,
- b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mCategory,
- b.mPeople, b.mExtras, b.mColor, b.mVisibility, b.mPublicVersion,
+ b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mPeople, b.mExtras,
b.mGroupKey, b.mGroupSummary, b.mSortKey);
addActionsToBuilder(builder, b.mActions);
addStyleToBuilderJellybean(builder, b.mStyle);
@@ -687,6 +686,27 @@
}
}
+ static class NotificationCompatImplApi21 extends NotificationCompatImplApi20 {
+ @Override
+ public Notification build(Builder b) {
+ NotificationCompatApi21.Builder builder = new NotificationCompatApi21.Builder(
+ b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
+ b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
+ b.mProgressMax, b.mProgress, b.mProgressIndeterminate,
+ b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mCategory,
+ b.mPeople, b.mExtras, b.mColor, b.mVisibility, b.mPublicVersion,
+ b.mGroupKey, b.mGroupSummary, b.mSortKey);
+ addActionsToBuilder(builder, b.mActions);
+ addStyleToBuilderJellybean(builder, b.mStyle);
+ return builder.build();
+ }
+
+ @Override
+ public String getCategory(Notification notif) {
+ return NotificationCompatApi21.getCategory(notif);
+ }
+ }
+
private static void addActionsToBuilder(NotificationBuilderWithActions builder,
ArrayList<Action> actions) {
for (Action action : actions) {
@@ -724,13 +744,6 @@
}
}
- static class NotificationCompatImplApi21 extends NotificationCompatImplApi20 {
- @Override
- public String getCategory(Notification notif) {
- return NotificationCompatApi21.getCategory(notif);
- }
- }
-
static {
// TODO: Replace this if clause when SDK_INT is incremented to 21.
if (Build.VERSION.RELEASE.equals("L")) {
diff --git a/v4/java/android/support/v4/content/ContextCompat.java b/v4/java/android/support/v4/content/ContextCompat.java
index 1e496e1..766e9a9 100644
--- a/v4/java/android/support/v4/content/ContextCompat.java
+++ b/v4/java/android/support/v4/content/ContextCompat.java
@@ -313,7 +313,7 @@
* The value 0 is an invalid identifier.
* @return Drawable An object that can be used to draw this resource.
*/
- public final Drawable getDrawable(Context context, int id) {
+ public static final Drawable getDrawable(Context context, int id) {
final int version = Build.VERSION.SDK_INT;
if (version >= 21) {
return ContextCompatApi21.getDrawable(context, id);
diff --git a/v4/jellybean/android/support/v4/app/NotificationCompatJellybean.java b/v4/jellybean/android/support/v4/app/NotificationCompatJellybean.java
index 5a416ef..6f54c4b 100644
--- a/v4/jellybean/android/support/v4/app/NotificationCompatJellybean.java
+++ b/v4/jellybean/android/support/v4/app/NotificationCompatJellybean.java
@@ -71,7 +71,7 @@
CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
RemoteViews tickerView, int number,
PendingIntent contentIntent, PendingIntent fullScreenIntent, Bitmap largeIcon,
- int mProgressMax, int mProgress, boolean mProgressIndeterminate,
+ int progressMax, int progress, boolean progressIndeterminate,
boolean useChronometer, int priority, CharSequence subText, boolean localOnly,
Bundle extras, String groupKey, boolean groupSummary, String sortKey) {
b = new Notification.Builder(context)
@@ -98,7 +98,7 @@
.setNumber(number)
.setUsesChronometer(useChronometer)
.setPriority(priority)
- .setProgress(mProgressMax, mProgress, mProgressIndeterminate);
+ .setProgress(progressMax, progress, progressIndeterminate);
mExtras = new Bundle();
if (extras != null) {
mExtras.putAll(extras);
diff --git a/v4/kitkat/android/support/v4/app/NotificationCompatKitKat.java b/v4/kitkat/android/support/v4/app/NotificationCompatKitKat.java
index 9ad8992..0ef0927 100644
--- a/v4/kitkat/android/support/v4/app/NotificationCompatKitKat.java
+++ b/v4/kitkat/android/support/v4/app/NotificationCompatKitKat.java
@@ -38,7 +38,7 @@
CharSequence contentTitle, CharSequence contentText, CharSequence contentInfo,
RemoteViews tickerView, int number,
PendingIntent contentIntent, PendingIntent fullScreenIntent, Bitmap largeIcon,
- int mProgressMax, int mProgress, boolean mProgressIndeterminate,
+ int progressMax, int progress, boolean progressIndeterminate,
boolean useChronometer, int priority, CharSequence subText, boolean localOnly,
ArrayList<String> people, Bundle extras, String groupKey, boolean groupSummary,
String sortKey) {
@@ -66,7 +66,7 @@
.setNumber(number)
.setUsesChronometer(useChronometer)
.setPriority(priority)
- .setProgress(mProgressMax, mProgress, mProgressIndeterminate);
+ .setProgress(progressMax, progress, progressIndeterminate);
mExtras = new Bundle();
if (extras != null) {
mExtras.putAll(extras);
diff --git a/v7/mediarouter/res/values-af/strings.xml b/v7/mediarouter/res/values-af/strings.xml
index 885af10..dd5d707 100644
--- a/v7/mediarouter/res/values-af/strings.xml
+++ b/v7/mediarouter/res/values-af/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Media-uitvoer"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Koppel aan toestel"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Soek tans vir toestelle…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Ontkoppel"</string>
diff --git a/v7/mediarouter/res/values-am/strings.xml b/v7/mediarouter/res/values-am/strings.xml
index 0027737..67999f2 100644
--- a/v7/mediarouter/res/values-am/strings.xml
+++ b/v7/mediarouter/res/values-am/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"የሚዲያ ውፅዓት"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ከመሳሪያ ጋር ያገናኙ"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"መሳሪያዎችን በመፈለግ ላይ…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ግንኙነት አቋርጥ"</string>
diff --git a/v7/mediarouter/res/values-ar/strings.xml b/v7/mediarouter/res/values-ar/strings.xml
index 9289a35..003a7ce 100644
--- a/v7/mediarouter/res/values-ar/strings.xml
+++ b/v7/mediarouter/res/values-ar/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"المنفذ الإعلامي"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"الاتصال بجهاز"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"جارٍ البحث عن الأجهزة…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"قطع الاتصال"</string>
diff --git a/v7/mediarouter/res/values-bg/strings.xml b/v7/mediarouter/res/values-bg/strings.xml
index ff1401e..f65502d 100644
--- a/v7/mediarouter/res/values-bg/strings.xml
+++ b/v7/mediarouter/res/values-bg/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Изходяща мултимедия"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Свързване с устройство"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Търсят се устройства…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Прекратяване на връзката"</string>
diff --git a/v7/mediarouter/res/values-bn-rBD/strings.xml b/v7/mediarouter/res/values-bn-rBD/strings.xml
index d0b2c32..e0b2f61 100644
--- a/v7/mediarouter/res/values-bn-rBD/strings.xml
+++ b/v7/mediarouter/res/values-bn-rBD/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"মিডিয়া আউটপুট"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ডিভাইসে সংযোগ করুন"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"ডিভাইসগুলি অনুসন্ধান করা হচ্ছে…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"সংযোগ বিচ্ছিন্ন করুন"</string>
diff --git a/v7/mediarouter/res/values-ca/strings.xml b/v7/mediarouter/res/values-ca/strings.xml
index dd485de..55be01d 100644
--- a/v7/mediarouter/res/values-ca/strings.xml
+++ b/v7/mediarouter/res/values-ca/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Sortida de contingut multimèdia"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connecta al dispositiu"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"S\'estan cercant dispositius…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Desconnecta"</string>
diff --git a/v7/mediarouter/res/values-cs/strings.xml b/v7/mediarouter/res/values-cs/strings.xml
index 4687100..14d0702 100644
--- a/v7/mediarouter/res/values-cs/strings.xml
+++ b/v7/mediarouter/res/values-cs/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Výstup médií"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Připojení k zařízení"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Vyhledávání zařízení…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Odpojit"</string>
diff --git a/v7/mediarouter/res/values-da/strings.xml b/v7/mediarouter/res/values-da/strings.xml
index fd3b0fb..fc12caf 100644
--- a/v7/mediarouter/res/values-da/strings.xml
+++ b/v7/mediarouter/res/values-da/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Medieudgang"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Opret forbindelse til enheden"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Søger efter enheder..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Afbryd forbindelsen"</string>
diff --git a/v7/mediarouter/res/values-de/strings.xml b/v7/mediarouter/res/values-de/strings.xml
index 9df0ebf..9fe15ca 100644
--- a/v7/mediarouter/res/values-de/strings.xml
+++ b/v7/mediarouter/res/values-de/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Medienausgabe"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Mit Gerät verbinden"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Geräte werden gesucht…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Verbindung aufheben"</string>
diff --git a/v7/mediarouter/res/values-el/strings.xml b/v7/mediarouter/res/values-el/strings.xml
index 5a61395..09f0660 100644
--- a/v7/mediarouter/res/values-el/strings.xml
+++ b/v7/mediarouter/res/values-el/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Έξοδος μέσων"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Σύνδεση με τη συσκευή"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Αναζήτηση συσκευών…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Αποσύνδεση"</string>
diff --git a/v7/mediarouter/res/values-en-rGB/strings.xml b/v7/mediarouter/res/values-en-rGB/strings.xml
index b9af4bf..e1defef 100644
--- a/v7/mediarouter/res/values-en-rGB/strings.xml
+++ b/v7/mediarouter/res/values-en-rGB/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Media output"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
diff --git a/v7/mediarouter/res/values-en-rIN/strings.xml b/v7/mediarouter/res/values-en-rIN/strings.xml
index b9af4bf..e1defef 100644
--- a/v7/mediarouter/res/values-en-rIN/strings.xml
+++ b/v7/mediarouter/res/values-en-rIN/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Media output"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
diff --git a/v7/mediarouter/res/values-es-rUS/strings.xml b/v7/mediarouter/res/values-es-rUS/strings.xml
index 211b400..129dbc0 100644
--- a/v7/mediarouter/res/values-es-rUS/strings.xml
+++ b/v7/mediarouter/res/values-es-rUS/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Salida multimedia"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Conectar al dispositivo"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
diff --git a/v7/mediarouter/res/values-es/strings.xml b/v7/mediarouter/res/values-es/strings.xml
index d3a1639..acc2606 100644
--- a/v7/mediarouter/res/values-es/strings.xml
+++ b/v7/mediarouter/res/values-es/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Salida multimedia"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Conectar a dispositivo"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
diff --git a/v7/mediarouter/res/values-et-rEE/strings.xml b/v7/mediarouter/res/values-et-rEE/strings.xml
index 7dbdf74..59dcd0b 100644
--- a/v7/mediarouter/res/values-et-rEE/strings.xml
+++ b/v7/mediarouter/res/values-et-rEE/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Meediaväljund"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Seadmega ühendamine"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Seadmete otsimine …"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Katkesta ühendus"</string>
diff --git a/v7/mediarouter/res/values-eu-rES/strings.xml b/v7/mediarouter/res/values-eu-rES/strings.xml
index 728672d..b67580a 100644
--- a/v7/mediarouter/res/values-eu-rES/strings.xml
+++ b/v7/mediarouter/res/values-eu-rES/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Multimedia-irteera"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Konektatu gailura"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Gailuak bilatzen…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Deskonektatu"</string>
diff --git a/v7/mediarouter/res/values-fa/strings.xml b/v7/mediarouter/res/values-fa/strings.xml
index 2ffed50..7594f15 100644
--- a/v7/mediarouter/res/values-fa/strings.xml
+++ b/v7/mediarouter/res/values-fa/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"خروجی رسانه"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"برقراری ارتباط با دستگاه"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"در حال جستجو برای دستگاهها..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"قطع ارتباط"</string>
diff --git a/v7/mediarouter/res/values-fi/strings.xml b/v7/mediarouter/res/values-fi/strings.xml
index 0692c2f..f46631c 100644
--- a/v7/mediarouter/res/values-fi/strings.xml
+++ b/v7/mediarouter/res/values-fi/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Median äänentoisto"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Yhdistä laitteeseen"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Etsitään laitteita…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Katkaise yhteys"</string>
diff --git a/v7/mediarouter/res/values-fr-rCA/strings.xml b/v7/mediarouter/res/values-fr-rCA/strings.xml
index 9fa3c9c..5aed024 100644
--- a/v7/mediarouter/res/values-fr-rCA/strings.xml
+++ b/v7/mediarouter/res/values-fr-rCA/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Sortie multimédia"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connexion au périphérique"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Recherche d\'appareils en cours…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Déconnecter"</string>
diff --git a/v7/mediarouter/res/values-fr/strings.xml b/v7/mediarouter/res/values-fr/strings.xml
index 5607a1c..f2d610c 100644
--- a/v7/mediarouter/res/values-fr/strings.xml
+++ b/v7/mediarouter/res/values-fr/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Sortie multimédia"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connecter à l\'appareil"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Recherche d\'appareils en cours…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Déconnecter"</string>
diff --git a/v7/mediarouter/res/values-gl-rES/strings.xml b/v7/mediarouter/res/values-gl-rES/strings.xml
index d700c14..ce14f83 100644
--- a/v7/mediarouter/res/values-gl-rES/strings.xml
+++ b/v7/mediarouter/res/values-gl-rES/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Saída multimedia"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Conectar co dispositivo"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
diff --git a/v7/mediarouter/res/values-hi/strings.xml b/v7/mediarouter/res/values-hi/strings.xml
index 8acc2bb..b14c027 100644
--- a/v7/mediarouter/res/values-hi/strings.xml
+++ b/v7/mediarouter/res/values-hi/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"मीडिया आउटपुट"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"उपकरण से कनेक्ट करें"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"उपकरणों की खोज हो रही है…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"डिस्कनेक्ट करें"</string>
diff --git a/v7/mediarouter/res/values-hr/strings.xml b/v7/mediarouter/res/values-hr/strings.xml
index 2946433..4f16e91 100644
--- a/v7/mediarouter/res/values-hr/strings.xml
+++ b/v7/mediarouter/res/values-hr/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Medijski izlaz"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Povezivanje s uređajem"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Traženje uređaja…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Prekini vezu"</string>
diff --git a/v7/mediarouter/res/values-hu/strings.xml b/v7/mediarouter/res/values-hu/strings.xml
index b68fe16..c59aad7 100644
--- a/v7/mediarouter/res/values-hu/strings.xml
+++ b/v7/mediarouter/res/values-hu/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Médiakimenet"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Csatlakozás adott eszközhöz"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Eszközkeresés…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Leválasztás"</string>
diff --git a/v7/mediarouter/res/values-hy-rAM/strings.xml b/v7/mediarouter/res/values-hy-rAM/strings.xml
index 77f1136..fbe550f 100644
--- a/v7/mediarouter/res/values-hy-rAM/strings.xml
+++ b/v7/mediarouter/res/values-hy-rAM/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Մեդիա արտածում"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Միանալ սարքին"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Որոնվում են սարքեր..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Անջատել"</string>
diff --git a/v7/mediarouter/res/values-in/strings.xml b/v7/mediarouter/res/values-in/strings.xml
index 1d3b387..c6aac4e 100644
--- a/v7/mediarouter/res/values-in/strings.xml
+++ b/v7/mediarouter/res/values-in/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Keluaran media"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Sambungkan ke perangkat"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Menelusuri perangkat…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Putuskan sambungan"</string>
diff --git a/v7/mediarouter/res/values-is-rIS/strings.xml b/v7/mediarouter/res/values-is-rIS/strings.xml
index 45d7329..1ff1e40 100644
--- a/v7/mediarouter/res/values-is-rIS/strings.xml
+++ b/v7/mediarouter/res/values-is-rIS/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Margmiðlunarúttak"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Tengjast tæki"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Leitar að tækjum…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Aftengja"</string>
diff --git a/v7/mediarouter/res/values-it/strings.xml b/v7/mediarouter/res/values-it/strings.xml
index bd58755..945bba4 100644
--- a/v7/mediarouter/res/values-it/strings.xml
+++ b/v7/mediarouter/res/values-it/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Uscita media"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connetti al dispositivo"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Ricerca di dispositivi…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Disconnetti"</string>
diff --git a/v7/mediarouter/res/values-iw/strings.xml b/v7/mediarouter/res/values-iw/strings.xml
index 59753b4..814c744 100644
--- a/v7/mediarouter/res/values-iw/strings.xml
+++ b/v7/mediarouter/res/values-iw/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"פלט מדיה"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"התחבר למכשיר"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"מחפש מכשירים…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"התנתק"</string>
diff --git a/v7/mediarouter/res/values-ja/strings.xml b/v7/mediarouter/res/values-ja/strings.xml
index 1367489..2a74840 100644
--- a/v7/mediarouter/res/values-ja/strings.xml
+++ b/v7/mediarouter/res/values-ja/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"メディア出力"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"端末に接続"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"端末を検索しています…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"接続を解除"</string>
diff --git a/v7/mediarouter/res/values-ka-rGE/strings.xml b/v7/mediarouter/res/values-ka-rGE/strings.xml
index 413257e..82a5332 100644
--- a/v7/mediarouter/res/values-ka-rGE/strings.xml
+++ b/v7/mediarouter/res/values-ka-rGE/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"მედია გამოსასვლელი"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"მოწყობილობასთან დაკავშირება"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"მოწყობილობების ძიება…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"კავშირის გაწყვეტა"</string>
diff --git a/v7/mediarouter/res/values-kk-rKZ/strings.xml b/v7/mediarouter/res/values-kk-rKZ/strings.xml
index e8da02a..c08b126 100644
--- a/v7/mediarouter/res/values-kk-rKZ/strings.xml
+++ b/v7/mediarouter/res/values-kk-rKZ/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Meдиа құрылғылары"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Құрылғыға жалғау"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Құрылғыларды іздеуде…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Ажырату"</string>
diff --git a/v7/mediarouter/res/values-km-rKH/strings.xml b/v7/mediarouter/res/values-km-rKH/strings.xml
index e001dde..111faed 100644
--- a/v7/mediarouter/res/values-km-rKH/strings.xml
+++ b/v7/mediarouter/res/values-km-rKH/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"លទ្ធផលមេឌៀ"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ភ្ជាប់ឧបករណ៍"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"កំពុងស្វែងរកឧបករណ៍..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ផ្ដាច់"</string>
diff --git a/v7/mediarouter/res/values-kn-rIN/strings.xml b/v7/mediarouter/res/values-kn-rIN/strings.xml
index 147ebc8..7613813 100644
--- a/v7/mediarouter/res/values-kn-rIN/strings.xml
+++ b/v7/mediarouter/res/values-kn-rIN/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"ಮಾಧ್ಯಮ ಔಟ್ಪುಟ್"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಿ"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
diff --git a/v7/mediarouter/res/values-ko/strings.xml b/v7/mediarouter/res/values-ko/strings.xml
index 21f82a0..07b7114 100644
--- a/v7/mediarouter/res/values-ko/strings.xml
+++ b/v7/mediarouter/res/values-ko/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"미디어 출력"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"기기에 연결"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"기기 검색 중…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"연결 해제"</string>
diff --git a/v7/mediarouter/res/values-ky-rKG/strings.xml b/v7/mediarouter/res/values-ky-rKG/strings.xml
index 4a587ac..5427608 100644
--- a/v7/mediarouter/res/values-ky-rKG/strings.xml
+++ b/v7/mediarouter/res/values-ky-rKG/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Медиа чыгаруу"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Түзмөккө туташуу"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Түзмөктөр изделүүдө..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Ажыратуу"</string>
diff --git a/v7/mediarouter/res/values-lo-rLA/strings.xml b/v7/mediarouter/res/values-lo-rLA/strings.xml
index 31a03cd..5faad21 100644
--- a/v7/mediarouter/res/values-lo-rLA/strings.xml
+++ b/v7/mediarouter/res/values-lo-rLA/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"ມີເດຍເອົ້າພຸດ"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ເຊື່ອມຕໍ່ຫາອຸປະກອນ"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"ກຳລັງຊອກຫາອຸປະກອນ..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ຕັດການເຊື່ອມຕໍ່"</string>
diff --git a/v7/mediarouter/res/values-lt/strings.xml b/v7/mediarouter/res/values-lt/strings.xml
index ead3b73..92ca4c7 100644
--- a/v7/mediarouter/res/values-lt/strings.xml
+++ b/v7/mediarouter/res/values-lt/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Medijos išvestis"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Prijungimas prie įrenginio"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Ieškoma įrenginių…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Atjungti"</string>
diff --git a/v7/mediarouter/res/values-lv/strings.xml b/v7/mediarouter/res/values-lv/strings.xml
index 0914990..78a1a18 100644
--- a/v7/mediarouter/res/values-lv/strings.xml
+++ b/v7/mediarouter/res/values-lv/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Multivides izeja"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Savienojuma izveide ar ierīci"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Notiek ierīču meklēšana..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Atvienot"</string>
diff --git a/v7/mediarouter/res/values-mk-rMK/strings.xml b/v7/mediarouter/res/values-mk-rMK/strings.xml
index 363f16b..785da20 100644
--- a/v7/mediarouter/res/values-mk-rMK/strings.xml
+++ b/v7/mediarouter/res/values-mk-rMK/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Излез за медиум"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Поврзи се со уредот"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Се пребаруваат уреди..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Исклучи се"</string>
diff --git a/v7/mediarouter/res/values-ml-rIN/strings.xml b/v7/mediarouter/res/values-ml-rIN/strings.xml
index d20ba1d..4e612fc 100644
--- a/v7/mediarouter/res/values-ml-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ml-rIN/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"മീഡിയ ഔട്ട്പുട്ട്"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ഉപകരണത്തിലേക്ക് കണക്റ്റുചെയ്യുക"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"ഉപകരണങ്ങൾക്കായി തിരയുന്നു…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"വിച്ഛേദിക്കുക"</string>
diff --git a/v7/mediarouter/res/values-mn-rMN/strings.xml b/v7/mediarouter/res/values-mn-rMN/strings.xml
index 4eecdb4..ea7396e 100644
--- a/v7/mediarouter/res/values-mn-rMN/strings.xml
+++ b/v7/mediarouter/res/values-mn-rMN/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Медиа гаралт"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Төхөөрөмжтэй холбох"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Төхөөрөмжүүдийг хайж байна…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Салгах"</string>
diff --git a/v7/mediarouter/res/values-mr-rIN/strings.xml b/v7/mediarouter/res/values-mr-rIN/strings.xml
index 9187b5d..feee62e 100644
--- a/v7/mediarouter/res/values-mr-rIN/strings.xml
+++ b/v7/mediarouter/res/values-mr-rIN/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"माध्यम आउटपुट"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"डिव्हाइसला कनेक्ट करा"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"डिव्हाइसेस शोधत आहे…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"डिस्कनेक्ट करा"</string>
diff --git a/v7/mediarouter/res/values-ms-rMY/strings.xml b/v7/mediarouter/res/values-ms-rMY/strings.xml
index dadaa30..3f662bf 100644
--- a/v7/mediarouter/res/values-ms-rMY/strings.xml
+++ b/v7/mediarouter/res/values-ms-rMY/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Output media"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Sambung kepada peranti"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Mencari peranti..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Putuskan sambungan"</string>
diff --git a/v7/mediarouter/res/values-my-rMM/strings.xml b/v7/mediarouter/res/values-my-rMM/strings.xml
index c417d57..d2d3179 100644
--- a/v7/mediarouter/res/values-my-rMM/strings.xml
+++ b/v7/mediarouter/res/values-my-rMM/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"မီဒီယာထွက်ပေါက်"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"စက်တစ်ခုကို ချိတ်ဆက်ပါ"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"စက်ပစ္စည်းများကို ရှာဖွေနေပါသည်"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ချိတ်ဆက်ခြင်းရပ်တန့်ရန်"</string>
diff --git a/v7/mediarouter/res/values-nb/strings.xml b/v7/mediarouter/res/values-nb/strings.xml
index fa4d9a4..7a374bd 100644
--- a/v7/mediarouter/res/values-nb/strings.xml
+++ b/v7/mediarouter/res/values-nb/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Medieutgang"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Koble til enheten"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Søker etter enheter …"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Koble fra"</string>
diff --git a/v7/mediarouter/res/values-ne-rNP/strings.xml b/v7/mediarouter/res/values-ne-rNP/strings.xml
index 3fe9ac3..740e560 100644
--- a/v7/mediarouter/res/values-ne-rNP/strings.xml
+++ b/v7/mediarouter/res/values-ne-rNP/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"मिडियाको उत्पादन"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"उपकरणसँग जडान गर्नुहोस्"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"उपकरणहरूका लागि खोजी गरिँदै..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"विच्छेदन गर्नुहोस्"</string>
diff --git a/v7/mediarouter/res/values-nl/strings.xml b/v7/mediarouter/res/values-nl/strings.xml
index 5572449..7ccac8a 100644
--- a/v7/mediarouter/res/values-nl/strings.xml
+++ b/v7/mediarouter/res/values-nl/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Media-uitvoer"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Verbinding maken met apparaat"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Zoeken naar apparaten…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Verbinding verbreken"</string>
diff --git a/v7/mediarouter/res/values-pl/strings.xml b/v7/mediarouter/res/values-pl/strings.xml
index 95a1d03..6ceb597 100644
--- a/v7/mediarouter/res/values-pl/strings.xml
+++ b/v7/mediarouter/res/values-pl/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Wyjście multimediów"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Połącz z urządzeniem"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Szukam urządzeń…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Rozłącz"</string>
diff --git a/v7/mediarouter/res/values-pt-rPT/strings.xml b/v7/mediarouter/res/values-pt-rPT/strings.xml
index 54b1dfc..23d1f0b 100644
--- a/v7/mediarouter/res/values-pt-rPT/strings.xml
+++ b/v7/mediarouter/res/values-pt-rPT/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Saída de som multimédia"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Ligar ao dispositivo"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"A pesquisar dispositivos…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Desassociar"</string>
diff --git a/v7/mediarouter/res/values-pt/strings.xml b/v7/mediarouter/res/values-pt/strings.xml
index 3ce1c38..1ba4054 100644
--- a/v7/mediarouter/res/values-pt/strings.xml
+++ b/v7/mediarouter/res/values-pt/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Saída de mídia"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Conectar ao dispositivo"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Procurando dispositivos…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
diff --git a/v7/mediarouter/res/values-ro/strings.xml b/v7/mediarouter/res/values-ro/strings.xml
index 4c9e4b9..3d53163 100644
--- a/v7/mediarouter/res/values-ro/strings.xml
+++ b/v7/mediarouter/res/values-ro/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Rezultate media"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Conectați-vă la dispozitiv"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Se caută dispozitive..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Deconectați-vă"</string>
diff --git a/v7/mediarouter/res/values-ru/strings.xml b/v7/mediarouter/res/values-ru/strings.xml
index 5cc2bba..cfe5951 100644
--- a/v7/mediarouter/res/values-ru/strings.xml
+++ b/v7/mediarouter/res/values-ru/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Перенаправлять поток мультимедиа"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Подключение к устройству"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Поиск устройств…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Отключить"</string>
diff --git a/v7/mediarouter/res/values-si-rLK/strings.xml b/v7/mediarouter/res/values-si-rLK/strings.xml
index 2eba3c8..e6fa78b 100644
--- a/v7/mediarouter/res/values-si-rLK/strings.xml
+++ b/v7/mediarouter/res/values-si-rLK/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"මාධ්ය ප්රතිදානය"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"උපාංගයට සම්බන්ධ වන්න"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"උපාංග සඳහා සොයමින්…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"විසන්ධි කරන්න"</string>
diff --git a/v7/mediarouter/res/values-sk/strings.xml b/v7/mediarouter/res/values-sk/strings.xml
index 668800f..c61977e 100644
--- a/v7/mediarouter/res/values-sk/strings.xml
+++ b/v7/mediarouter/res/values-sk/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Výstup médií"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Pripojenie k zariadeniu"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Prebieha vyhľadávanie zariadení…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Odpojiť"</string>
diff --git a/v7/mediarouter/res/values-sl/strings.xml b/v7/mediarouter/res/values-sl/strings.xml
index 3e3e8bb..d435118 100644
--- a/v7/mediarouter/res/values-sl/strings.xml
+++ b/v7/mediarouter/res/values-sl/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Izhod za predstavnost"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Povezovanje z napravo"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Iskanje naprav …"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Prekini povezavo"</string>
diff --git a/v7/mediarouter/res/values-sr/strings.xml b/v7/mediarouter/res/values-sr/strings.xml
index 320f3e8..b5acdc4 100644
--- a/v7/mediarouter/res/values-sr/strings.xml
+++ b/v7/mediarouter/res/values-sr/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Излаз медија"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Повежите са уређајем"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Претраживање уређаја…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Прекини везу"</string>
diff --git a/v7/mediarouter/res/values-sv/strings.xml b/v7/mediarouter/res/values-sv/strings.xml
index 910c6f1..7d6d2cc 100644
--- a/v7/mediarouter/res/values-sv/strings.xml
+++ b/v7/mediarouter/res/values-sv/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Medieuppspelning"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Anslut till enhet"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Söker efter enheter ..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Koppla från"</string>
diff --git a/v7/mediarouter/res/values-sw/strings.xml b/v7/mediarouter/res/values-sw/strings.xml
index fcbc590..198d47c 100644
--- a/v7/mediarouter/res/values-sw/strings.xml
+++ b/v7/mediarouter/res/values-sw/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Towe la vyombo vya habari"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Unganisha kwenye kifaa"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Inatafuta vifaa..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Tenganisha"</string>
diff --git a/v7/mediarouter/res/values-ta-rIN/strings.xml b/v7/mediarouter/res/values-ta-rIN/strings.xml
index d5d1386..c16e656 100644
--- a/v7/mediarouter/res/values-ta-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ta-rIN/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"மீடியா வெளியீடு"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"சாதனத்துடன் இணைக்கவும்"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"சாதனங்களைத் தேடுகிறது..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"துண்டி"</string>
diff --git a/v7/mediarouter/res/values-te-rIN/strings.xml b/v7/mediarouter/res/values-te-rIN/strings.xml
index 9fa6e90..4e9ac98 100644
--- a/v7/mediarouter/res/values-te-rIN/strings.xml
+++ b/v7/mediarouter/res/values-te-rIN/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"మీడియా అవుట్పుట్"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"పరికరానికి కనెక్ట్ చేయండి"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"పరికరాల కోసం శోధిస్తోంది…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"డిస్కనెక్ట్ చేయి"</string>
diff --git a/v7/mediarouter/res/values-th/strings.xml b/v7/mediarouter/res/values-th/strings.xml
index 78e5a73..732c550 100644
--- a/v7/mediarouter/res/values-th/strings.xml
+++ b/v7/mediarouter/res/values-th/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"เอาต์พุตสื่อ"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"เชื่อมต่อกับอุปกรณ์"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"กำลังค้นหาอุปกรณ์…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ยกเลิกการเชื่อมต่อ"</string>
diff --git a/v7/mediarouter/res/values-tl/strings.xml b/v7/mediarouter/res/values-tl/strings.xml
index 0953787..9edd09c 100644
--- a/v7/mediarouter/res/values-tl/strings.xml
+++ b/v7/mediarouter/res/values-tl/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Output ng media"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Kumonekta sa device"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Naghahanap ng mga device…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Idiskonekta"</string>
diff --git a/v7/mediarouter/res/values-tr/strings.xml b/v7/mediarouter/res/values-tr/strings.xml
index 12faaa6..b6d747d 100644
--- a/v7/mediarouter/res/values-tr/strings.xml
+++ b/v7/mediarouter/res/values-tr/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Medya çıkışı"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Cihaza bağlanın"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Cihaz arayın…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Bağlantıyı kes"</string>
diff --git a/v7/mediarouter/res/values-uk/strings.xml b/v7/mediarouter/res/values-uk/strings.xml
index b036dea..209e059 100644
--- a/v7/mediarouter/res/values-uk/strings.xml
+++ b/v7/mediarouter/res/values-uk/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Вивід медіа-даних"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Під’єднатися до пристрою"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Пошук пристроїв…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Від’єднатися"</string>
diff --git a/v7/mediarouter/res/values-ur-rPK/strings.xml b/v7/mediarouter/res/values-ur-rPK/strings.xml
index bce0e0c..1f49f4a 100644
--- a/v7/mediarouter/res/values-ur-rPK/strings.xml
+++ b/v7/mediarouter/res/values-ur-rPK/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"میڈیا آؤٹ پٹ"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"آلہ سے مربوط ہوں"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"آلات تلاش کر رہا ہے…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"غیر مربوط کریں"</string>
diff --git a/v7/mediarouter/res/values-uz-rUZ/strings.xml b/v7/mediarouter/res/values-uz-rUZ/strings.xml
index f191fd9..5b340dc 100644
--- a/v7/mediarouter/res/values-uz-rUZ/strings.xml
+++ b/v7/mediarouter/res/values-uz-rUZ/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Media chiqish"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Qurilmaga ulanish"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Qurilmalar izlanmoqda…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Uzish"</string>
diff --git a/v7/mediarouter/res/values-vi/strings.xml b/v7/mediarouter/res/values-vi/strings.xml
index a58d0e4..9d915cd 100644
--- a/v7/mediarouter/res/values-vi/strings.xml
+++ b/v7/mediarouter/res/values-vi/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Đầu ra phương tiện"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Kết nối với thiết bị"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Đang tìm kiếm thiết bị…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Ngắt kết nối"</string>
diff --git a/v7/mediarouter/res/values-zh-rCN/strings.xml b/v7/mediarouter/res/values-zh-rCN/strings.xml
index 71c4407..63450e5 100644
--- a/v7/mediarouter/res/values-zh-rCN/strings.xml
+++ b/v7/mediarouter/res/values-zh-rCN/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"媒体输出线路"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"连接到设备"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"正在搜索设备…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"断开连接"</string>
diff --git a/v7/mediarouter/res/values-zh-rHK/strings.xml b/v7/mediarouter/res/values-zh-rHK/strings.xml
index f499169..9d41f7c 100644
--- a/v7/mediarouter/res/values-zh-rHK/strings.xml
+++ b/v7/mediarouter/res/values-zh-rHK/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"媒體輸出"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"連線至裝置"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"正在搜尋裝置…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"中斷連線"</string>
diff --git a/v7/mediarouter/res/values-zh-rTW/strings.xml b/v7/mediarouter/res/values-zh-rTW/strings.xml
index a847615..75e31ee 100644
--- a/v7/mediarouter/res/values-zh-rTW/strings.xml
+++ b/v7/mediarouter/res/values-zh-rTW/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"媒體輸出"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"連線至裝置"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"正在搜尋裝置..."</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"中斷連線"</string>
diff --git a/v7/mediarouter/res/values-zu/strings.xml b/v7/mediarouter/res/values-zu/strings.xml
index be195be..0ce7724 100644
--- a/v7/mediarouter/res/values-zu/strings.xml
+++ b/v7/mediarouter/res/values-zu/strings.xml
@@ -18,7 +18,8 @@
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_media_route_button_content_description" msgid="4271159405637008602">"Okukhiphayo kwabezindaba"</string>
+ <!-- no translation found for mr_media_route_button_content_description (8327680881775995150) -->
+ <skip />
<string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Xhumeka kudivayisi"</string>
<string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Iseshela amadivayisi…"</string>
<string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Nqamula"</string>
diff --git a/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java b/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
index 8277d3b..ea20245 100644
--- a/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
+++ b/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
@@ -1250,12 +1250,12 @@
/**
* Consume the available space if:
- * * view is not removed
+ * * view is not removed OR changed
* * OR we are laying out scrap children
* * OR we are not doing pre-layout
*/
- if (!params.isItemRemoved() || mLayoutState.mScrapList != null ||
- !state.isPreLayout()) {
+ if (!(params.isItemRemoved() || params.isItemChanged())
+ || mLayoutState.mScrapList != null || !state.isPreLayout()) {
layoutState.mAvailable -= consumed;
// we keep a separate remaining space because mAvailable is important for recycling
remainingSpace -= consumed;
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
index 7039e97..68ebbca 100644
--- a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
+++ b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
@@ -1930,7 +1930,10 @@
long key = oldChangedHolders.keyAt(i);
ViewHolder oldHolder = oldChangedHolders.get(key);
View oldView = oldHolder.itemView;
- if (!oldHolder.shouldIgnore() &&
+ if (oldHolder.shouldIgnore()) {
+ continue;
+ }
+ if (mRecycler.mChangedScrap != null &&
mRecycler.mChangedScrap.contains(oldHolder)) {
oldHolder.setIsRecyclable(false);
removeDetachedView(oldView, false);
@@ -1948,6 +1951,8 @@
if (mItemAnimator.animateChange(oldHolder, newHolder)) {
postAnimationRunner();
}
+ } else if (DEBUG) {
+ Log.e(TAG, "cannot find old changed holder in changed scrap :/" + oldHolder);
}
}
}
@@ -3015,9 +3020,12 @@
throw new IndexOutOfBoundsException("Inconsistency detected. Invalid view holder "
+ "adapter position" + holder);
}
- final int type = mAdapter.getItemViewType(holder.mPosition);
- if (type != holder.getItemViewType()) {
- return false;
+ if (!mState.isPreLayout()) {
+ // don't check type if it is pre-layout.
+ final int type = mAdapter.getItemViewType(holder.mPosition);
+ if (type != holder.getItemViewType()) {
+ return false;
+ }
}
if (mAdapter.hasStableIds()) {
return holder.getItemId() == mAdapter.getItemId(holder.mPosition);
@@ -3093,25 +3101,31 @@
throw new IndexOutOfBoundsException("Invalid item position " + position
+ "(" + position + "). Item count:" + mState.getItemCount());
}
- ViewHolder holder;
+ ViewHolder holder = null;
+ // 0) If there is a changed scrap, try to find from there
+ if (mState.isPreLayout()) {
+ holder = getChangedScrapViewForPosition(position);
+ }
// 1) Find from scrap by position
- holder = getScrapViewForPosition(position, INVALID_TYPE, dryRun);
- if (holder != null) {
- if (!validateViewHolderForOffsetPosition(holder)) {
- // recycle this scrap
- if (!dryRun) {
- // we would like to recycle this but need to make sure it is not used by
- // animation logic etc.
- holder.addFlags(ViewHolder.FLAG_INVALID);
- if (holder.isScrap()) {
- removeDetachedView(holder.itemView, false);
- holder.unScrap();
- } else if (holder.wasReturnedFromScrap()) {
- holder.clearReturnedFromScrapFlag();
+ if (holder == null) {
+ holder = getScrapViewForPosition(position, INVALID_TYPE, dryRun);
+ if (holder != null) {
+ if (!validateViewHolderForOffsetPosition(holder)) {
+ // recycle this scrap
+ if (!dryRun) {
+ // we would like to recycle this but need to make sure it is not used by
+ // animation logic etc.
+ holder.addFlags(ViewHolder.FLAG_INVALID);
+ if (holder.isScrap()) {
+ removeDetachedView(holder.itemView, false);
+ holder.unScrap();
+ } else if (holder.wasReturnedFromScrap()) {
+ holder.clearReturnedFromScrapFlag();
+ }
+ recycleViewHolder(holder);
}
- recycleViewHolder(holder);
+ holder = null;
}
- holder = null;
}
}
if (holder == null) {
@@ -3173,8 +3187,14 @@
}
}
- if (!holder.isRemoved() && (!holder.isBound() || holder.needsUpdate() ||
- holder.isInvalid())) {
+ if (mState.isPreLayout() && holder.isBound()) {
+ // do not update unless we absolutely have to.
+ holder.mPreLayoutPosition = position;
+ } else if (!holder.isBound() || holder.needsUpdate() || holder.isInvalid()) {
+ if (DEBUG && holder.isRemoved()) {
+ throw new IllegalStateException("Removed holder should be bound and it should"
+ + " come here only in pre-layout. Holder: " + holder);
+ }
final int offsetPosition = mAdapterHelper.findPositionOffset(position);
mAdapter.bindViewHolder(holder, offsetPosition);
if (mState.isPreLayout()) {
@@ -3332,13 +3352,13 @@
*/
void scrapView(View view) {
final ViewHolder holder = getChildViewHolderInt(view);
- if (holder.isInvalid() && !holder.isRemoved() && !mAdapter.hasStableIds()) {
- throw new IllegalArgumentException("Called scrap view with an invalid view."
- + " Invalid views cannot be reused from scrap, they should rebound from"
- + " recycler pool.");
- }
holder.setScrapContainer(this);
if (!holder.isChanged() || !supportsChangeAnimations()) {
+ if (holder.isInvalid() && !holder.isRemoved() && !mAdapter.hasStableIds()) {
+ throw new IllegalArgumentException("Called scrap view with an invalid view."
+ + " Invalid views cannot be reused from scrap, they should rebound from"
+ + " recycler pool.");
+ }
mAttachedScrap.add(holder);
} else {
if (mChangedScrap == null) {
@@ -3376,6 +3396,37 @@
mAttachedScrap.clear();
}
+ ViewHolder getChangedScrapViewForPosition(int position) {
+ // If pre-layout, check the changed scrap for an exact match.
+ final int changedScrapSize;
+ if (mChangedScrap == null || (changedScrapSize = mChangedScrap.size()) == 0) {
+ return null;
+ }
+ // find by position
+ for (int i = 0; i < changedScrapSize; i++) {
+ final ViewHolder holder = mChangedScrap.get(i);
+ if (!holder.wasReturnedFromScrap() && holder.getPosition() == position) {
+ holder.addFlags(ViewHolder.FLAG_RETURNED_FROM_SCRAP);
+ return holder;
+ }
+ }
+ // find by id
+ if (mAdapter.hasStableIds()) {
+ final int offsetPosition = mAdapterHelper.findPositionOffset(position);
+ if (offsetPosition > 0 && offsetPosition < mAdapter.getItemCount()) {
+ final long id = mAdapter.getItemId(offsetPosition);
+ for (int i = 0; i < changedScrapSize; i++) {
+ final ViewHolder holder = mChangedScrap.get(i);
+ if (!holder.wasReturnedFromScrap() && holder.getItemId() == id) {
+ holder.addFlags(ViewHolder.FLAG_RETURNED_FROM_SCRAP);
+ return holder;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
/**
* Returns a scrap view for the position. If type is not INVALID_TYPE, it also checks if
* ViewHolder's type matches the provided type.
@@ -4974,7 +5025,7 @@
}
return;
}
- if (viewHolder.isInvalid() && !viewHolder.isRemoved() &&
+ if (viewHolder.isInvalid() && !viewHolder.isRemoved() && !viewHolder.isChanged() &&
!mRecyclerView.mAdapter.hasStableIds()) {
removeViewAt(index);
recycler.recycleView(view);
@@ -6241,6 +6292,17 @@
}
/**
+ * Returns true if the adapter data item corresponding to the view this LayoutParams
+ * is attached to has been changed in the data set. A LayoutManager may choose to
+ * treat it differently in order to animate its changing state.
+ *
+ * @return true if the item the view corresponds to was changed in the data set
+ */
+ public boolean isItemChanged() {
+ return mViewHolder.isChanged();
+ }
+
+ /**
* Returns the position that the view this LayoutParams is attached to corresponds to.
*
* @return the adapter position this view was bound from
diff --git a/v7/recyclerview/src/android/support/v7/widget/StaggeredGridLayoutManager.java b/v7/recyclerview/src/android/support/v7/widget/StaggeredGridLayoutManager.java
index ed67ae8..cece24e 100644
--- a/v7/recyclerview/src/android/support/v7/widget/StaggeredGridLayoutManager.java
+++ b/v7/recyclerview/src/android/support/v7/widget/StaggeredGridLayoutManager.java
@@ -1756,7 +1756,7 @@
if (mViews.size() == 1) {
mCachedEnd = INVALID_LINE;
}
- if (lp.isItemRemoved()) {
+ if (lp.isItemRemoved() || lp.isItemChanged()) {
mDeletedSize += mPrimaryOrientation.getDecoratedMeasurement(view);
}
}
@@ -1769,7 +1769,7 @@
if (mViews.size() == 1) {
mCachedStart = INVALID_LINE;
}
- if (lp.isItemRemoved()) {
+ if (lp.isItemRemoved() || lp.isItemChanged()) {
mDeletedSize += mPrimaryOrientation.getDecoratedMeasurement(view);
}
}
@@ -1812,7 +1812,7 @@
View end = mViews.remove(size - 1);
final LayoutParams lp = getLayoutParams(end);
lp.mSpan = null;
- if (lp.isItemRemoved()) {
+ if (lp.isItemRemoved() || lp.isItemChanged()) {
mDeletedSize -= mPrimaryOrientation.getDecoratedMeasurement(end);
}
if (size == 1) {
@@ -1828,7 +1828,7 @@
if (mViews.size() == 0) {
mCachedEnd = INVALID_LINE;
}
- if (lp.isItemRemoved()) {
+ if (lp.isItemRemoved() || lp.isItemChanged()) {
mDeletedSize -= mPrimaryOrientation.getDecoratedMeasurement(start);
}
mCachedStart = INVALID_LINE;
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
index bf2fa52..0432264 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewAnimationsTest.java
@@ -90,6 +90,113 @@
return recyclerView;
}
+ public void testChangeAnimations() throws Throwable {
+ final boolean[] booleans = {true, false};
+ for (boolean supportsChange : booleans) {
+ for (boolean changeType : booleans) {
+ for (boolean hasStableIds : booleans) {
+ for (boolean deleteSomeItems : booleans) {
+ changeAnimTest(supportsChange, changeType, hasStableIds, deleteSomeItems);
+ }
+ removeRecyclerView();
+ }
+ }
+ }
+ }
+ public void changeAnimTest(final boolean supportsChangeAnim, final boolean changeType,
+ final boolean hasStableIds, final boolean deleteSomeItems) throws Throwable {
+ final int changedIndex = 3;
+ final int defaultType = 1;
+ final AtomicInteger changedIndexNewType = new AtomicInteger(defaultType);
+ final String logPrefix = "supportsChangeAnim:" + supportsChangeAnim +
+ ", change view type:" + changeType +
+ ", has stable ids:" + hasStableIds +
+ ", force predictive:" + deleteSomeItems;
+ TestAdapter testAdapter = new TestAdapter(10) {
+ @Override
+ public int getItemViewType(int position) {
+ return position == changedIndex ? changedIndexNewType.get() : defaultType;
+ }
+
+ @Override
+ public TestViewHolder onCreateViewHolder(ViewGroup parent,
+ int viewType) {
+ TestViewHolder vh = super.onCreateViewHolder(parent, viewType);
+ if (DEBUG) {
+ Log.d(TAG, logPrefix + " onCreateVH" + vh.toString());
+ }
+ return vh;
+ }
+
+ @Override
+ public void onBindViewHolder(TestViewHolder holder,
+ int position) {
+ super.onBindViewHolder(holder, position);
+ if (DEBUG) {
+ Log.d(TAG, logPrefix + " onBind to " + position + "" + holder.toString());
+ }
+ }
+ };
+ testAdapter.setHasStableIds(hasStableIds);
+ setupBasic(testAdapter.getItemCount(), 0, 10, testAdapter);
+ mRecyclerView.getItemAnimator().setSupportsChangeAnimations(supportsChangeAnim);
+
+ final RecyclerView.ViewHolder toBeChangedVH =
+ mRecyclerView.findViewHolderForPosition(changedIndex);
+ mLayoutManager.mOnLayoutCallbacks = new OnLayoutCallbacks() {
+ @Override
+ void afterPreLayout(RecyclerView.Recycler recycler,
+ AnimationLayoutManager layoutManager,
+ RecyclerView.State state) {
+ RecyclerView.ViewHolder vh = mRecyclerView.findViewHolderForPosition(changedIndex);
+ if (supportsChangeAnim) {
+ assertTrue(logPrefix + " changed view holder should have correct flag"
+ , vh.isChanged());
+ } else {
+ assertFalse(logPrefix + " changed view holder should have correct flag"
+ , vh.isChanged());
+ }
+ }
+
+ @Override
+ void afterPostLayout(RecyclerView.Recycler recycler,
+ AnimationLayoutManager layoutManager, RecyclerView.State state) {
+ RecyclerView.ViewHolder vh = mRecyclerView.findViewHolderForPosition(changedIndex);
+ assertFalse(logPrefix + "VH should not be marked as changed", vh.isChanged());
+ if (supportsChangeAnim) {
+ assertNotSame(logPrefix + "a new VH should be given if change is supported",
+ toBeChangedVH, vh);
+ } else if (!changeType && hasStableIds) {
+ assertSame(logPrefix + "if change animations are not supported but we have "
+ + "stable ids, same view holder should be returned", toBeChangedVH, vh);
+ }
+ super.beforePostLayout(recycler, layoutManager, state);
+ }
+ };
+ mLayoutManager.expectLayouts(1);
+ if (changeType) {
+ changedIndexNewType.set(defaultType + 1);
+ }
+ if (deleteSomeItems) {
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ mTestAdapter.deleteAndNotify(changedIndex + 2, 1);
+ mTestAdapter.notifyItemChanged(3);
+ } catch (Throwable throwable) {
+ throwable.printStackTrace();
+ }
+
+ }
+ });
+ } else {
+ mTestAdapter.notifyItemChanged(3);
+ }
+
+ mLayoutManager.waitForLayout(2);
+ }
+
public void testRecycleDuringAnimations() throws Throwable {
final AtomicInteger childCount = new AtomicInteger(0);
final TestAdapter adapter = new TestAdapter(1000) {