Loading packages/SystemUI/res/layout/qs_detail_header.xml +17 −4 Original line number Diff line number Diff line Loading @@ -18,16 +18,19 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="@dimen/qs_detail_header_padding" android:paddingTop="@dimen/qs_detail_header_padding" android:paddingBottom="@dimen/qs_detail_header_bottom_padding" android:paddingEnd="@dimen/qs_panel_padding" android:background="@drawable/btn_borderless_rect" android:gravity="center"> <ImageView android:id="@*android:id/up" android:layout_width="56dp" android:layout_height="56dp" android:layout_marginEnd="16dp" android:padding="16dp" android:layout_width="@dimen/qs_detail_image_width" android:layout_height="@dimen/qs_detail_image_height" android:layout_marginEnd="@dimen/qs_detail_back_margin_end" android:padding="@dimen/qs_detail_image_padding" android:clickable="true" android:background="?android:attr/selectableItemBackground" android:contentDescription="@*android:string/action_bar_up_description" Loading @@ -35,11 +38,21 @@ <TextView android:id="@android:id/title" android:paddingLeft="@dimen/qs_detail_header_text_padding" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textAppearance="@style/TextAppearance.QS.DetailHeader" /> <ImageView android:id="@+id/settings" android:layout_width="@dimen/qs_detail_image_width" android:layout_height="@dimen/qs_detail_image_height" android:background="?android:attr/selectableItemBackground" android:padding="@dimen/qs_detail_image_padding" android:src="@drawable/ic_settings" android:visibility="gone"/> <Switch android:id="@android:id/toggle" android:layout_width="wrap_content" Loading packages/SystemUI/res/values/dimens.xml +8 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,12 @@ <dimen name="qs_tile_padding_bottom">16dp</dimen> <dimen name="qs_tile_spacing">4dp</dimen> <dimen name="qs_panel_padding_bottom">8dp</dimen> <dimen name="qs_detail_header_height">56dp</dimen> <dimen name="qs_detail_header_padding">0dp</dimen> <dimen name="qs_detail_header_bottom_padding">0dp</dimen> <dimen name="qs_detail_image_width">56dp</dimen> <dimen name="qs_detail_image_height">56dp</dimen> <dimen name="qs_detail_image_padding">16dp</dimen> <dimen name="qs_detail_item_height">48dp</dimen> <dimen name="qs_brightness_padding_top">6dp</dimen> <dimen name="qs_detail_header_text_size">20sp</dimen> Loading @@ -203,6 +209,8 @@ <dimen name="qs_detail_item_secondary_text_size">14sp</dimen> <dimen name="qs_detail_empty_text_size">14sp</dimen> <dimen name="qs_detail_margin_top">28dp</dimen> <dimen name="qs_detail_back_margin_end">16dp</dimen> <dimen name="qs_detail_header_text_padding">0dp</dimen> <dimen name="qs_data_usage_text_size">14sp</dimen> <dimen name="qs_data_usage_usage_text_size">36sp</dimen> <dimen name="qs_expand_margin">0dp</dimen> Loading packages/SystemUI/src/com/android/systemui/qs/QSDetail.java +49 −34 Original line number Diff line number Diff line Loading @@ -46,23 +46,23 @@ public class QSDetail extends LinearLayout { private final SparseArray<View> mDetailViews = new SparseArray<>(); private ViewGroup mDetailContent; private TextView mDetailSettingsButton; private TextView mDetailDoneButton; protected TextView mDetailSettingsButton; protected TextView mDetailDoneButton; private QSDetailClipper mClipper; private DetailAdapter mDetailAdapter; private QSPanel mQsPanel; private View mQsDetailHeader; private TextView mQsDetailHeaderTitle; protected View mQsDetailHeader; protected TextView mQsDetailHeaderTitle; private Switch mQsDetailHeaderSwitch; private ImageView mQsDetailHeaderProgress; private QSTileHost mHost; protected QSTileHost mHost; private boolean mScanState; private boolean mClosingDetail; private boolean mFullyExpanded; private View mQsDetailHeaderBack; protected View mQsDetailHeaderBack; private BaseStatusBarHeader mHeader; public QSDetail(Context context, @Nullable AttributeSet attrs) { Loading Loading @@ -139,28 +139,13 @@ public class QSDetail extends LinearLayout { return mClosingDetail; } private void handleShowingDetail(final QSTile.DetailAdapter adapter, int x, int y) { public void handleShowingDetail(final QSTile.DetailAdapter adapter, int x, int y) { final boolean showingDetail = adapter != null; setClickable(showingDetail); if (showingDetail) { mQsDetailHeaderTitle.setText(adapter.getTitle()); final Boolean toggleState = adapter.getToggleState(); if (toggleState == null) { mQsDetailHeaderSwitch.setVisibility(INVISIBLE); mQsDetailHeader.setClickable(false); } else { mQsDetailHeaderSwitch.setVisibility(VISIBLE); mQsDetailHeaderSwitch.setChecked(toggleState); mQsDetailHeader.setClickable(true); mQsDetailHeader.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { boolean checked = !mQsDetailHeaderSwitch.isChecked(); mQsDetailHeaderSwitch.setChecked(checked); adapter.setToggleState(checked); } }); } setupDetailHeader(adapter); } boolean visibleDiff = (mDetailAdapter != null) != (adapter != null); Loading @@ -172,14 +157,7 @@ public class QSDetail extends LinearLayout { mDetailContent); if (detailView == null) throw new IllegalStateException("Must return detail view"); final Intent settingsIntent = adapter.getSettingsIntent(); mDetailSettingsButton.setVisibility(settingsIntent != null ? VISIBLE : GONE); mDetailSettingsButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mHost.startActivityDismissingKeyguard(settingsIntent); } }); setupDetailFooter(adapter); mDetailContent.removeAllViews(); mDetailContent.addView(detailView); Loading @@ -203,6 +181,11 @@ public class QSDetail extends LinearLayout { mQsPanelCallback.onScanStateChanged(false); } sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); animateDetailVisibleDiff(x, y, visibleDiff, listener); } protected void animateDetailVisibleDiff(int x, int y, boolean visibleDiff, AnimatorListener listener) { if (visibleDiff) { if (mFullyExpanded || mDetailAdapter != null) { setAlpha(1); Loading @@ -216,6 +199,38 @@ public class QSDetail extends LinearLayout { } } protected void setupDetailFooter(DetailAdapter adapter) { final Intent settingsIntent = adapter.getSettingsIntent(); mDetailSettingsButton.setVisibility(settingsIntent != null ? VISIBLE : GONE); mDetailSettingsButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mHost.startActivityDismissingKeyguard(settingsIntent); } }); } protected void setupDetailHeader(final DetailAdapter adapter) { mQsDetailHeaderTitle.setText(adapter.getTitle()); final Boolean toggleState = adapter.getToggleState(); if (toggleState == null) { mQsDetailHeaderSwitch.setVisibility(INVISIBLE); mQsDetailHeader.setClickable(false); } else { mQsDetailHeaderSwitch.setVisibility(VISIBLE); mQsDetailHeaderSwitch.setChecked(toggleState); mQsDetailHeader.setClickable(true); mQsDetailHeader.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { boolean checked = !mQsDetailHeaderSwitch.isChecked(); mQsDetailHeaderSwitch.setChecked(checked); adapter.setToggleState(checked); } }); } } private void handleToggleStateChanged(boolean state) { mQsDetailHeaderSwitch.setChecked(state); } Loading @@ -233,7 +248,7 @@ public class QSDetail extends LinearLayout { } } private final QSPanel.Callback mQsPanelCallback = new QSPanel.Callback() { protected QSPanel.Callback mQsPanelCallback = new QSPanel.Callback() { @Override public void onToggleStateChanged(final boolean state) { post(new Runnable() { Loading packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +5 −1 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { private int mPanelPaddingBottom; private int mBrightnessPaddingTop; private boolean mExpanded; protected boolean mExpanded; private boolean mListening; private Callback mCallback; Loading Loading @@ -228,6 +228,10 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { } } public boolean isExpanded() { return mExpanded; } public void setListening(boolean listening) { if (mListening == listening) return; mListening = listening; Loading packages/SystemUI/src/com/android/systemui/qs/QSTile.java +13 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,8 @@ public abstract class QSTile<TState extends State> implements Listenable { return null; // optional } protected DetailAdapter createDetailAdapter() { throw new UnsupportedOperationException(); } /** * Is a startup check whether this device currently supports this tile. * Should not be used to conditionally hide tiles. Only checked on tile Loading @@ -133,6 +135,17 @@ public abstract class QSTile<TState extends State> implements Listenable { Intent getSettingsIntent(); void setToggleState(boolean state); int getMetricsCategory(); /** * @return the height in px the content of the detail view should take. */ default int getDetailViewHeight() { throw new UnsupportedOperationException(); }; /** * Indicates whether the detail view wants to have its header (back button, title and * toggle) shown. */ default boolean hasHeader() { return true; } } // safe to call from any thread Loading Loading
packages/SystemUI/res/layout/qs_detail_header.xml +17 −4 Original line number Diff line number Diff line Loading @@ -18,16 +18,19 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="@dimen/qs_detail_header_padding" android:paddingTop="@dimen/qs_detail_header_padding" android:paddingBottom="@dimen/qs_detail_header_bottom_padding" android:paddingEnd="@dimen/qs_panel_padding" android:background="@drawable/btn_borderless_rect" android:gravity="center"> <ImageView android:id="@*android:id/up" android:layout_width="56dp" android:layout_height="56dp" android:layout_marginEnd="16dp" android:padding="16dp" android:layout_width="@dimen/qs_detail_image_width" android:layout_height="@dimen/qs_detail_image_height" android:layout_marginEnd="@dimen/qs_detail_back_margin_end" android:padding="@dimen/qs_detail_image_padding" android:clickable="true" android:background="?android:attr/selectableItemBackground" android:contentDescription="@*android:string/action_bar_up_description" Loading @@ -35,11 +38,21 @@ <TextView android:id="@android:id/title" android:paddingLeft="@dimen/qs_detail_header_text_padding" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textAppearance="@style/TextAppearance.QS.DetailHeader" /> <ImageView android:id="@+id/settings" android:layout_width="@dimen/qs_detail_image_width" android:layout_height="@dimen/qs_detail_image_height" android:background="?android:attr/selectableItemBackground" android:padding="@dimen/qs_detail_image_padding" android:src="@drawable/ic_settings" android:visibility="gone"/> <Switch android:id="@android:id/toggle" android:layout_width="wrap_content" Loading
packages/SystemUI/res/values/dimens.xml +8 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,12 @@ <dimen name="qs_tile_padding_bottom">16dp</dimen> <dimen name="qs_tile_spacing">4dp</dimen> <dimen name="qs_panel_padding_bottom">8dp</dimen> <dimen name="qs_detail_header_height">56dp</dimen> <dimen name="qs_detail_header_padding">0dp</dimen> <dimen name="qs_detail_header_bottom_padding">0dp</dimen> <dimen name="qs_detail_image_width">56dp</dimen> <dimen name="qs_detail_image_height">56dp</dimen> <dimen name="qs_detail_image_padding">16dp</dimen> <dimen name="qs_detail_item_height">48dp</dimen> <dimen name="qs_brightness_padding_top">6dp</dimen> <dimen name="qs_detail_header_text_size">20sp</dimen> Loading @@ -203,6 +209,8 @@ <dimen name="qs_detail_item_secondary_text_size">14sp</dimen> <dimen name="qs_detail_empty_text_size">14sp</dimen> <dimen name="qs_detail_margin_top">28dp</dimen> <dimen name="qs_detail_back_margin_end">16dp</dimen> <dimen name="qs_detail_header_text_padding">0dp</dimen> <dimen name="qs_data_usage_text_size">14sp</dimen> <dimen name="qs_data_usage_usage_text_size">36sp</dimen> <dimen name="qs_expand_margin">0dp</dimen> Loading
packages/SystemUI/src/com/android/systemui/qs/QSDetail.java +49 −34 Original line number Diff line number Diff line Loading @@ -46,23 +46,23 @@ public class QSDetail extends LinearLayout { private final SparseArray<View> mDetailViews = new SparseArray<>(); private ViewGroup mDetailContent; private TextView mDetailSettingsButton; private TextView mDetailDoneButton; protected TextView mDetailSettingsButton; protected TextView mDetailDoneButton; private QSDetailClipper mClipper; private DetailAdapter mDetailAdapter; private QSPanel mQsPanel; private View mQsDetailHeader; private TextView mQsDetailHeaderTitle; protected View mQsDetailHeader; protected TextView mQsDetailHeaderTitle; private Switch mQsDetailHeaderSwitch; private ImageView mQsDetailHeaderProgress; private QSTileHost mHost; protected QSTileHost mHost; private boolean mScanState; private boolean mClosingDetail; private boolean mFullyExpanded; private View mQsDetailHeaderBack; protected View mQsDetailHeaderBack; private BaseStatusBarHeader mHeader; public QSDetail(Context context, @Nullable AttributeSet attrs) { Loading Loading @@ -139,28 +139,13 @@ public class QSDetail extends LinearLayout { return mClosingDetail; } private void handleShowingDetail(final QSTile.DetailAdapter adapter, int x, int y) { public void handleShowingDetail(final QSTile.DetailAdapter adapter, int x, int y) { final boolean showingDetail = adapter != null; setClickable(showingDetail); if (showingDetail) { mQsDetailHeaderTitle.setText(adapter.getTitle()); final Boolean toggleState = adapter.getToggleState(); if (toggleState == null) { mQsDetailHeaderSwitch.setVisibility(INVISIBLE); mQsDetailHeader.setClickable(false); } else { mQsDetailHeaderSwitch.setVisibility(VISIBLE); mQsDetailHeaderSwitch.setChecked(toggleState); mQsDetailHeader.setClickable(true); mQsDetailHeader.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { boolean checked = !mQsDetailHeaderSwitch.isChecked(); mQsDetailHeaderSwitch.setChecked(checked); adapter.setToggleState(checked); } }); } setupDetailHeader(adapter); } boolean visibleDiff = (mDetailAdapter != null) != (adapter != null); Loading @@ -172,14 +157,7 @@ public class QSDetail extends LinearLayout { mDetailContent); if (detailView == null) throw new IllegalStateException("Must return detail view"); final Intent settingsIntent = adapter.getSettingsIntent(); mDetailSettingsButton.setVisibility(settingsIntent != null ? VISIBLE : GONE); mDetailSettingsButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mHost.startActivityDismissingKeyguard(settingsIntent); } }); setupDetailFooter(adapter); mDetailContent.removeAllViews(); mDetailContent.addView(detailView); Loading @@ -203,6 +181,11 @@ public class QSDetail extends LinearLayout { mQsPanelCallback.onScanStateChanged(false); } sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); animateDetailVisibleDiff(x, y, visibleDiff, listener); } protected void animateDetailVisibleDiff(int x, int y, boolean visibleDiff, AnimatorListener listener) { if (visibleDiff) { if (mFullyExpanded || mDetailAdapter != null) { setAlpha(1); Loading @@ -216,6 +199,38 @@ public class QSDetail extends LinearLayout { } } protected void setupDetailFooter(DetailAdapter adapter) { final Intent settingsIntent = adapter.getSettingsIntent(); mDetailSettingsButton.setVisibility(settingsIntent != null ? VISIBLE : GONE); mDetailSettingsButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mHost.startActivityDismissingKeyguard(settingsIntent); } }); } protected void setupDetailHeader(final DetailAdapter adapter) { mQsDetailHeaderTitle.setText(adapter.getTitle()); final Boolean toggleState = adapter.getToggleState(); if (toggleState == null) { mQsDetailHeaderSwitch.setVisibility(INVISIBLE); mQsDetailHeader.setClickable(false); } else { mQsDetailHeaderSwitch.setVisibility(VISIBLE); mQsDetailHeaderSwitch.setChecked(toggleState); mQsDetailHeader.setClickable(true); mQsDetailHeader.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { boolean checked = !mQsDetailHeaderSwitch.isChecked(); mQsDetailHeaderSwitch.setChecked(checked); adapter.setToggleState(checked); } }); } } private void handleToggleStateChanged(boolean state) { mQsDetailHeaderSwitch.setChecked(state); } Loading @@ -233,7 +248,7 @@ public class QSDetail extends LinearLayout { } } private final QSPanel.Callback mQsPanelCallback = new QSPanel.Callback() { protected QSPanel.Callback mQsPanelCallback = new QSPanel.Callback() { @Override public void onToggleStateChanged(final boolean state) { post(new Runnable() { Loading
packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +5 −1 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { private int mPanelPaddingBottom; private int mBrightnessPaddingTop; private boolean mExpanded; protected boolean mExpanded; private boolean mListening; private Callback mCallback; Loading Loading @@ -228,6 +228,10 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { } } public boolean isExpanded() { return mExpanded; } public void setListening(boolean listening) { if (mListening == listening) return; mListening = listening; Loading
packages/SystemUI/src/com/android/systemui/qs/QSTile.java +13 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,8 @@ public abstract class QSTile<TState extends State> implements Listenable { return null; // optional } protected DetailAdapter createDetailAdapter() { throw new UnsupportedOperationException(); } /** * Is a startup check whether this device currently supports this tile. * Should not be used to conditionally hide tiles. Only checked on tile Loading @@ -133,6 +135,17 @@ public abstract class QSTile<TState extends State> implements Listenable { Intent getSettingsIntent(); void setToggleState(boolean state); int getMetricsCategory(); /** * @return the height in px the content of the detail view should take. */ default int getDetailViewHeight() { throw new UnsupportedOperationException(); }; /** * Indicates whether the detail view wants to have its header (back button, title and * toggle) shown. */ default boolean hasHeader() { return true; } } // safe to call from any thread Loading