From ca894a0f53ba71cb8bcb197c2cd39aeb7b73e72d Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Tue, 12 Jan 2016 15:30:22 -0500 Subject: [PATCH] Make QS only have one Host and Tiles Finish previous work to only have one set of tiles so that updates can be easily propogated from custom tiles to the UI. Change-Id: Id5e13774f825b78d3c9e50c2d9f8ea1710b2e77b --- .../src/com/android/systemui/qs/QSPanel.java | 8 +++- .../src/com/android/systemui/qs/QSTile.java | 42 ++++++++++--------- .../com/android/systemui/qs/QuickQSPanel.java | 10 +---- .../systemui/qs/customize/CustomQSPanel.java | 5 +++ .../systemui/statusbar/phone/QSTileHost.java | 11 +++++ .../statusbar/phone/QuickStatusBarHeader.java | 19 +++------ 6 files changed, 54 insertions(+), 41 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 91f88b9b67365..fd07e50c18a62 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -329,16 +329,19 @@ public class QSPanel extends FrameLayout implements Tunable { drawTile(r, state); } } + @Override public void onShowDetail(boolean show) { QSPanel.this.showDetail(show, r); } + @Override public void onToggleStateChanged(boolean state) { if (mDetailRecord == r) { fireToggleStateChanged(state); } } + @Override public void onScanStateChanged(boolean state) { r.scanState = state; @@ -352,7 +355,7 @@ public class QSPanel extends FrameLayout implements Tunable { announceForAccessibility(announcement); } }; - r.tile.setCallback(callback); + r.tile.addCallback(callback); final View.OnClickListener click = new View.OnClickListener() { @Override public void onClick(View v) { @@ -415,6 +418,9 @@ public class QSPanel extends FrameLayout implements Tunable { } protected void handleShowDetail(Record r, boolean show) { + if (show && !mExpanded) { + mHost.animateExpandQS(); + } if (r instanceof TileRecord) { handleShowDetailTile((TileRecord) r, show); } else { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java index 8ce6da2eede9b..2d9d10595b3a6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java @@ -43,6 +43,7 @@ import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.ZenModeController; +import java.util.ArrayList; import java.util.Collection; import java.util.Objects; @@ -62,7 +63,7 @@ public abstract class QSTile implements Listenable { protected final H mHandler; protected final Handler mUiHandler = new Handler(Looper.getMainLooper()); - private Callback mCallback; + private final ArrayList mCallbacks = new ArrayList<>(); protected TState mState = newTileState(); private TState mTmpState = newTileState(); private boolean mAnnounceNextStateChange; @@ -119,8 +120,8 @@ public abstract class QSTile implements Listenable { // safe to call from any thread - public void setCallback(Callback callback) { - mHandler.obtainMessage(H.SET_CALLBACK, callback).sendToTarget(); + public void addCallback(Callback callback) { + mHandler.obtainMessage(H.ADD_CALLBACK, callback).sendToTarget(); } public void click() { @@ -177,8 +178,8 @@ public abstract class QSTile implements Listenable { // call only on tile worker looper - private void handleSetCallback(Callback callback) { - mCallback = callback; + private void handleAddCallback(Callback callback) { + mCallbacks.add(callback); handleRefreshState(null); } @@ -206,12 +207,14 @@ public abstract class QSTile implements Listenable { private void handleStateChanged() { boolean delayAnnouncement = shouldAnnouncementBeDelayed(); - if (mCallback != null) { - mCallback.onStateChanged(mState); + if (mCallbacks.size() != 0) { + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).onStateChanged(mState); + } if (mAnnounceNextStateChange && !delayAnnouncement) { String announcement = composeChangeAnnouncement(); if (announcement != null) { - mCallback.onAnnouncementRequested(announcement); + mCallbacks.get(0).onAnnouncementRequested(announcement); } } } @@ -227,20 +230,20 @@ public abstract class QSTile implements Listenable { } private void handleShowDetail(boolean show) { - if (mCallback != null) { - mCallback.onShowDetail(show); + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).onShowDetail(show); } } private void handleToggleStateChanged(boolean state) { - if (mCallback != null) { - mCallback.onToggleStateChanged(state); + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).onToggleStateChanged(state); } } private void handleScanStateChanged(boolean state) { - if (mCallback != null) { - mCallback.onScanStateChanged(state); + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).onScanStateChanged(state); } } @@ -250,11 +253,11 @@ public abstract class QSTile implements Listenable { protected void handleDestroy() { setListening(false); - mCallback = null; + mCallbacks.clear(); } protected final class H extends Handler { - private static final int SET_CALLBACK = 1; + private static final int ADD_CALLBACK = 1; private static final int CLICK = 2; private static final int SECONDARY_CLICK = 3; private static final int LONG_CLICK = 4; @@ -274,9 +277,9 @@ public abstract class QSTile implements Listenable { public void handleMessage(Message msg) { String name = null; try { - if (msg.what == SET_CALLBACK) { - name = "handleSetCallback"; - handleSetCallback((QSTile.Callback)msg.obj); + if (msg.what == ADD_CALLBACK) { + name = "handleAddCallback"; + handleAddCallback((QSTile.Callback)msg.obj); } else if (msg.what == CLICK) { name = "handleClick"; mAnnounceNextStateChange = true; @@ -333,6 +336,7 @@ public abstract class QSTile implements Listenable { void startRunnableDismissingKeyguard(Runnable runnable); void warn(String message, Throwable t); void collapsePanels(); + void animateExpandQS(); void openPanels(); Looper getLooper(); Context getContext(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index 5fa38c6e03049..5782800198306 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -60,14 +60,8 @@ public class QuickQSPanel extends QSPanel { } @Override - protected void handleShowDetail(QSPanel.Record r, boolean show) { - if (show) { - mHeader.performClick(); - mFullPanel.showDetail(show, r); - } else { - // Not sure how we would end up here... - super.handleShowDetail(r, show); - } + protected void showDetail(boolean show, Record r) { + // Do nothing, will be handled by the QSPanel. } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomQSPanel.java index 7448493b4880a..eab4dca16573d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomQSPanel.java @@ -68,6 +68,11 @@ public class CustomQSPanel extends QSPanel { TunerService.get(mContext).addTunable(this, QSTileHost.TILES_SETTING); } + @Override + protected void showDetail(boolean show, Record r) { + // No detail here. + } + @Override protected void onDetachedFromWindow() { // Don't allow the super to unregister the tunable. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java index 336b208cb50b8..29ad5d1cec3b9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java @@ -27,6 +27,7 @@ import android.os.Process; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; +import android.view.View; import com.android.systemui.R; import com.android.systemui.qs.QSTile; import com.android.systemui.qs.external.CustomTile; @@ -99,6 +100,7 @@ public final class QSTileHost implements QSTile.Host, Tunable { private final TileServices mServices; private final List mCallbacks = new ArrayList<>(); + private View mHeader; public QSTileHost(Context context, PhoneStatusBar statusBar, BluetoothController bluetooth, LocationController location, @@ -135,6 +137,10 @@ public final class QSTileHost implements QSTile.Host, Tunable { TunerService.get(mContext).addTunable(this, TILES_SETTING); } + public void setHeaderView(View view) { + mHeader = view; + } + public PhoneStatusBar getPhoneStatusBar() { return mStatusBar; } @@ -173,6 +179,11 @@ public final class QSTileHost implements QSTile.Host, Tunable { // already logged } + public void animateExpandQS() { + // TODO: Better path to animated panel expansion. + mHeader.performClick(); + } + @Override public void collapsePanels() { mStatusBar.postAnimateCollapsePanels(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java index 3692aeeb20c5a..5b44f0a4189f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java @@ -197,23 +197,16 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements } } - public void setupHost(QSTileHost host) { - final QSTileHost myHost = new QSTileHost(host.getContext(), host.getPhoneStatusBar(), - host.getBluetoothController(), host.getLocationController(), - host.getRotationLockController(), host.getNetworkController(), - host.getZenModeController(), host.getHotspotController(), - host.getCastController(), host.getFlashlightController(), - host.getUserSwitcherController(), host.getUserInfoController(), - host.getKeyguardMonitor(), host.getSecurityController(), - host.getBatteryController(), host.getIconController()); + public void setupHost(final QSTileHost host) { + host.setHeaderView(this); mHeaderQsPanel.setQSPanelAndHeader(mQsPanel, this); - mHeaderQsPanel.setHost(myHost); + mHeaderQsPanel.setHost(host); mHeaderQsPanel.setMaxTiles(5); - mHeaderQsPanel.setTiles(myHost.getTiles()); - myHost.addCallback(new QSTile.Host.Callback() { + mHeaderQsPanel.setTiles(host.getTiles()); + host.addCallback(new QSTile.Host.Callback() { @Override public void onTilesChanged() { - mHeaderQsPanel.setTiles(myHost.getTiles()); + mHeaderQsPanel.setTiles(host.getTiles()); } }); }