diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java index 8d6e17e2622b8..d5fb8f2496982 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java @@ -178,6 +178,7 @@ public class QSContainer extends FrameLayout { private void updateQsState() { boolean expandVisually = mQsExpanded || mStackScrollerOverscrolling || mHeaderAnimating; mQSPanel.setExpanded(mQsExpanded); + mQSDetail.setExpanded(mQsExpanded); mHeader.setVisibility((mQsExpanded || !mKeyguardShowing || mHeaderAnimating) ? View.VISIBLE : View.INVISIBLE); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java index 0cf7e4793941f..a40e5b7789c60 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java @@ -31,6 +31,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Switch; import android.widget.TextView; + import com.android.internal.logging.MetricsLogger; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; @@ -64,6 +65,9 @@ public class QSDetail extends LinearLayout { private boolean mFullyExpanded; private View mQsDetailHeaderBack; private BaseStatusBarHeader mHeader; + private boolean mTriggeredExpand; + private int mOpenX; + private int mOpenY; public QSDetail(Context context, @Nullable AttributeSet attrs) { super(context, attrs); @@ -112,6 +116,7 @@ public class QSDetail extends LinearLayout { public void setQsPanel(QSPanel panel, BaseStatusBarHeader header) { mQsPanel = panel; mHeader = header; + mHeader.setCallback(mQsPanelCallback); mQsPanel.setCallback(mQsPanelCallback); } @@ -126,6 +131,12 @@ public class QSDetail extends LinearLayout { mFullyExpanded = fullyExpanded; } + public void setExpanded(boolean qsExpanded) { + if (!qsExpanded) { + mTriggeredExpand = false; + } + } + private void updateDetailText() { mDetailDoneButton.setText(R.string.quick_settings_done); mDetailSettingsButton.setText(R.string.quick_settings_more_settings); @@ -161,6 +172,22 @@ public class QSDetail extends LinearLayout { } }); } + if (!mFullyExpanded) { + mTriggeredExpand = true; + mHost.animateToggleQSExpansion(); + } else { + mTriggeredExpand = false; + } + mOpenX = x; + mOpenY = y; + } else { + // Ensure we collapse into the same point we opened from. + x = mOpenX; + y = mOpenY; + if (mTriggeredExpand) { + mHost.animateToggleQSExpansion(); + mTriggeredExpand = false; + } } boolean visibleDiff = (mDetailAdapter != null) != (adapter != null); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 6945176be7d38..2c874e5ed48ba 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -23,6 +23,7 @@ import android.content.res.Resources; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; @@ -56,7 +57,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { private int mPanelPaddingBottom; private int mBrightnessPaddingTop; - private boolean mExpanded; + protected boolean mExpanded; protected boolean mListening; private Callback mCallback; @@ -70,7 +71,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { private QSCustomizer mCustomizePanel; private Record mDetailRecord; - private boolean mTriggeredExpand; public QSPanel(Context context) { this(context, null); @@ -221,7 +221,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { } MetricsLogger.visibility(mContext, MetricsEvent.QS_PANEL, mExpanded); if (!mExpanded) { - mTriggeredExpand = false; closeDetail(); } else { logTiles(); @@ -279,6 +278,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { public void setTiles(Collection> tiles, boolean collapsedView) { for (TileRecord record : mRecords) { mTileLayout.removeTile(record); + record.tile.removeCallback(record.callback); } mRecords.clear(); for (QSTile tile : tiles) { @@ -294,6 +294,10 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { return new QSTileView(mContext, tile.createTileView(mContext), collapsedView); } + protected boolean shouldShowDetail() { + return mExpanded; + } + protected void addTile(final QSTile tile, boolean collapsedView) { final TileRecord r = new TileRecord(); r.tile = tile; @@ -306,7 +310,11 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { @Override public void onShowDetail(boolean show) { - QSPanel.this.showDetail(show, r); + // Both the collapsed and full QS panels get this callback, this check determines + // which one should handle showing the detail. + if (shouldShowDetail()) { + QSPanel.this.showDetail(show, r); + } } @Override @@ -330,6 +338,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { } }; r.tile.addCallback(callback); + r.callback = callback; final View.OnClickListener click = new View.OnClickListener() { @Override public void onClick(View v) { @@ -390,17 +399,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { } protected void handleShowDetail(Record r, boolean show) { - if (show) { - if (!mExpanded) { - mTriggeredExpand = true; - mHost.animateToggleQSExpansion(); - } else { - mTriggeredExpand = false; - } - } else if (mTriggeredExpand) { - mHost.animateToggleQSExpansion(); - mTriggeredExpand = false; - } if (r instanceof TileRecord) { handleShowDetailTile((TileRecord) r, show); } else { @@ -520,6 +518,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { public QSTile tile; public QSTileBaseView tileView; public boolean scanState; + public QSTile.Callback callback; } public interface Callback { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java index 8d9f23fb9242a..974de0804f644 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java @@ -161,6 +161,10 @@ public abstract class QSTile { mHandler.obtainMessage(H.ADD_CALLBACK, callback).sendToTarget(); } + public void removeCallback(Callback callback) { + mHandler.obtainMessage(H.REMOVE_CALLBACK, callback).sendToTarget(); + } + public void removeCallbacks() { mHandler.sendEmptyMessage(H.REMOVE_CALLBACKS); } @@ -224,6 +228,10 @@ public abstract class QSTile { handleRefreshState(null); } + private void handleRemoveCallback(Callback callback) { + mCallbacks.remove(callback); + } + private void handleRemoveCallbacks() { mCallbacks.clear(); } @@ -334,7 +342,8 @@ public abstract class QSTile { private static final int DESTROY = 10; private static final int CLEAR_STATE = 11; private static final int REMOVE_CALLBACKS = 12; - private static final int SET_LISTENING = 13; + private static final int REMOVE_CALLBACK = 13; + private static final int SET_LISTENING = 14; private H(Looper looper) { super(looper); @@ -350,6 +359,9 @@ public abstract class QSTile { } else if (msg.what == REMOVE_CALLBACKS) { name = "handleRemoveCallbacks"; handleRemoveCallbacks(); + } else if (msg.what == REMOVE_CALLBACK) { + name = "handleRemoveCallback"; + handleRemoveCallback((QSTile.Callback) msg.obj); } else if (msg.what == CLICK) { name = "handleClick"; if (mState.disabledByPolicy) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index b28d0f200e2a1..c984abe1b8e00 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -76,6 +76,11 @@ public class QuickQSPanel extends QSPanel { mHeader = header; } + @Override + protected boolean shouldShowDetail() { + return !mExpanded; + } + @Override protected void drawTile(TileRecord r, State state) { if (state instanceof SignalState) { @@ -89,11 +94,6 @@ public class QuickQSPanel extends QSPanel { super.drawTile(r, state); } - @Override - protected void showDetail(boolean show, Record r) { - // Do nothing, will be handled by the QSPanel. - } - @Override protected QSTileBaseView createTileView(QSTile tile, boolean collapsedView) { return new QSTileBaseView(mContext, tile.createTileView(mContext), collapsedView); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java index 6e1c862ebd739..79eef43d4e2ed 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java @@ -20,6 +20,7 @@ import android.content.Context; import android.util.AttributeSet; import android.widget.RelativeLayout; import com.android.systemui.qs.QSPanel; +import com.android.systemui.qs.QSPanel.Callback; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.NetworkControllerImpl; import com.android.systemui.statusbar.policy.NextAlarmController; @@ -44,4 +45,5 @@ public abstract class BaseStatusBarHeader extends RelativeLayout implements public abstract void setBatteryController(BatteryController batteryController); public abstract void setNextAlarmController(NextAlarmController nextAlarmController); public abstract void setUserInfoController(UserInfoController userInfoController); + public abstract void setCallback(Callback qsPanelCallback); } 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 8360544a218bc..e091d6dc51952 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java @@ -38,6 +38,7 @@ import com.android.systemui.FontSizeUtils; import com.android.systemui.R; import com.android.systemui.qs.QSAnimator; import com.android.systemui.qs.QSPanel; +import com.android.systemui.qs.QSPanel.Callback; import com.android.systemui.qs.QuickQSPanel; import com.android.systemui.qs.TouchAnimator; import com.android.systemui.statusbar.policy.BatteryController; @@ -222,6 +223,7 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements @Override public void setExpanded(boolean expanded) { mExpanded = expanded; + mHeaderQsPanel.setExpanded(expanded); updateEverything(); } @@ -392,6 +394,11 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements userInfoController.addListener(this); } + @Override + public void setCallback(Callback qsPanelCallback) { + mHeaderQsPanel.setCallback(qsPanelCallback); + } + @Override public void setEmergencyCallsOnly(boolean show) { boolean changed = show != mShowEmergencyCallsOnly; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java index a051973efddae..72eafd84789cb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java @@ -44,6 +44,7 @@ import com.android.systemui.BatteryMeterView; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; import com.android.systemui.qs.QSPanel; +import com.android.systemui.qs.QSPanel.Callback; import com.android.systemui.qs.QSTile; import com.android.systemui.qs.QSTile.DetailAdapter; import com.android.systemui.statusbar.policy.BatteryController; @@ -510,6 +511,10 @@ public class StatusBarHeaderView extends BaseStatusBarHeader implements View.OnC }); } + @Override + public void setCallback(Callback qsPanelCallback) { + } + @Override public void onClick(View v) { if (v == mSettingsButton) {