Merge "AppBarLayout fixes" into mnc-ub-dev
diff --git a/v17/preference-leanback/res/layout/leanback_list_preference_fragment.xml b/v17/preference-leanback/res/layout/leanback_list_preference_fragment.xml
index 2a4218b..f073f3e 100644
--- a/v17/preference-leanback/res/layout/leanback_list_preference_fragment.xml
+++ b/v17/preference-leanback/res/layout/leanback_list_preference_fragment.xml
@@ -20,6 +20,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/lb_preference_decor_list_background"
+    android:elevation="@dimen/lb_preference_decor_elevation"
     android:orientation="vertical"
     android:transitionGroup="false"
     >
@@ -29,6 +30,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:background="?attr/defaultBrandColor"
+        android:elevation="@dimen/lb_preference_decor_title_container_elevation"
         android:transitionGroup="false"
         >
         <TextView
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
index 547daa7d..b7ee5ab 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
@@ -16,8 +16,6 @@
 
 package android.support.v7.app;
 
-import static android.widget.SeekBar.OnSeekBarChangeListener;
-
 import android.app.PendingIntent;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -65,7 +63,9 @@
 
 import java.io.BufferedInputStream;
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * This class implements the route controller dialog for {@link MediaRouter}.
@@ -82,9 +82,7 @@
     // Time to wait before updating the volume when the user lets go of the seek bar
     // to allow the route provider time to propagate the change and publish a new
     // route descriptor.
-    private static final int VOLUME_UPDATE_DELAY_MILLIS = 250;
-    private static final int VOLUME_SLIDER_TAG_MASTER = 0;
-    private static final int VOLUME_SLIDER_TAG_GROUP_BASE = 100;
+    private static final int VOLUME_UPDATE_DELAY_MILLIS = 500;
 
     private static final int BUTTON_NEUTRAL_RES_ID = android.R.id.button3;
     private static final int BUTTON_DISCONNECT_RES_ID = android.R.id.button2;
@@ -127,11 +125,12 @@
     private ListView mVolumeGroupList;
     private SeekBar mVolumeSlider;
     private VolumeChangeListener mVolumeChangeListener;
-    private boolean mVolumeSliderTouched;
+    private MediaRouter.RouteInfo mRouteInVolumeSliderTouched;
     private int mVolumeGroupListItemIconSize;
     private int mVolumeGroupListItemHeight;
     private int mVolumeGroupListMaxHeight;
     private final int mVolumeGroupListPaddingTop;
+    private Map<MediaRouter.RouteInfo, SeekBar> mVolumeSliderMap;
 
     private MediaControllerCompat mMediaController;
     private MediaControllerCallback mControllerCallback;
@@ -340,8 +339,9 @@
         mPlayPauseButton.setOnClickListener(listener);
 
         mVolumeControlLayout = (LinearLayout) findViewById(R.id.mr_volume_control);
+        mVolumeControlLayout.setVisibility(View.GONE);
         mVolumeSlider = (SeekBar) findViewById(R.id.mr_volume_slider);
-        mVolumeSlider.setTag(VOLUME_SLIDER_TAG_MASTER);
+        mVolumeSlider.setTag(mRoute);
         mVolumeChangeListener = new VolumeChangeListener();
         mVolumeSlider.setOnSeekBarChangeListener(mVolumeChangeListener);
 
@@ -350,6 +350,8 @@
                 mMediaMainControlLayout, mVolumeGroupList, getGroup() != null);
         MediaRouterThemeHelper.setVolumeSliderColor(mContext,
                 (MediaRouteVolumeSlider) mVolumeSlider, mMediaMainControlLayout);
+        mVolumeSliderMap = new HashMap<>();
+        mVolumeSliderMap.put(mRoute, mVolumeSlider);
 
         mGroupExpandCollapseButton =
                 (MediaRouteExpandCollapseButton) findViewById(R.id.mr_group_expand_collapse);
