blob: b220686b305643b0507357574b3534f69f7d0c8b [file] [log] [blame]
Jason Monkc3f42c12016-02-05 12:33:13 -05001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5 * except in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11 * KIND, either express or implied. See the License for the specific language governing
12 * permissions and limitations under the License.
13 */
14
15package com.android.systemui.statusbar.phone;
16
Amin Shaikh4bd8e052018-01-29 09:52:15 -050017import android.app.AlarmManager.AlarmClockInfo;
Jason Monkc3f42c12016-02-05 12:33:13 -050018import android.content.Context;
19import android.os.Handler;
20import android.provider.Settings.Secure;
Christine Franks69c2d1d2017-01-23 14:45:29 -080021import com.android.internal.annotations.VisibleForTesting;
Christine Franks5397f032017-11-01 18:35:16 -070022import com.android.internal.app.ColorDisplayController;
Jason Monk9c7844c2017-01-18 15:21:53 -050023import com.android.systemui.Dependency;
Jason Monkcb5296a2017-06-30 10:28:18 -040024import com.android.systemui.qs.AutoAddTracker;
Jason Monke5b770e2017-03-03 21:49:29 -050025import com.android.systemui.qs.QSTileHost;
Jason Monkc3f42c12016-02-05 12:33:13 -050026import com.android.systemui.qs.SecureSetting;
27import com.android.systemui.statusbar.policy.DataSaverController;
28import com.android.systemui.statusbar.policy.DataSaverController.Listener;
29import com.android.systemui.statusbar.policy.HotspotController;
30import com.android.systemui.statusbar.policy.HotspotController.Callback;
Amin Shaikh4bd8e052018-01-29 09:52:15 -050031import com.android.systemui.statusbar.policy.NextAlarmController;
32import com.android.systemui.statusbar.policy.NextAlarmController.NextAlarmChangeCallback;
Jason Monkc3f42c12016-02-05 12:33:13 -050033
34/**
35 * Manages which tiles should be automatically added to QS.
36 */
37public class AutoTileManager {
Jason Monkcb5296a2017-06-30 10:28:18 -040038 public static final String HOTSPOT = "hotspot";
39 public static final String SAVER = "saver";
40 public static final String INVERSION = "inversion";
41 public static final String WORK = "work";
42 public static final String NIGHT = "night";
Amin Shaikh4bd8e052018-01-29 09:52:15 -050043 public static final String ALARM = "alarm";
44
Jason Monkc3f42c12016-02-05 12:33:13 -050045 private final Context mContext;
46 private final QSTileHost mHost;
47 private final Handler mHandler;
Jason Monkcb5296a2017-06-30 10:28:18 -040048 private final AutoAddTracker mAutoTracker;
Jason Monkc3f42c12016-02-05 12:33:13 -050049
50 public AutoTileManager(Context context, QSTileHost host) {
Amin Shaikh4bd8e052018-01-29 09:52:15 -050051 this(context, new AutoAddTracker(context), host,
52 new Handler(Dependency.get(Dependency.BG_LOOPER)));
53 }
54
55 @VisibleForTesting
56 AutoTileManager(Context context, AutoAddTracker autoAddTracker, QSTileHost host,
57 Handler handler) {
58 mAutoTracker = autoAddTracker;
Jason Monkc3f42c12016-02-05 12:33:13 -050059 mContext = context;
60 mHost = host;
Amin Shaikh4bd8e052018-01-29 09:52:15 -050061 mHandler = handler;
Jason Monkcb5296a2017-06-30 10:28:18 -040062 if (!mAutoTracker.isAdded(HOTSPOT)) {
Jason Monk9c7844c2017-01-18 15:21:53 -050063 Dependency.get(HotspotController.class).addCallback(mHotspotCallback);
Jason Monkc3f42c12016-02-05 12:33:13 -050064 }
Jason Monkcb5296a2017-06-30 10:28:18 -040065 if (!mAutoTracker.isAdded(SAVER)) {
Jason Monk9c7844c2017-01-18 15:21:53 -050066 Dependency.get(DataSaverController.class).addCallback(mDataSaverListener);
Jason Monkc3f42c12016-02-05 12:33:13 -050067 }
Jason Monkcb5296a2017-06-30 10:28:18 -040068 if (!mAutoTracker.isAdded(INVERSION)) {
Jason Monkc3f42c12016-02-05 12:33:13 -050069 mColorsSetting = new SecureSetting(mContext, mHandler,
70 Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED) {
71 @Override
72 protected void handleValueChanged(int value, boolean observedChange) {
Jason Monkcb5296a2017-06-30 10:28:18 -040073 if (mAutoTracker.isAdded(INVERSION)) return;
Jason Monkc3f42c12016-02-05 12:33:13 -050074 if (value != 0) {
Jason Monkcb5296a2017-06-30 10:28:18 -040075 mHost.addTile(INVERSION);
76 mAutoTracker.setTileAdded(INVERSION);
Jason Monk9c7844c2017-01-18 15:21:53 -050077 mHandler.post(() -> mColorsSetting.setListening(false));
Jason Monkc3f42c12016-02-05 12:33:13 -050078 }
79 }
80 };
81 mColorsSetting.setListening(true);
82 }
Jason Monkcb5296a2017-06-30 10:28:18 -040083 if (!mAutoTracker.isAdded(WORK)) {
Jason Monk9c7844c2017-01-18 15:21:53 -050084 Dependency.get(ManagedProfileController.class).addCallback(mProfileCallback);
Jason Monkc3f42c12016-02-05 12:33:13 -050085 }
Jason Monkcb5296a2017-06-30 10:28:18 -040086 if (!mAutoTracker.isAdded(NIGHT)
Amin Shaikh4bd8e052018-01-29 09:52:15 -050087 && ColorDisplayController.isAvailable(mContext)) {
Christine Franks5397f032017-11-01 18:35:16 -070088 Dependency.get(ColorDisplayController.class).setListener(mColorDisplayCallback);
Christine Franks69c2d1d2017-01-23 14:45:29 -080089 }
Amin Shaikh4bd8e052018-01-29 09:52:15 -050090 if (!mAutoTracker.isAdded(ALARM)) {
91 Dependency.get(NextAlarmController.class).addCallback(mNextAlarmChangeCallback);
92 }
Jason Monkc3f42c12016-02-05 12:33:13 -050093 }
94
95 public void destroy() {
Amin Shaikh4bd8e052018-01-29 09:52:15 -050096 if (mColorsSetting != null) {
97 mColorsSetting.setListening(false);
98 }
Jason Monkcb5296a2017-06-30 10:28:18 -040099 mAutoTracker.destroy();
Jason Monk9c7844c2017-01-18 15:21:53 -0500100 Dependency.get(HotspotController.class).removeCallback(mHotspotCallback);
101 Dependency.get(DataSaverController.class).removeCallback(mDataSaverListener);
102 Dependency.get(ManagedProfileController.class).removeCallback(mProfileCallback);
Christine Franks5397f032017-11-01 18:35:16 -0700103 Dependency.get(ColorDisplayController.class).setListener(null);
Amin Shaikh4bd8e052018-01-29 09:52:15 -0500104 Dependency.get(NextAlarmController.class).removeCallback(mNextAlarmChangeCallback);
Jason Monkc3f42c12016-02-05 12:33:13 -0500105 }
106
Jason Monkc3f42c12016-02-05 12:33:13 -0500107 private final ManagedProfileController.Callback mProfileCallback =
108 new ManagedProfileController.Callback() {
109 @Override
110 public void onManagedProfileChanged() {
Jason Monkcb5296a2017-06-30 10:28:18 -0400111 if (mAutoTracker.isAdded(WORK)) return;
Jason Monk9c7844c2017-01-18 15:21:53 -0500112 if (Dependency.get(ManagedProfileController.class).hasActiveProfile()) {
Jason Monkcb5296a2017-06-30 10:28:18 -0400113 mHost.addTile(WORK);
114 mAutoTracker.setTileAdded(WORK);
Jason Monk9c7844c2017-01-18 15:21:53 -0500115 mHandler.post(() -> Dependency.get(ManagedProfileController.class)
116 .removeCallback(mProfileCallback));
Jason Monkc3f42c12016-02-05 12:33:13 -0500117 }
118 }
119
120 @Override
121 public void onManagedProfileRemoved() {
122 }
123 };
124
125 private SecureSetting mColorsSetting;
126
127 private final DataSaverController.Listener mDataSaverListener = new Listener() {
128 @Override
129 public void onDataSaverChanged(boolean isDataSaving) {
Jason Monkcb5296a2017-06-30 10:28:18 -0400130 if (mAutoTracker.isAdded(SAVER)) return;
Jason Monkc3f42c12016-02-05 12:33:13 -0500131 if (isDataSaving) {
Jason Monkcb5296a2017-06-30 10:28:18 -0400132 mHost.addTile(SAVER);
133 mAutoTracker.setTileAdded(SAVER);
Jason Monk9c7844c2017-01-18 15:21:53 -0500134 mHandler.post(() -> Dependency.get(DataSaverController.class).removeCallback(
135 mDataSaverListener));
Jason Monkc3f42c12016-02-05 12:33:13 -0500136 }
137 }
138 };
139
140 private final HotspotController.Callback mHotspotCallback = new Callback() {
141 @Override
Rohan Shahe4071122018-01-22 15:16:09 -0800142 public void onHotspotChanged(boolean enabled, int numDevices) {
Jason Monkcb5296a2017-06-30 10:28:18 -0400143 if (mAutoTracker.isAdded(HOTSPOT)) return;
Jason Monkc3f42c12016-02-05 12:33:13 -0500144 if (enabled) {
Jason Monkcb5296a2017-06-30 10:28:18 -0400145 mHost.addTile(HOTSPOT);
146 mAutoTracker.setTileAdded(HOTSPOT);
Jason Monk9c7844c2017-01-18 15:21:53 -0500147 mHandler.post(() -> Dependency.get(HotspotController.class)
148 .removeCallback(mHotspotCallback));
Jason Monkc3f42c12016-02-05 12:33:13 -0500149 }
150 }
151 };
Christine Franks69c2d1d2017-01-23 14:45:29 -0800152
Amin Shaikh4bd8e052018-01-29 09:52:15 -0500153 private final NextAlarmChangeCallback mNextAlarmChangeCallback = new NextAlarmChangeCallback() {
154 @Override
155 public void onNextAlarmChanged(AlarmClockInfo nextAlarm) {
156 if (mAutoTracker.isAdded(ALARM)) return;
157 if (nextAlarm != null) {
158 mHost.addTile(ALARM);
159 mAutoTracker.setTileAdded(ALARM);
160 mHandler.post(() -> Dependency.get(NextAlarmController.class)
161 .removeCallback(mNextAlarmChangeCallback));
162 }
163 }
164 };
165
Christine Franks69c2d1d2017-01-23 14:45:29 -0800166 @VisibleForTesting
Christine Franks5397f032017-11-01 18:35:16 -0700167 final ColorDisplayController.Callback mColorDisplayCallback =
168 new ColorDisplayController.Callback() {
Christine Franks69c2d1d2017-01-23 14:45:29 -0800169 @Override
170 public void onActivated(boolean activated) {
171 if (activated) {
172 addNightTile();
173 }
174 }
175
176 @Override
177 public void onAutoModeChanged(int autoMode) {
Christine Franks5397f032017-11-01 18:35:16 -0700178 if (autoMode == ColorDisplayController.AUTO_MODE_CUSTOM
179 || autoMode == ColorDisplayController.AUTO_MODE_TWILIGHT) {
Christine Franks69c2d1d2017-01-23 14:45:29 -0800180 addNightTile();
181 }
182 }
183
184 private void addNightTile() {
Jason Monkcb5296a2017-06-30 10:28:18 -0400185 if (mAutoTracker.isAdded(NIGHT)) return;
186 mHost.addTile(NIGHT);
187 mAutoTracker.setTileAdded(NIGHT);
Christine Franks5397f032017-11-01 18:35:16 -0700188 mHandler.post(() -> Dependency.get(ColorDisplayController.class)
Christine Franks69c2d1d2017-01-23 14:45:29 -0800189 .setListener(null));
190 }
191 };
Jason Monkc3f42c12016-02-05 12:33:13 -0500192}