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

Commit b76de265 authored by Doris Ling's avatar Doris Ling
Browse files

Reduce the number of times that dataset changed is triggerd in DashboardAdapter

1. Save the suggestion list and the category list into the instance
state so that it will be available on warm start, and avoid the need
to reload the data.
2. Add the condition list to the constructor parameters for
DashboardAdapter, so that it does not need to setConditions()
separately which will trigger notifyDataSetChanged()

Bug: 30055644
Change-Id: Ia04fa3a25b13d2dacf6baf5f412d662a595fb6dd
parent 8dc1a734
Loading
Loading
Loading
Loading
+29 −5
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
@@ -45,10 +46,13 @@ import com.android.settingslib.drawer.Tile;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.DashboardItemHolder>
        implements View.OnClickListener {
    public static final String TAG = "DashboardAdapter";
    private static final String STATE_SUGGESTION_LIST = "suggestion_list";
    private static final String STATE_CATEGORY_LIST = "category_list";
    private static final int NS_SPACER = 0;
    private static final int NS_SUGGESTION = 1000;
    private static final int NS_ITEMS = 2000;
@@ -80,13 +84,20 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
    private Condition mExpandedCondition = null;
    private SuggestionParser mSuggestionParser;

    public DashboardAdapter(Context context, SuggestionParser parser) {
    public DashboardAdapter(Context context, SuggestionParser parser, Bundle savedInstanceState,
                List<Condition> conditions) {
        mContext = context;
        mCache = new IconCache(context);
        mSuggestionParser = parser;
        mConditions = conditions;

        setHasStableIds(true);
        setShowingAll(true);

        if (savedInstanceState != null) {
            mSuggestions = savedInstanceState.getParcelableArrayList(STATE_SUGGESTION_LIST);
            mCategories = savedInstanceState.getParcelableArrayList(STATE_CATEGORY_LIST);
        }
    }

    public List<Tile> getSuggestions() {
@@ -94,9 +105,11 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
    }

    public void setSuggestions(List<Tile> suggestions) {
        if (!Objects.equals(mSuggestions, suggestions)) {
            mSuggestions = suggestions;
            recountItems();
        }
    }

    public Tile getTile(ComponentName component) {
        for (int i = 0; i < mCategories.size(); i++) {
@@ -111,6 +124,9 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
    }

    public void setCategories(List<DashboardCategory> categories) {
        if (Objects.equals(mCategories, categories)) {
            return;
        }
        mCategories = categories;

        // TODO: Better place for tinting?
@@ -133,9 +149,11 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
    }

    public void setConditions(List<Condition> conditions) {
        if (!Objects.equals(mConditions, conditions)) {
            mConditions = conditions;
            recountItems();
        }
    }

    public boolean isShowingAll() {
        return mIsShowingAll;
@@ -422,6 +440,12 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
        return packageName;
    }

    void onSaveInstanceState(Bundle outState) {
        outState.putParcelableArrayList(STATE_SUGGESTION_LIST, new ArrayList<Tile>(mSuggestions));
        outState.putParcelableArrayList(STATE_CATEGORY_LIST,
                new ArrayList<DashboardCategory>(mCategories));
    }

    private static class IconCache {

        private final Context mContext;
+5 −3
Original line number Diff line number Diff line
@@ -165,6 +165,9 @@ public class DashboardSummary extends InstrumentedFragment
        super.onSaveInstanceState(outState);
        if (mLayoutManager == null) return;
        outState.putInt(EXTRA_SCROLL_POSITION, mLayoutManager.findFirstVisibleItemPosition());
        if (mAdapter != null) {
            mAdapter.onSaveInstanceState(outState);
        }
    }

    @Override
@@ -181,14 +184,13 @@ public class DashboardSummary extends InstrumentedFragment
        mDashboard.setHasFixedSize(true);
        mDashboard.setListener(this);
        mDashboard.addItemDecoration(new DashboardDecorator(getContext()));
        mAdapter = new DashboardAdapter(getContext(), mSuggestionParser);
        mAdapter.setConditions(mConditionManager.getConditions());
        mAdapter = new DashboardAdapter(getContext(), mSuggestionParser, bundle,
                mConditionManager.getConditions());
        mDashboard.setAdapter(mAdapter);
        mSummaryLoader.setAdapter(mAdapter);
        ConditionAdapterUtils.addDismiss(mDashboard);
        if (DEBUG_TIMING) Log.d(TAG, "onViewCreated took "
                + (System.currentTimeMillis() - startTime) + " ms");

        rebuildUI();
    }