blob: 8fdce65b1973731527c93261ff3cbe9609b388d6 [file] [log] [blame]
Adrian Roosb83777b2014-06-30 15:11:53 +02001/*
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
John Spurlockbceed062014-08-10 18:04:16 -040019import android.app.ActivityManager;
Jason Monk76c67aa2016-02-19 14:49:42 -050020import android.content.Intent;
Jason Monk611994e2016-02-25 16:46:55 -050021import android.graphics.drawable.Drawable;
Jason Monk76c67aa2016-02-19 14:49:42 -050022import android.provider.MediaStore;
Jason Monk611994e2016-02-25 16:46:55 -050023import android.text.SpannableStringBuilder;
24import android.text.style.ForegroundColorSpan;
Julia Reynolds20aef8a2016-05-04 16:44:08 -040025import android.widget.Switch;
26
Chris Wren457a21c2015-05-06 17:50:34 -040027import com.android.internal.logging.MetricsLogger;
Tamas Berghammercbd3f0c2016-06-22 15:21:38 +010028import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Adrian Roosb83777b2014-06-30 15:11:53 +020029import com.android.systemui.R;
30import com.android.systemui.qs.QSTile;
Adrian Roosb83777b2014-06-30 15:11:53 +020031import com.android.systemui.statusbar.policy.FlashlightController;
32
Adrian Roosb83777b2014-06-30 15:11:53 +020033/** Quick settings tile: Control flashlight **/
34public class FlashlightTile extends QSTile<QSTile.BooleanState> implements
35 FlashlightController.FlashlightListener {
36
John Spurlockc6df3cf2014-11-04 19:36:44 -050037 private final AnimationIcon mEnable
Jason Monk1aec93f2016-03-01 09:39:30 -050038 = new AnimationIcon(R.drawable.ic_signal_flashlight_enable_animation,
39 R.drawable.ic_signal_flashlight_disable);
John Spurlockc6df3cf2014-11-04 19:36:44 -050040 private final AnimationIcon mDisable
Jason Monk1aec93f2016-03-01 09:39:30 -050041 = new AnimationIcon(R.drawable.ic_signal_flashlight_disable_animation,
42 R.drawable.ic_signal_flashlight_enable);
Adrian Roosb83777b2014-06-30 15:11:53 +020043 private final FlashlightController mFlashlightController;
44
45 public FlashlightTile(Host host) {
46 super(host);
47 mFlashlightController = host.getFlashlightController();
48 mFlashlightController.addListener(this);
49 }
50
51 @Override
John Spurlockbceed062014-08-10 18:04:16 -040052 protected void handleDestroy() {
53 super.handleDestroy();
54 mFlashlightController.removeListener(this);
55 }
56
57 @Override
Jason Monk62b63a02016-02-02 15:15:31 -050058 public BooleanState newTileState() {
Adrian Roosb83777b2014-06-30 15:11:53 +020059 return new BooleanState();
60 }
61
62 @Override
63 public void setListening(boolean listening) {
64 }
65
66 @Override
67 protected void handleUserSwitch(int newUserId) {
68 }
69
70 @Override
Jason Monk76c67aa2016-02-19 14:49:42 -050071 public Intent getLongClickIntent() {
72 return new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
73 }
74
75 @Override
Jason Monk72d7bc42016-02-29 10:03:13 -050076 public boolean isAvailable() {
77 return mFlashlightController.hasFlashlight();
78 }
79
80 @Override
Adrian Roosb83777b2014-06-30 15:11:53 +020081 protected void handleClick() {
Guang Zhu2649f6b2014-07-27 14:47:43 -070082 if (ActivityManager.isUserAMonkey()) {
83 return;
84 }
Chris Wren9e7283f2015-05-08 17:23:47 -040085 MetricsLogger.action(mContext, getMetricsCategory(), !mState.value);
Adrian Roosb83777b2014-06-30 15:11:53 +020086 boolean newState = !mState.value;
Jason Monk66239fb2015-12-21 14:27:00 -050087 refreshState(newState);
Adrian Roosfab0d812015-03-10 14:43:47 +010088 mFlashlightController.setFlashlight(newState);
Adrian Roosb83777b2014-06-30 15:11:53 +020089 }
90
91 @Override
Jason Monk39c98e62016-03-16 09:18:35 -040092 public CharSequence getTileLabel() {
93 return mContext.getString(R.string.quick_settings_flashlight_label);
94 }
95
96 @Override
Jason Monk8d344692016-03-28 10:19:49 -040097 protected void handleLongClick() {
98 handleClick();
99 }
100
101 @Override
Adrian Roosb83777b2014-06-30 15:11:53 +0200102 protected void handleUpdateState(BooleanState state, Object arg) {
Adrian Roosfab0d812015-03-10 14:43:47 +0100103 state.label = mHost.getContext().getString(R.string.quick_settings_flashlight_label);
Jason Monk611994e2016-02-25 16:46:55 -0500104 if (!mFlashlightController.isAvailable()) {
Jason Monk7f25c752016-06-15 10:53:03 -0400105 Drawable icon = mHost.getContext().getDrawable(R.drawable.ic_signal_flashlight_disable)
106 .mutate();
Jason Monk611994e2016-02-25 16:46:55 -0500107 final int disabledColor = mHost.getContext().getColor(R.color.qs_tile_tint_unavailable);
108 icon.setTint(disabledColor);
109 state.icon = new DrawableIcon(icon);
110 state.label = new SpannableStringBuilder().append(state.label,
111 new ForegroundColorSpan(disabledColor),
112 SpannableStringBuilder.SPAN_INCLUSIVE_INCLUSIVE);
113 state.contentDescription = mContext.getString(
114 R.string.accessibility_quick_settings_flashlight_unavailable);
115 return;
116 }
Jason Monk66239fb2015-12-21 14:27:00 -0500117 if (arg instanceof Boolean) {
118 boolean value = (Boolean) arg;
Jason Monk9128b1e2015-06-04 13:36:14 -0400119 if (value == state.value) {
120 return;
121 }
122 state.value = value;
Jason Monk3266f612015-07-31 11:37:11 -0400123 } else {
124 state.value = mFlashlightController.isEnabled();
Adrian Roosb83777b2014-06-30 15:11:53 +0200125 }
John Spurlockc6df3cf2014-11-04 19:36:44 -0500126 final AnimationIcon icon = state.value ? mEnable : mDisable;
John Spurlockc6df3cf2014-11-04 19:36:44 -0500127 state.icon = icon;
Julia Reynolds20aef8a2016-05-04 16:44:08 -0400128 state.contentDescription = mContext.getString(R.string.quick_settings_flashlight_label);
129 state.minimalAccessibilityClassName = state.expandedAccessibilityClassName
130 = Switch.class.getName();
Selim Cinek4fda7b22014-08-18 22:07:25 +0200131 }
132
133 @Override
Chris Wren457a21c2015-05-06 17:50:34 -0400134 public int getMetricsCategory() {
Chris Wrenf6e9228b2016-01-26 18:04:35 -0500135 return MetricsEvent.QS_FLASHLIGHT;
Chris Wren457a21c2015-05-06 17:50:34 -0400136 }
137
138 @Override
Selim Cinek4fda7b22014-08-18 22:07:25 +0200139 protected String composeChangeAnnouncement() {
140 if (mState.value) {
141 return mContext.getString(R.string.accessibility_quick_settings_flashlight_changed_on);
142 } else {
143 return mContext.getString(R.string.accessibility_quick_settings_flashlight_changed_off);
144 }
Adrian Roosb83777b2014-06-30 15:11:53 +0200145 }
146
147 @Override
Adrian Roosfab0d812015-03-10 14:43:47 +0100148 public void onFlashlightChanged(boolean enabled) {
Jason Monk66239fb2015-12-21 14:27:00 -0500149 refreshState(enabled);
Adrian Roosb83777b2014-06-30 15:11:53 +0200150 }
151
152 @Override
153 public void onFlashlightError() {
Jason Monk66239fb2015-12-21 14:27:00 -0500154 refreshState(false);
Adrian Roosb83777b2014-06-30 15:11:53 +0200155 }
Adrian Roos930aaa72014-07-22 15:40:59 +0200156
157 @Override
158 public void onFlashlightAvailabilityChanged(boolean available) {
159 refreshState();
160 }
Adrian Roosb83777b2014-06-30 15:11:53 +0200161}