blob: b864ff474bab882a8e279d995aae610d0148dd3f [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
Jason Monk51e4dc02014-07-22 12:00:47 -040019import android.content.BroadcastReceiver;
20import android.content.Context;
John Spurlockaf8d6c42014-05-07 17:49:08 -040021import android.content.Intent;
22
Chris Wren457a21c2015-05-06 17:50:34 -040023import com.android.internal.logging.MetricsLogger;
Andrew Flynn82862572015-04-01 14:22:37 -040024import com.android.systemui.Prefs;
John Spurlockaf8d6c42014-05-07 17:49:08 -040025import com.android.systemui.R;
John Spurlock3976f3d2014-08-04 17:45:16 -040026import com.android.systemui.qs.UsageTracker;
John Spurlockaf8d6c42014-05-07 17:49:08 -040027import com.android.systemui.qs.QSTile;
Jason Monk51e4dc02014-07-22 12:00:47 -040028import com.android.systemui.statusbar.policy.HotspotController;
Sanket Padawea2bf9872014-12-04 13:41:17 -080029import com.android.systemui.statusbar.policy.KeyguardMonitor;
John Spurlockaf8d6c42014-05-07 17:49:08 -040030
31/** Quick settings tile: Hotspot **/
Jason Monk51e4dc02014-07-22 12:00:47 -040032public class HotspotTile extends QSTile<QSTile.BooleanState> {
John Spurlock1832d2f2014-11-09 18:37:19 -050033 private final AnimationIcon mEnable =
34 new AnimationIcon(R.drawable.ic_hotspot_enable_animation);
35 private final AnimationIcon mDisable =
36 new AnimationIcon(R.drawable.ic_hotspot_disable_animation);
Jason Monk51e4dc02014-07-22 12:00:47 -040037 private final HotspotController mController;
Jason Monk51e4dc02014-07-22 12:00:47 -040038 private final Callback mCallback = new Callback();
John Spurlock3976f3d2014-08-04 17:45:16 -040039 private final UsageTracker mUsageTracker;
Sanket Padawea2bf9872014-12-04 13:41:17 -080040 private final KeyguardMonitor mKeyguard;
John Spurlockaf8d6c42014-05-07 17:49:08 -040041
42 public HotspotTile(Host host) {
43 super(host);
Jason Monk51e4dc02014-07-22 12:00:47 -040044 mController = host.getHotspotController();
John Spurlock289d7972014-10-17 12:06:38 -040045 mUsageTracker = newUsageTracker(host.getContext());
John Spurlockbceed062014-08-10 18:04:16 -040046 mUsageTracker.setListening(true);
Sanket Padawea2bf9872014-12-04 13:41:17 -080047 mKeyguard = host.getKeyguardMonitor();
John Spurlockbceed062014-08-10 18:04:16 -040048 }
49
50 @Override
51 protected void handleDestroy() {
52 super.handleDestroy();
53 mUsageTracker.setListening(false);
John Spurlockaf8d6c42014-05-07 17:49:08 -040054 }
55
56 @Override
Jason Monk51e4dc02014-07-22 12:00:47 -040057 protected BooleanState newTileState() {
58 return new BooleanState();
John Spurlockaf8d6c42014-05-07 17:49:08 -040059 }
60
61 @Override
John Spurlockccb6b9a2014-05-17 15:54:40 -040062 public void setListening(boolean listening) {
Jason Monk51e4dc02014-07-22 12:00:47 -040063 if (listening) {
64 mController.addCallback(mCallback);
Jason Monk51e4dc02014-07-22 12:00:47 -040065 } else {
66 mController.removeCallback(mCallback);
Jason Monk51e4dc02014-07-22 12:00:47 -040067 }
John Spurlockaf8d6c42014-05-07 17:49:08 -040068 }
69
70 @Override
71 protected void handleClick() {
Chris Wren457a21c2015-05-06 17:50:34 -040072 super.handleClick();
Jason Monk51e4dc02014-07-22 12:00:47 -040073 final boolean isEnabled = (Boolean) mState.value;
74 mController.setHotspotEnabled(!isEnabled);
John Spurlock1832d2f2014-11-09 18:37:19 -050075 mEnable.setAllowAnimation(true);
76 mDisable.setAllowAnimation(true);
John Spurlockaf8d6c42014-05-07 17:49:08 -040077 }
78
79 @Override
John Spurlockc247b8f2014-11-06 23:06:25 -050080 protected void handleLongClick() {
81 if (mState.value) return; // don't allow usage reset if hotspot is active
82 final String title = mContext.getString(R.string.quick_settings_reset_confirmation_title,
83 mState.label);
84 mUsageTracker.showResetConfirmation(title, new Runnable() {
85 @Override
86 public void run() {
87 refreshState();
88 }
89 });
90 }
91
92 @Override
Jason Monk51e4dc02014-07-22 12:00:47 -040093 protected void handleUpdateState(BooleanState state, Object arg) {
Jason Monke69e5f82014-12-10 17:24:18 -050094 state.visible = mController.isHotspotSupported() && mUsageTracker.isRecentlyUsed();
John Spurlockaf8d6c42014-05-07 17:49:08 -040095 state.label = mContext.getString(R.string.quick_settings_hotspot_label);
Jason Monk51e4dc02014-07-22 12:00:47 -040096
97 state.value = mController.isHotspotEnabled();
John Spurlock1832d2f2014-11-09 18:37:19 -050098 state.icon = state.visible && state.value ? mEnable : mDisable;
Jason Monk51e4dc02014-07-22 12:00:47 -040099 }
100
Selim Cinek4fda7b22014-08-18 22:07:25 +0200101 @Override
Chris Wren457a21c2015-05-06 17:50:34 -0400102 public int getMetricsCategory() {
103 return MetricsLogger.QS_HOTSPOT;
104 }
105
106 @Override
Selim Cinek4fda7b22014-08-18 22:07:25 +0200107 protected String composeChangeAnnouncement() {
108 if (mState.value) {
109 return mContext.getString(R.string.accessibility_quick_settings_hotspot_changed_on);
110 } else {
111 return mContext.getString(R.string.accessibility_quick_settings_hotspot_changed_off);
112 }
113 }
114
John Spurlock289d7972014-10-17 12:06:38 -0400115 private static UsageTracker newUsageTracker(Context context) {
Andrew Flynn82862572015-04-01 14:22:37 -0400116 return new UsageTracker(context, Prefs.Key.HOTSPOT_TILE_LAST_USED, HotspotTile.class,
117 R.integer.days_to_show_hotspot_tile);
John Spurlock289d7972014-10-17 12:06:38 -0400118 }
119
John Spurlocke2efefe2014-07-28 11:17:12 -0400120 private final class Callback implements HotspotController.Callback {
Jason Monk51e4dc02014-07-22 12:00:47 -0400121 @Override
122 public void onHotspotChanged(boolean enabled) {
123 refreshState();
124 }
Jason Monk51e4dc02014-07-22 12:00:47 -0400125 };
126
127 /**
128 * This will catch broadcasts for changes in hotspot state so we can show
129 * the hotspot tile for a number of days after use.
130 */
131 public static class APChangedReceiver extends BroadcastReceiver {
John Spurlock3976f3d2014-08-04 17:45:16 -0400132 private UsageTracker mUsageTracker;
133
Jason Monk51e4dc02014-07-22 12:00:47 -0400134 @Override
135 public void onReceive(Context context, Intent intent) {
John Spurlock3976f3d2014-08-04 17:45:16 -0400136 if (mUsageTracker == null) {
John Spurlock289d7972014-10-17 12:06:38 -0400137 mUsageTracker = newUsageTracker(context);
John Spurlock3976f3d2014-08-04 17:45:16 -0400138 }
139 mUsageTracker.trackUsage();
Jason Monk51e4dc02014-07-22 12:00:47 -0400140 }
John Spurlockaf8d6c42014-05-07 17:49:08 -0400141 }
142}