@@ -655,8 +657,8 @@
     }
 
     private void updateVolumeControlLayout() {
-        if (!mVolumeSliderTouched) {
-            if (isVolumeControlAvailable(mRoute)) {
+        if (isVolumeControlAvailable(mRoute)) {
+            if (mVolumeControlLayout.getVisibility() == View.GONE) {
                 mVolumeControlLayout.setVisibility(View.VISIBLE);
                 mVolumeSlider.setMax(mRoute.getVolumeMax());
                 mVolumeSlider.setProgress(mRoute.getVolume());
@@ -667,31 +669,14 @@
                     VolumeGroupAdapter adapter =
                             (VolumeGroupAdapter) mVolumeGroupList.getAdapter();
                     if (adapter != null) {
-                       adapter.notifyDataSetChanged();
-                    }
-                }
-            } else {
-                mVolumeControlLayout.setVisibility(View.GONE);
-            }
-            updateLayoutHeight();
-        } else if (mVolumeControlLayout.getVisibility() == View.VISIBLE) {
-            mVolumeSlider.setProgress(mRoute.getVolume());
-            if (mIsGroupExpanded) {
-                for (int i = 0; i < mVolumeGroupList.getChildCount(); ++i) {
-                    SeekBar volumeSlider = (SeekBar) mVolumeGroupList.getChildAt(i)
-                            .findViewById(R.id.mr_volume_slider);
-                    int tag = (int) volumeSlider.getTag();
-                    int index = tag - VOLUME_SLIDER_TAG_GROUP_BASE;
-                    if (index < 0 || index >= getGroup().getRouteCount()) {
-                        continue;
-                    }
-                    MediaRouter.RouteInfo route = getGroup().getRouteAt(index);
-                    if (isVolumeControlAvailable(route)) {
-                        volumeSlider.setProgress(route.getVolume());
+                        adapter.notifyDataSetChanged();
                     }
                 }
             }
+        } else {
+            mVolumeControlLayout.setVisibility(View.GONE);
         }
+        updateLayoutHeight();
     }
 
     private void updatePlaybackControlLayout() {
@@ -774,16 +759,6 @@
         view.setLayoutParams(lp);
     }
 
-    private static int getLayoutBottomMargin(View view) {
-        return ((ViewGroup.MarginLayoutParams) view.getLayoutParams()).bottomMargin;
-    }
-
-    private static void setLayoutBottomMargin(View view, int bottomMargin) {
-        ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
-        params.bottomMargin = bottomMargin;
-        view.setLayoutParams(params);
-    }
-
     /**
      * Returns desired art height to fit into controller dialog.
      */
@@ -809,8 +784,9 @@
 
         @Override
         public void onRouteVolumeChanged(MediaRouter router, MediaRouter.RouteInfo route) {
-            if (route == mRoute) {
-                updateVolumeControlLayout();
+            SeekBar volumeSlider = mVolumeSliderMap.get(route);
+            if (volumeSlider != null && mRouteInVolumeSliderTouched != route) {
+                volumeSlider.setProgress(route.getVolume());
             }
         }
     }
@@ -874,24 +850,24 @@
         }
     }
 
-    private class VolumeChangeListener implements OnSeekBarChangeListener {
+    private class VolumeChangeListener implements SeekBar.OnSeekBarChangeListener {
         private final Runnable mStopTrackingTouch = new Runnable() {
             @Override
             public void run() {
-                if (mVolumeSliderTouched) {
-                    mVolumeSliderTouched = false;
-                    updateVolumeControlLayout();
+                if (mRouteInVolumeSliderTouched != null) {
+                    SeekBar volumeSlider = mVolumeSliderMap.get(mRouteInVolumeSliderTouched);
+                    volumeSlider.setProgress(mRouteInVolumeSliderTouched.getVolume());
+                    mRouteInVolumeSliderTouched = null;
                 }
             }
         };
 
         @Override
         public void onStartTrackingTouch(SeekBar seekBar) {
-            if (mVolumeSliderTouched) {
+            if (mRouteInVolumeSliderTouched != null) {
                 mVolumeSlider.removeCallbacks(mStopTrackingTouch);
-            } else {
-                mVolumeSliderTouched = true;
             }
+            mRouteInVolumeSliderTouched = (MediaRouter.RouteInfo) seekBar.getTag();
         }
 
         @Override
@@ -905,14 +881,9 @@
         @Override
         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
             if (fromUser) {
-                int tag = (int) seekBar.getTag();
-                if (tag == VOLUME_SLIDER_TAG_MASTER) {
-                    mRoute.requestSetVolume(progress);
-                } else {
-                    int index = tag - VOLUME_SLIDER_TAG_GROUP_BASE;
-                    if (index >= 0 && index < getGroup().getRouteCount()) {
-                        getGroup().getRouteAt(index).requestSetVolume(progress);
-                    }
+                MediaRouter.RouteInfo route = (MediaRouter.RouteInfo) seekBar.getTag();
+                if (route.getVolume() != progress) {
+                    route.requestSetVolume(progress);
                 }
             }
         }
@@ -948,7 +919,8 @@
                         (MediaRouteVolumeSlider) v.findViewById(R.id.mr_volume_slider);
                 MediaRouterThemeHelper.setVolumeSliderColor(
                         mContext, volumeSlider, mVolumeGroupList);
-                volumeSlider.setTag(VOLUME_SLIDER_TAG_GROUP_BASE + position);
+                volumeSlider.setTag(route);
+                mVolumeSliderMap.put(route, volumeSlider);
                 volumeSlider.setHideThumb(!isEnabled);
                 volumeSlider.setEnabled(isEnabled);
                 if (isEnabled) {