blob: 837517e2cc9b53da9ee0130b814196c43c5b3bf4 [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
17import android.content.Context;
Christine Franksea7d71b2018-07-03 14:46:07 -070018import android.hardware.display.ColorDisplayManager;
Christine Franks71e003e2019-01-24 14:40:20 -080019import android.hardware.display.NightDisplayListener;
Jason Monkc3f42c12016-02-05 12:33:13 -050020import android.os.Handler;
21import android.provider.Settings.Secure;
Christine Franksea7d71b2018-07-03 14:46:07 -070022
Christine Franks69c2d1d2017-01-23 14:45:29 -080023import com.android.internal.annotations.VisibleForTesting;
Dave Mankofff4736812019-10-18 17:25:50 -040024import com.android.systemui.dagger.qualifiers.BgHandler;
Jason Monkcb5296a2017-06-30 10:28:18 -040025import com.android.systemui.qs.AutoAddTracker;
Jason Monke5b770e2017-03-03 21:49:29 -050026import com.android.systemui.qs.QSTileHost;
Jason Monkc3f42c12016-02-05 12:33:13 -050027import com.android.systemui.qs.SecureSetting;
Narayan Kamathfa0ec0c2019-02-22 17:49:38 +000028import com.android.systemui.statusbar.policy.CastController;
29import com.android.systemui.statusbar.policy.CastController.CastDevice;
Jason Monkc3f42c12016-02-05 12:33:13 -050030import com.android.systemui.statusbar.policy.DataSaverController;
31import com.android.systemui.statusbar.policy.DataSaverController.Listener;
32import com.android.systemui.statusbar.policy.HotspotController;
33import com.android.systemui.statusbar.policy.HotspotController.Callback;
34
Jason Monka26641f2018-12-27 14:20:53 -050035import javax.inject.Inject;
Jason Monka26641f2018-12-27 14:20:53 -050036
Jason Monkc3f42c12016-02-05 12:33:13 -050037/**
38 * Manages which tiles should be automatically added to QS.
39 */
40public class AutoTileManager {
Jason Monkcb5296a2017-06-30 10:28:18 -040041 public static final String HOTSPOT = "hotspot";
42 public static final String SAVER = "saver";
43 public static final String INVERSION = "inversion";
44 public static final String WORK = "work";
45 public static final String NIGHT = "night";
Narayan Kamathfa0ec0c2019-02-22 17:49:38 +000046 public static final String CAST = "cast";
Amin Shaikh4bd8e052018-01-29 09:52:15 -050047
Jason Monkc3f42c12016-02-05 12:33:13 -050048 private final Context mContext;
49 private final QSTileHost mHost;
50 private final Handler mHandler;
Jason Monkcb5296a2017-06-30 10:28:18 -040051 private final AutoAddTracker mAutoTracker;
Jason Monka26641f2018-12-27 14:20:53 -050052 private final HotspotController mHotspotController;
53 private final DataSaverController mDataSaverController;
54 private final ManagedProfileController mManagedProfileController;
Christine Franks71e003e2019-01-24 14:40:20 -080055 private final NightDisplayListener mNightDisplayListener;
Narayan Kamathfa0ec0c2019-02-22 17:49:38 +000056 private final CastController mCastController;
Jason Monkc3f42c12016-02-05 12:33:13 -050057
Jason Monka26641f2018-12-27 14:20:53 -050058 @Inject
59 public AutoTileManager(Context context, AutoAddTracker autoAddTracker, QSTileHost host,
Dave Mankofff4736812019-10-18 17:25:50 -040060 @BgHandler Handler handler,
Jason Monka26641f2018-12-27 14:20:53 -050061 HotspotController hotspotController,
62 DataSaverController dataSaverController,
63 ManagedProfileController managedProfileController,
Narayan Kamathfa0ec0c2019-02-22 17:49:38 +000064 NightDisplayListener nightDisplayListener,
65 CastController castController) {
Amin Shaikh4bd8e052018-01-29 09:52:15 -050066 mAutoTracker = autoAddTracker;
Jason Monkc3f42c12016-02-05 12:33:13 -050067 mContext = context;
68 mHost = host;
Amin Shaikh4bd8e052018-01-29 09:52:15 -050069 mHandler = handler;
Jason Monka26641f2018-12-27 14:20:53 -050070 mHotspotController = hotspotController;
71 mDataSaverController = dataSaverController;
72 mManagedProfileController = managedProfileController;
Christine Franks71e003e2019-01-24 14:40:20 -080073 mNightDisplayListener = nightDisplayListener;
Narayan Kamathfa0ec0c2019-02-22 17:49:38 +000074 mCastController = castController;
Jason Monkcb5296a2017-06-30 10:28:18 -040075 if (!mAutoTracker.isAdded(HOTSPOT)) {
Jason Monka26641f2018-12-27 14:20:53 -050076 hotspotController.addCallback(mHotspotCallback);
Jason Monkc3f42c12016-02-05 12:33:13 -050077 }
Jason Monkcb5296a2017-06-30 10:28:18 -040078 if (!mAutoTracker.isAdded(SAVER)) {
Jason Monka26641f2018-12-27 14:20:53 -050079 dataSaverController.addCallback(mDataSaverListener);
Jason Monkc3f42c12016-02-05 12:33:13 -050080 }
Jason Monkcb5296a2017-06-30 10:28:18 -040081 if (!mAutoTracker.isAdded(INVERSION)) {
Jason Monkc3f42c12016-02-05 12:33:13 -050082 mColorsSetting = new SecureSetting(mContext, mHandler,
83 Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED) {
84 @Override
85 protected void handleValueChanged(int value, boolean observedChange) {
Jason Monkcb5296a2017-06-30 10:28:18 -040086 if (mAutoTracker.isAdded(INVERSION)) return;
Jason Monkc3f42c12016-02-05 12:33:13 -050087 if (value != 0) {
Jason Monkcb5296a2017-06-30 10:28:18 -040088 mHost.addTile(INVERSION);
89 mAutoTracker.setTileAdded(INVERSION);
Jason Monk9c7844c2017-01-18 15:21:53 -050090 mHandler.post(() -> mColorsSetting.setListening(false));
Jason Monkc3f42c12016-02-05 12:33:13 -050091 }
92 }
93 };
94 mColorsSetting.setListening(true);
95 }
Jason Monkcb5296a2017-06-30 10:28:18 -040096 if (!mAutoTracker.isAdded(WORK)) {
Jason Monka26641f2018-12-27 14:20:53 -050097 managedProfileController.addCallback(mProfileCallback);
Jason Monkc3f42c12016-02-05 12:33:13 -050098 }
Jason Monkcb5296a2017-06-30 10:28:18 -040099 if (!mAutoTracker.isAdded(NIGHT)
Christine Franksea7d71b2018-07-03 14:46:07 -0700100 && ColorDisplayManager.isNightDisplayAvailable(mContext)) {
Christine Franks71e003e2019-01-24 14:40:20 -0800101 nightDisplayListener.setCallback(mNightDisplayCallback);
Christine Franks69c2d1d2017-01-23 14:45:29 -0800102 }
Narayan Kamathfa0ec0c2019-02-22 17:49:38 +0000103 if (!mAutoTracker.isAdded(CAST)) {
104 castController.addCallback(mCastCallback);
105 }
Jason Monkc3f42c12016-02-05 12:33:13 -0500106 }
107
108 public void destroy() {
Amin Shaikh4bd8e052018-01-29 09:52:15 -0500109 if (mColorsSetting != null) {
110 mColorsSetting.setListening(false);
111 }
Jason Monkcb5296a2017-06-30 10:28:18 -0400112 mAutoTracker.destroy();
Jason Monka26641f2018-12-27 14:20:53 -0500113 mHotspotController.removeCallback(mHotspotCallback);
114 mDataSaverController.removeCallback(mDataSaverListener);
115 mManagedProfileController.removeCallback(mProfileCallback);
Christine Franksea7d71b2018-07-03 14:46:07 -0700116 if (ColorDisplayManager.isNightDisplayAvailable(mContext)) {
Christine Franks71e003e2019-01-24 14:40:20 -0800117 mNightDisplayListener.setCallback(null);
Christine Franksea7d71b2018-07-03 14:46:07 -0700118 }
Narayan Kamathfa0ec0c2019-02-22 17:49:38 +0000119 mCastController.removeCallback(mCastCallback);
Jason Monkc3f42c12016-02-05 12:33:13 -0500120 }
121
arangelov5fe95982018-08-17 18:43:31 +0100122 public void unmarkTileAsAutoAdded(String tabSpec) {
123 mAutoTracker.setTileRemoved(tabSpec);
124 }
125
Jason Monkc3f42c12016-02-05 12:33:13 -0500126 private final ManagedProfileController.Callback mProfileCallback =
127 new ManagedProfileController.Callback() {
128 @Override
129 public void onManagedProfileChanged() {
Jason Monkcb5296a2017-06-30 10:28:18 -0400130 if (mAutoTracker.isAdded(WORK)) return;
Jason Monka26641f2018-12-27 14:20:53 -0500131 if (mManagedProfileController.hasActiveProfile()) {
Jason Monkcb5296a2017-06-30 10:28:18 -0400132 mHost.addTile(WORK);
133 mAutoTracker.setTileAdded(WORK);
Jason Monkc3f42c12016-02-05 12:33:13 -0500134 }
135 }
136
137 @Override
138 public void onManagedProfileRemoved() {
139 }
140 };
141
142 private SecureSetting mColorsSetting;
143
144 private final DataSaverController.Listener mDataSaverListener = new Listener() {
145 @Override
146 public void onDataSaverChanged(boolean isDataSaving) {
Jason Monkcb5296a2017-06-30 10:28:18 -0400147 if (mAutoTracker.isAdded(SAVER)) return;
Jason Monkc3f42c12016-02-05 12:33:13 -0500148 if (isDataSaving) {
Jason Monkcb5296a2017-06-30 10:28:18 -0400149 mHost.addTile(SAVER);
150 mAutoTracker.setTileAdded(SAVER);
Jason Monka26641f2018-12-27 14:20:53 -0500151 mHandler.post(() -> mDataSaverController.removeCallback(mDataSaverListener));
Jason Monkc3f42c12016-02-05 12:33:13 -0500152 }
153 }
154 };
155
156 private final HotspotController.Callback mHotspotCallback = new Callback() {
157 @Override
Rohan Shahe4071122018-01-22 15:16:09 -0800158 public void onHotspotChanged(boolean enabled, int numDevices) {
Jason Monkcb5296a2017-06-30 10:28:18 -0400159 if (mAutoTracker.isAdded(HOTSPOT)) return;
Jason Monkc3f42c12016-02-05 12:33:13 -0500160 if (enabled) {
Jason Monkcb5296a2017-06-30 10:28:18 -0400161 mHost.addTile(HOTSPOT);
162 mAutoTracker.setTileAdded(HOTSPOT);
Jason Monka26641f2018-12-27 14:20:53 -0500163 mHandler.post(() -> mHotspotController.removeCallback(mHotspotCallback));
Jason Monkc3f42c12016-02-05 12:33:13 -0500164 }
165 }
166 };
Christine Franks69c2d1d2017-01-23 14:45:29 -0800167
168 @VisibleForTesting
Christine Franks71e003e2019-01-24 14:40:20 -0800169 final NightDisplayListener.Callback mNightDisplayCallback =
170 new NightDisplayListener.Callback() {
Christine Franks69c2d1d2017-01-23 14:45:29 -0800171 @Override
172 public void onActivated(boolean activated) {
173 if (activated) {
174 addNightTile();
175 }
176 }
177
178 @Override
179 public void onAutoModeChanged(int autoMode) {
Christine Franks83cc5412018-07-03 14:46:07 -0700180 if (autoMode == ColorDisplayManager.AUTO_MODE_CUSTOM_TIME
181 || autoMode == ColorDisplayManager.AUTO_MODE_TWILIGHT) {
Christine Franks69c2d1d2017-01-23 14:45:29 -0800182 addNightTile();
183 }
184 }
185
186 private void addNightTile() {
Jason Monkcb5296a2017-06-30 10:28:18 -0400187 if (mAutoTracker.isAdded(NIGHT)) return;
188 mHost.addTile(NIGHT);
189 mAutoTracker.setTileAdded(NIGHT);
Christine Franks71e003e2019-01-24 14:40:20 -0800190 mHandler.post(() -> mNightDisplayListener.setCallback(null));
Christine Franks69c2d1d2017-01-23 14:45:29 -0800191 }
192 };
Narayan Kamathfa0ec0c2019-02-22 17:49:38 +0000193
194 @VisibleForTesting
195 final CastController.Callback mCastCallback = new CastController.Callback() {
196 @Override
197 public void onCastDevicesChanged() {
198 if (mAutoTracker.isAdded(CAST)) return;
199
200 boolean isCasting = false;
201 for (CastDevice device : mCastController.getCastDevices()) {
202 if (device.state == CastDevice.STATE_CONNECTED
203 || device.state == CastDevice.STATE_CONNECTING) {
204 isCasting = true;
205 break;
206 }
207 }
208
209 if (isCasting) {
210 mHost.addTile(CAST);
211 mAutoTracker.setTileAdded(CAST);
212 mHandler.post(() -> mCastController.removeCallback(mCastCallback));
213 }
214 }
215 };
Jason Monkc3f42c12016-02-05 12:33:13 -0500216}