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