1a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikhpackage com.android.systemui.qs;
2a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh
3a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikhimport static com.android.systemui.Prefs.Key.QS_TILE_SPECS_REVEALED;
4a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh
5a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikhimport android.content.Context;
6a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikhimport android.os.Handler;
7a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikhimport android.util.ArraySet;
8a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh
9a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikhimport com.android.systemui.Prefs;
10a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikhimport com.android.systemui.plugins.qs.QSTile;
11a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh
12a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikhimport java.util.Collection;
13a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikhimport java.util.Collections;
14a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikhimport java.util.Set;
15a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh
16a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikhpublic class QSTileRevealController {
17a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    private static final long QS_REVEAL_TILES_DELAY = 500L;
18a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh
19a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    private final Context mContext;
20a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    private final QSPanel mQSPanel;
21a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    private final PagedTileLayout mPagedTileLayout;
22a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    private final ArraySet<String> mTilesToReveal = new ArraySet<>();
23a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    private final Handler mHandler = new Handler();
24a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh
25a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    private final Runnable mRevealQsTiles = new Runnable() {
26a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        @Override
27a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        public void run() {
28a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh            mPagedTileLayout.startTileReveal(mTilesToReveal, () -> {
29a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh                if (mQSPanel.isExpanded()) {
30a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh                    addTileSpecsToRevealed(mTilesToReveal);
31a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh                    mTilesToReveal.clear();
32a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh                }
33a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh            });
34a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        }
35a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    };
36a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh
37a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    QSTileRevealController(Context context, QSPanel qsPanel, PagedTileLayout pagedTileLayout) {
38a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        mContext = context;
39a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        mQSPanel = qsPanel;
40a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        mPagedTileLayout = pagedTileLayout;
41a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    }
42a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh
43a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    public void setExpansion(float expansion) {
44a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        if (expansion == 1f) {
45a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh            mHandler.postDelayed(mRevealQsTiles, QS_REVEAL_TILES_DELAY);
46a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        } else {
47a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh            mHandler.removeCallbacks(mRevealQsTiles);
48a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        }
49a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    }
50a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh
51a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    public void updateRevealedTiles(Collection<QSTile> tiles) {
52a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        ArraySet<String> tileSpecs = new ArraySet<>();
53a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        for (QSTile tile : tiles) {
54a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh            tileSpecs.add(tile.getTileSpec());
55a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        }
56a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh
57a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        final Set<String> revealedTiles = Prefs.getStringSet(
58a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh                mContext, QS_TILE_SPECS_REVEALED, Collections.EMPTY_SET);
59a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        if (revealedTiles.isEmpty() || mQSPanel.isShowingCustomize()) {
60a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh            // Do not reveal QS tiles the user has upon first load or those that they directly
61a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh            // added through customization.
62a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh            addTileSpecsToRevealed(tileSpecs);
63a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        } else {
64a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh            // Animate all tiles that the user has not directly added themselves.
65a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh            tileSpecs.removeAll(revealedTiles);
66a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh            mTilesToReveal.addAll(tileSpecs);
67a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        }
68a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    }
69a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh
70a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    private void addTileSpecsToRevealed(ArraySet<String> specs) {
71a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        final ArraySet<String> revealedTiles = new ArraySet<>(
72a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh                Prefs.getStringSet(mContext, QS_TILE_SPECS_REVEALED, Collections.EMPTY_SET));
73a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        revealedTiles.addAll(specs);
74a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh        Prefs.putStringSet(mContext, QS_TILE_SPECS_REVEALED, revealedTiles);
75a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh    }
76a07a17bcf39bc1acde886f91a2aa12491b2e3b2bAmin Shaikh}
77