QS: Fix some QS layout issues.

- Make the tile list configurable for testing.
- Support an external tile backed by a sticky broadcast intent.
- Ensure tiles clean up properly when no longer needed.

Bug:16818269
Bug:16822505
Change-Id: Ie24f878aae0d19c7f1feca4c519d10667023bef3
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 3679b4c..cbf6e29 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -37,6 +37,7 @@
 import com.android.systemui.statusbar.phone.QSTileHost;
 
 import java.util.ArrayList;
+import java.util.Collection;
 
 /** View that represents the quick settings tile panel. **/
 public class QSPanel extends ViewGroup {
@@ -186,12 +187,25 @@
         v.setVisibility(visible ? VISIBLE : GONE);
     }
 
-    public void addTile(final QSTile<?> tile) {
+    public void setTiles(Collection<QSTile<?>> tiles) {
+        for (TileRecord record : mRecords) {
+            removeView(record.tileView);
+        }
+        mRecords.clear();
+        for (QSTile<?> tile : tiles) {
+            addTile(tile);
+        }
+        if (isShowingDetail()) {
+            mDetail.bringToFront();
+        }
+    }
+
+    private void addTile(final QSTile<?> tile) {
         final TileRecord r = new TileRecord();
         r.tile = tile;
         r.tileView = tile.createTileView(mContext);
         r.tileView.setVisibility(View.GONE);
-        r.tile.setCallback(new QSTile.Callback() {
+        final QSTile.Callback callback = new QSTile.Callback() {
             @Override
             public void onStateChanged(QSTile.State state) {
                 setTileVisibility(r.tileView, state.visible);
@@ -213,7 +227,8 @@
                     fireScanStateChanged(state);
                 }
             }
-        });
+        };
+        r.tile.setCallback(callback);
         final View.OnClickListener click = new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -227,6 +242,8 @@
             }
         };
         r.tileView.init(click, clickSecondary);
+        r.tile.setListening(mListening);
+        callback.onStateChanged(r.tile.getState());
         r.tile.refreshState();
         mRecords.add(r);