Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 19f981e2 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "sysui: refactor for extensibility."

parents bfee4bc6 0e9f5384
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -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"
@@ -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"
+8 −0
Original line number Diff line number Diff line
@@ -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>
@@ -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>
+49 −34
Original line number Diff line number Diff line
@@ -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) {
@@ -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);
@@ -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);
@@ -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);
@@ -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);
    }
@@ -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() {
+5 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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;
+13 −0
Original line number Diff line number Diff line
@@ -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
@@ -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