1cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk/*
2cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk * Copyright (C) 2017 The Android Open Source Project
3cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk *
4cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk * except in compliance with the License. You may obtain a copy of the License at
6cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk *
7cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
8cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk *
9cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
10cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk * KIND, either express or implied. See the License for the specific language governing
12cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk * permissions and limitations under the License.
13cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk */
14cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
15cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkpackage com.android.systemui.qs;
16cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
17cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport static com.android.systemui.statusbar.phone.AutoTileManager.HOTSPOT;
18cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport static com.android.systemui.statusbar.phone.AutoTileManager.INVERSION;
19cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport static com.android.systemui.statusbar.phone.AutoTileManager.NIGHT;
20cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport static com.android.systemui.statusbar.phone.AutoTileManager.SAVER;
21cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport static com.android.systemui.statusbar.phone.AutoTileManager.WORK;
22cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
23cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport android.content.Context;
24cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport android.database.ContentObserver;
25cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport android.os.Handler;
26cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport android.provider.Settings.Secure;
27cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport android.text.TextUtils;
28cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport android.util.ArraySet;
29cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
30cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport com.android.internal.annotations.VisibleForTesting;
31cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport com.android.systemui.Prefs;
32cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport com.android.systemui.Prefs.Key;
33cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
34cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport java.util.Arrays;
35cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport java.util.Collection;
36cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkimport java.util.Collections;
37cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
38cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monkpublic class AutoAddTracker {
39cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
40cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    private static final String[][] CONVERT_PREFS = {
41cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk            {Key.QS_HOTSPOT_ADDED, HOTSPOT},
42cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk            {Key.QS_DATA_SAVER_ADDED, SAVER},
43cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk            {Key.QS_INVERT_COLORS_ADDED, INVERSION},
44cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk            {Key.QS_WORK_ADDED, WORK},
45cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk            {Key.QS_NIGHTDISPLAY_ADDED, NIGHT},
46cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    };
47cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
48cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    private final ArraySet<String> mAutoAdded;
49cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    private final Context mContext;
50cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
51cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    public AutoAddTracker(Context context) {
52cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        mContext = context;
53cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        mAutoAdded = new ArraySet<>(getAdded());
544bd8e05c1dbae46d94b731241252ddccff6d977cAmin Shaikh        // TODO: remove migration code and shared preferences keys after P release
55cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        for (String[] convertPref : CONVERT_PREFS) {
56cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk            if (Prefs.getBoolean(context, convertPref[0], false)) {
57cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk                setTileAdded(convertPref[1]);
584bd8e05c1dbae46d94b731241252ddccff6d977cAmin Shaikh                Prefs.remove(context, convertPref[0]);
59cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk            }
60cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        }
61cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        mContext.getContentResolver().registerContentObserver(
62cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk                Secure.getUriFor(Secure.QS_AUTO_ADDED_TILES), false, mObserver);
63cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    }
64cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
65cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    public boolean isAdded(String tile) {
66cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        return mAutoAdded.contains(tile);
67cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    }
68cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
69cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    public void setTileAdded(String tile) {
70cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        if (mAutoAdded.add(tile)) {
71cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk            saveTiles();
72cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        }
73cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    }
74cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
75cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    public void destroy() {
76cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        mContext.getContentResolver().unregisterContentObserver(mObserver);
77cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    }
78cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
79cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    private void saveTiles() {
80cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        Secure.putString(mContext.getContentResolver(), Secure.QS_AUTO_ADDED_TILES,
81cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk                TextUtils.join(",", mAutoAdded));
82cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    }
83cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
84cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    private Collection<String> getAdded() {
85cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        String current = Secure.getString(mContext.getContentResolver(), Secure.QS_AUTO_ADDED_TILES);
86cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        if (current == null) {
87cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk            return Collections.emptyList();
88cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        }
89cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        return Arrays.asList(current.split(","));
90cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    }
91cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk
92cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    @VisibleForTesting
93cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    protected final ContentObserver mObserver = new ContentObserver(new Handler()) {
94cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        @Override
95cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        public void onChange(boolean selfChange) {
96cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk            mAutoAdded.addAll(getAdded());
97cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk        }
98cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk    };
99cb5296a6f0b54ed5da9e69374ef7ec6b553170f9Jason Monk}
100