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

Commit 805ef76e authored by Roman Birg's avatar Roman Birg
Browse files

SystemUI: improve tile caching mechanism



- Always remove all tile views before setting new tiles

- Save and restore the viewpager page when setting tiles as we need to
  reset this page when we're done (after re-setting the adapter)

- Reset the pager adapter to force page removes and fix ghost scrolling
  to non existent pages.

- No need to set tiles to 0 while recreating status bar or switching
  themes

- Always recalculate heights after switching brightness slider, and
  explicitly set the visibility on the slider too

Ref: CYNGNOS-1644 OPO-367

Change-Id: Id08fbbcd38f24c16ee044c0d63389b36845c81b9
Signed-off-by: default avatarRoman Birg <roman@cyngn.com>
parent d3d52372
Loading
Loading
Loading
Loading
+27 −23
Original line number Diff line number Diff line
@@ -512,6 +512,8 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
                    + tiles + "]");
        }

        int currentViewPagerPage = mViewPager.getCurrentItem();

        if (mLastDragRecord != null && mRecords.indexOf(mLastDragRecord) == -1) {
            // the last removed record might be stored in mLastDragRecord if we just shifted
            // re-add it to the list so we'll clean it up below
@@ -527,6 +529,11 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
        while (iterator.hasPrevious()) {
            DragTileRecord dr = (DragTileRecord) iterator.previous();

            if (dr.page >= 0) {
                // clean up view
                mPages.get(dr.page).removeView(dr.tileView);
            }

            if (tiles.contains(dr.tile)) {
                if (DEBUG_TILES) {
                    Log.i(TAG, "caching tile: " + dr.tile);
@@ -536,8 +543,6 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
                if (DEBUG_TILES) {
                    Log.i(TAG, "removing tile: " + dr.tile);
                }
                // clean up view
                mPages.get(dr.page).removeView(dr.tileView);

                // remove record
                iterator.remove();
@@ -547,19 +552,21 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
                    final int childCount = mPages.get(dr.page).getChildCount();

                    if (childCount == 0) {
                        // if current page is the current max page COUNT (off by 1) then move back
                        final int currentIndex = mViewPager.getCurrentItem();
                        if (currentIndex == (getCurrentMaxPageCount()) + (mEditing ? 1 : 0)) {
                            mViewPager.setCurrentItem(currentIndex - 1, false);
                        if (currentIndex > 0 && currentViewPagerPage == currentIndex) {
                            // if we are about to remove the page we are currently on, move back
                            currentViewPagerPage--;
                        }
                        final int pageIndex = dr.page + (mEditing ? 1 : 0);
                        mPagerAdapter.startUpdate(mViewPager);
                            final int pageIndex = mEditing ? currentIndex - 1 : currentIndex;
                            mPages.remove(pageIndex);
                        mPagerAdapter.destroyItem(mViewPager, pageIndex, mPages.get(dr.page));
                        mPagerAdapter.finishUpdate(mViewPager);
                        mPagerAdapter.notifyDataSetChanged();
                    }
                }
            }
            }
            dr.page = -1;
            dr.destinationPage = -1;
        }

        // at this point recordMap should have all retained tiles, no new or old tiles
@@ -568,8 +575,14 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
            Log.i(TAG, "record map delta: " + delta);
        }
        mRecords.ensureCapacity(tiles.size());

        mPagerAdapter.notifyDataSetChanged();

        // even though we explicitly destroy old pages, without this call,
        // the viewpager doesn't seem to want to pick up the fact that we have less pages
        // and allows "empty" scrolls to the right where there is no page.
        mViewPager.setAdapter(mPagerAdapter);

        // add new tiles
        for (int i = 0; i < tiles.size(); i++) {
            QSTile<?> tile = tiles.get(i);
@@ -601,10 +614,8 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
                    }
                    Collections.swap(mRecords, indexOf, i);

                    record.destinationPage = tileDestPage;
                    ensureDestinationPage(record);
                }

                record.destinationPage = tileDestPage;
            }
            if (record.page == -1) {
                // add the view
@@ -616,6 +627,9 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
            }
        }

        // restore the visible page
        mViewPager.setCurrentItem(currentViewPagerPage, false);

        if (isShowingDetail()) {
            mDetail.bringToFront();
        }
@@ -625,16 +639,6 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On
        requestLayout();
    }

    private void ensureDestinationPage(DragTileRecord record) {
        if (record.destinationPage != record.page) {
            if (record.page >= 0) {
                getPage(record.page).removeView(record.tileView);
            }
            getPage(record.destinationPage).addView(record.tileView);
            record.page = record.destinationPage;
        }
    }

    private DragTileRecord makeRecord(final QSTile<?> tile) {
        if (DEBUG_TILES) {
            Log.d(TAG, "+++ makeRecord() called with " + "tile = [" + tile + "]");
+15 −3
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ import android.widget.ImageView;
import android.widget.TextView;
import com.android.systemui.R;
import com.android.systemui.cm.UserContentObserver;
import com.android.systemui.settings.ToggleSlider;

import cyanogenmod.providers.CMSettings;

public class QSPanelTopView extends FrameLayout {
@@ -317,12 +319,22 @@ public class QSPanelTopView extends FrameLayout {
            boolean showSlider = CMSettings.System.getIntForUser(resolver,
                    CMSettings.System.QS_SHOW_BRIGHTNESS_SLIDER, 1, currentUserId) == 1;
            if (showSlider != mHasBrightnessSliderToDisplay) {
                if (mAnimator != null) {
                    mAnimator.cancel(); // cancel everything we're animating
                    mAnimator = null;
                }
                mHasBrightnessSliderToDisplay = showSlider;
                if (mAnimator == null && mBrightnessView != null) {
                    // no animations, set the visibility manually
                if (mBrightnessView != null) {
                    mBrightnessView.setVisibility(showSlider ? View.VISIBLE : View.GONE);

                    // as per showBrightnessSlider() in QSPanel.java, we look it up on-the-go
                    ToggleSlider brightnessSlider = (ToggleSlider) findViewById(R.id.brightness_slider);
                    if (brightnessSlider != null) {
                        brightnessSlider.setVisibility(showSlider ? View.VISIBLE : View.GONE);
                    }
                requestLayout();

                }
                getParent().requestLayout();
                animateToState();
            }
        }
+0 −4
Original line number Diff line number Diff line
@@ -1230,9 +1230,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
                                Log.e(TAG, "Unable to unregister custom tile listener", e);
                            }

                            // clear out old tile states and views
                            mQSPanel.setTiles(new ArrayList<QSTile<?>>());

                            mQSTileHost.resetTiles();

                            // reregister service
@@ -3741,7 +3738,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
        }

        mQSPanel.getHost().setCustomTileListenerService(null);
        mQSPanel.setTiles(new ArrayList<QSTile<?>>());
        mQSPanel.setListening(false);

        makeStatusBarView();