blob: 910b6b1740627f7c002ef67f48e2336e44c9d5a5 [file] [log] [blame]
John Spurlockaf8d6c42014-05-07 17:49:08 -04001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.qs.tiles;
18
Jake Whatleyac7c5d22017-02-02 20:25:12 -050019import android.content.ComponentName;
Jason Monk76c67aa2016-02-19 14:49:42 -050020import android.content.Intent;
Jason Monk49a27962016-05-25 14:22:01 -040021import android.content.IntentFilter;
Sudheer Shankab6fc9312016-01-27 19:59:03 +000022import android.os.UserManager;
23
Jason Monk49a27962016-05-25 14:22:01 -040024import android.provider.Settings.Global;
jackqdyulei76471a52016-12-05 15:03:56 -080025import android.service.quicksettings.Tile;
Julia Reynolds20aef8a2016-05-04 16:44:08 -040026import android.widget.Switch;
27
Tamas Berghammer383db5eb2016-06-22 15:21:38 +010028import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Jason Monk9c7844c2017-01-18 15:21:53 -050029import com.android.systemui.Dependency;
John Spurlockaf8d6c42014-05-07 17:49:08 -040030import com.android.systemui.R;
Jason Monk49a27962016-05-25 14:22:01 -040031import com.android.systemui.qs.GlobalSetting;
Jason Monk702e2eb2017-03-03 16:53:44 -050032import com.android.systemui.qs.QSHost;
33import com.android.systemui.plugins.qs.QSTile.AirplaneBooleanState;
34import com.android.systemui.qs.tileimpl.QSTileImpl;
Jason Monk51e4dc02014-07-22 12:00:47 -040035import com.android.systemui.statusbar.policy.HotspotController;
John Spurlockaf8d6c42014-05-07 17:49:08 -040036
37/** Quick settings tile: Hotspot **/
Jason Monk702e2eb2017-03-03 16:53:44 -050038public class HotspotTile extends QSTileImpl<AirplaneBooleanState> {
Jake Whatleyac7c5d22017-02-02 20:25:12 -050039 static final Intent TETHER_SETTINGS = new Intent().setComponent(new ComponentName(
40 "com.android.settings", "com.android.settings.TetherSettings"));
41
Evan Lairdbcdd0462017-05-15 12:51:34 -040042 private final Icon mEnabledStatic = ResourceIcon.get(R.drawable.ic_hotspot);
Jason Monkab17c982016-06-20 12:39:38 -040043 private final Icon mUnavailable = ResourceIcon.get(R.drawable.ic_hotspot_unavailable);
44
Jason Monk51e4dc02014-07-22 12:00:47 -040045 private final HotspotController mController;
Jason Monk51e4dc02014-07-22 12:00:47 -040046 private final Callback mCallback = new Callback();
Jason Monk49a27962016-05-25 14:22:01 -040047 private final GlobalSetting mAirplaneMode;
48 private boolean mListening;
John Spurlockaf8d6c42014-05-07 17:49:08 -040049
Jason Monk702e2eb2017-03-03 16:53:44 -050050 public HotspotTile(QSHost host) {
John Spurlockaf8d6c42014-05-07 17:49:08 -040051 super(host);
Jason Monk9c7844c2017-01-18 15:21:53 -050052 mController = Dependency.get(HotspotController.class);
Jason Monk49a27962016-05-25 14:22:01 -040053 mAirplaneMode = new GlobalSetting(mContext, mHandler, Global.AIRPLANE_MODE_ON) {
54 @Override
55 protected void handleValueChanged(int value) {
56 refreshState();
57 }
58 };
John Spurlockbceed062014-08-10 18:04:16 -040059 }
60
61 @Override
Jason Monk28680c62016-04-19 09:31:20 -040062 public boolean isAvailable() {
63 return mController.isHotspotSupported();
64 }
65
66 @Override
John Spurlockbceed062014-08-10 18:04:16 -040067 protected void handleDestroy() {
68 super.handleDestroy();
John Spurlockaf8d6c42014-05-07 17:49:08 -040069 }
70
71 @Override
Jason Monkab17c982016-06-20 12:39:38 -040072 public AirplaneBooleanState newTileState() {
73 return new AirplaneBooleanState();
John Spurlockaf8d6c42014-05-07 17:49:08 -040074 }
75
76 @Override
Jason Monk1c6116c2017-09-06 17:33:01 -040077 public void handleSetListening(boolean listening) {
Jason Monk49a27962016-05-25 14:22:01 -040078 if (mListening == listening) return;
79 mListening = listening;
Jason Monk51e4dc02014-07-22 12:00:47 -040080 if (listening) {
81 mController.addCallback(mCallback);
Jason Monk49a27962016-05-25 14:22:01 -040082 final IntentFilter filter = new IntentFilter();
83 filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
Jason Monk94f682e2016-06-23 13:23:01 -040084 refreshState();
Jason Monk51e4dc02014-07-22 12:00:47 -040085 } else {
86 mController.removeCallback(mCallback);
Jason Monk51e4dc02014-07-22 12:00:47 -040087 }
Jason Monk49a27962016-05-25 14:22:01 -040088 mAirplaneMode.setListening(listening);
John Spurlockaf8d6c42014-05-07 17:49:08 -040089 }
90
91 @Override
Jason Monk76c67aa2016-02-19 14:49:42 -050092 public Intent getLongClickIntent() {
Jake Whatleyac7c5d22017-02-02 20:25:12 -050093 return new Intent(TETHER_SETTINGS);
Jason Monk76c67aa2016-02-19 14:49:42 -050094 }
95
96 @Override
John Spurlockaf8d6c42014-05-07 17:49:08 -040097 protected void handleClick() {
Jason Monk51e4dc02014-07-22 12:00:47 -040098 final boolean isEnabled = (Boolean) mState.value;
Jason Monk49a27962016-05-25 14:22:01 -040099 if (!isEnabled && mAirplaneMode.getValue() != 0) {
100 return;
101 }
Jason Monk51e4dc02014-07-22 12:00:47 -0400102 mController.setHotspotEnabled(!isEnabled);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400103 }
104
105 @Override
Jason Monk39c98e62016-03-16 09:18:35 -0400106 public CharSequence getTileLabel() {
107 return mContext.getString(R.string.quick_settings_hotspot_label);
108 }
109
110 @Override
Jason Monkab17c982016-06-20 12:39:38 -0400111 protected void handleUpdateState(AirplaneBooleanState state, Object arg) {
Jason Monk395617f2017-05-05 14:07:58 -0400112 if (state.slash == null) {
113 state.slash = new SlashState();
114 }
John Spurlockaf8d6c42014-05-07 17:49:08 -0400115 state.label = mContext.getString(R.string.quick_settings_hotspot_label);
Jason Monk51e4dc02014-07-22 12:00:47 -0400116
Sudheer Shankaa8fbbb32016-02-11 17:17:57 +0000117 checkIfRestrictionEnforcedByAdminOnly(state, UserManager.DISALLOW_CONFIG_TETHERING);
Julia Reynoldsb8a46a62015-07-14 13:36:30 -0400118 if (arg instanceof Boolean) {
119 state.value = (boolean) arg;
120 } else {
Jason Monkdd5bdc62015-07-20 12:18:38 -0400121 state.value = mController.isHotspotEnabled();
Julia Reynoldsb8a46a62015-07-14 13:36:30 -0400122 }
Jason Monk395617f2017-05-05 14:07:58 -0400123 state.icon = mEnabledStatic;
Jason Monkab17c982016-06-20 12:39:38 -0400124 state.isAirplaneMode = mAirplaneMode.getValue() != 0;
Jason Monke645aee2017-03-31 13:19:26 -0400125 state.isTransient = mController.isHotspotTransient();
Jason Monk395617f2017-05-05 14:07:58 -0400126 state.slash.isSlashed = !state.value && !state.isTransient;
Jason Monke645aee2017-03-31 13:19:26 -0400127 if (state.isTransient) {
128 state.icon = ResourceIcon.get(R.drawable.ic_hotspot_transient_animation);
Jason Monk49a27962016-05-25 14:22:01 -0400129 }
Jason Monk702e2eb2017-03-03 16:53:44 -0500130 state.expandedAccessibilityClassName = Switch.class.getName();
Julia Reynolds20aef8a2016-05-04 16:44:08 -0400131 state.contentDescription = state.label;
Jason Monk32508852017-01-18 09:17:13 -0500132 state.state = state.isAirplaneMode ? Tile.STATE_UNAVAILABLE
Jason Monke645aee2017-03-31 13:19:26 -0400133 : state.value || state.isTransient ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
Jason Monk51e4dc02014-07-22 12:00:47 -0400134 }
135
Selim Cinek4fda7b22014-08-18 22:07:25 +0200136 @Override
Chris Wren457a21c2015-05-06 17:50:34 -0400137 public int getMetricsCategory() {
Chris Wrenf6e9228b2016-01-26 18:04:35 -0500138 return MetricsEvent.QS_HOTSPOT;
Chris Wren457a21c2015-05-06 17:50:34 -0400139 }
140
141 @Override
Selim Cinek4fda7b22014-08-18 22:07:25 +0200142 protected String composeChangeAnnouncement() {
143 if (mState.value) {
144 return mContext.getString(R.string.accessibility_quick_settings_hotspot_changed_on);
145 } else {
146 return mContext.getString(R.string.accessibility_quick_settings_hotspot_changed_off);
147 }
148 }
149
John Spurlocke2efefe2014-07-28 11:17:12 -0400150 private final class Callback implements HotspotController.Callback {
Jason Monk51e4dc02014-07-22 12:00:47 -0400151 @Override
152 public void onHotspotChanged(boolean enabled) {
Julia Reynoldsb8a46a62015-07-14 13:36:30 -0400153 refreshState(enabled);
Jason Monk51e4dc02014-07-22 12:00:47 -0400154 }
Jason Monk51e4dc02014-07-22 12:00:47 -0400155 };
John Spurlockaf8d6c42014-05-07 17:49:08 -0400156}