blob: f4e4581215b550a6226e6151d96672f42534bd53 [file] [log] [blame]
Evan Lairde1d13c92018-03-20 16:58:01 -04001/*
2 * Copyright (C) 2018 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.statusbar;
18
19import static com.android.systemui.statusbar.policy.DarkIconDispatcher.getTint;
Evan Lairddbeefe32018-04-03 16:52:41 -040020import static com.android.systemui.statusbar.policy.DarkIconDispatcher.isInArea;
Evan Lairde1d13c92018-03-20 16:58:01 -040021
22import android.content.Context;
23import android.content.res.ColorStateList;
24import android.graphics.Color;
25import android.graphics.Rect;
26import android.util.AttributeSet;
27import android.view.LayoutInflater;
28import android.view.View;
29import android.widget.ImageView;
30
31import com.android.internal.annotations.VisibleForTesting;
32import com.android.keyguard.AlphaOptimizedLinearLayout;
33import com.android.settingslib.graph.SignalDrawable;
34import com.android.systemui.R;
35import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
36import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
37
38public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements DarkReceiver,
39 StatusIconDisplayable {
40 private static final String TAG = "StatusBarMobileView";
41
42 private String mSlot;
43 private MobileIconState mState;
44 private SignalDrawable mMobileDrawable;
45 private View mInoutContainer;
46 private ImageView mIn;
47 private ImageView mOut;
48 private ImageView mMobile, mMobileType, mMobileRoaming;
49 private View mMobileRoamingSpace;
50
51 public static StatusBarMobileView fromContext(Context context) {
52 LayoutInflater inflater = LayoutInflater.from(context);
53
54 return (StatusBarMobileView)
55 inflater.inflate(R.layout.status_bar_mobile_signal_group, null);
56 }
57
58 public StatusBarMobileView(Context context) {
59 super(context);
60 }
61
62 public StatusBarMobileView(Context context, AttributeSet attrs) {
63 super(context, attrs);
64 }
65
66 public StatusBarMobileView(Context context, AttributeSet attrs, int defStyleAttr) {
67 super(context, attrs, defStyleAttr);
68 }
69
70 public StatusBarMobileView(Context context, AttributeSet attrs, int defStyleAttr,
71 int defStyleRes) {
72 super(context, attrs, defStyleAttr, defStyleRes);
73 }
74
75 @Override
76 protected void onFinishInflate() {
77 super.onFinishInflate();
78
79 init();
80 }
81
82 private void init() {
83 mMobile = findViewById(R.id.mobile_signal);
84 mMobileType = findViewById(R.id.mobile_type);
85 mMobileRoaming = findViewById(R.id.mobile_roaming);
86 mMobileRoamingSpace = findViewById(R.id.mobile_roaming_space);
87 mIn = findViewById(R.id.mobile_in);
88 mOut = findViewById(R.id.mobile_out);
89 mInoutContainer = findViewById(R.id.inout_container);
90
91 mMobileDrawable = new SignalDrawable(getContext());
92 mMobile.setImageDrawable(mMobileDrawable);
93 }
94
95 public void applyMobileState(MobileIconState state) {
96 if (state == null) {
97 setVisibility(View.GONE);
98 mState = null;
99 return;
100 }
101
102 if (mState == null) {
103 mState = state;
104 initViewState();
105 return;
106 }
107
108 if (!mState.equals(state)) {
109 updateState(state);
110 }
111 }
112
113 private void initViewState() {
114 setContentDescription(mState.contentDescription);
115 if (!mState.visible) {
116 setVisibility(View.GONE);
117 } else {
118 setVisibility(View.VISIBLE);
119 }
120 mMobileDrawable.setLevel(mState.strengthId);
121 if (mState.typeId > 0) {
122 mMobileType.setContentDescription(mState.typeContentDescription);
123 mMobileType.setImageResource(mState.typeId);
124 mMobileType.setVisibility(View.VISIBLE);
125 } else {
126 mMobileType.setVisibility(View.GONE);
127 }
128
129 mMobileRoaming.setVisibility(mState.roaming ? View.VISIBLE : View.GONE);
130 mMobileRoamingSpace.setVisibility(mState.roaming ? View.VISIBLE : View.GONE);
131 mIn.setVisibility(mState.activityIn ? View.VISIBLE : View.GONE);
132 mOut.setVisibility(mState.activityIn ? View.VISIBLE : View.GONE);
133 mInoutContainer.setVisibility((mState.activityIn || mState.activityOut)
134 ? View.VISIBLE : View.GONE);
135 }
136
137 private void updateState(MobileIconState state) {
138 setContentDescription(state.contentDescription);
139 if (mState.visible != state.visible) {
140 setVisibility(state.visible ? View.VISIBLE : View.GONE);
141 }
142 if (mState.strengthId != state.strengthId) {
143 mMobileDrawable.setLevel(state.strengthId);
144 }
Evan Laird6dedbe62018-04-05 16:22:36 -0400145 if (mState.typeId != state.typeId) {
146 if (state.typeId != 0) {
147 mMobileType.setContentDescription(state.typeContentDescription);
148 mMobileType.setImageResource(state.typeId);
149 mMobileType.setVisibility(View.VISIBLE);
150 } else {
151 mMobileType.setVisibility(View.GONE);
152 }
Evan Lairde1d13c92018-03-20 16:58:01 -0400153 }
154
155 mMobileRoaming.setVisibility(state.roaming ? View.VISIBLE : View.GONE);
156 mMobileRoamingSpace.setVisibility(state.roaming ? View.VISIBLE : View.GONE);
157 mIn.setVisibility(state.activityIn ? View.VISIBLE : View.GONE);
158 mOut.setVisibility(state.activityIn ? View.VISIBLE : View.GONE);
159 mInoutContainer.setVisibility((state.activityIn || state.activityOut)
160 ? View.VISIBLE : View.GONE);
161
162 mState = state;
163 }
164
165 @Override
166 public void onDarkChanged(Rect area, float darkIntensity, int tint) {
Evan Lairddbeefe32018-04-03 16:52:41 -0400167 if (!isInArea(area, this)) {
168 return;
169 }
Evan Lairde1d13c92018-03-20 16:58:01 -0400170 mMobileDrawable.setDarkIntensity(darkIntensity);
171 ColorStateList color = ColorStateList.valueOf(getTint(area, this, tint));
172 mIn.setImageTintList(color);
173 mOut.setImageTintList(color);
174 mMobileType.setImageTintList(color);
175 mMobileRoaming.setImageTintList(color);
176 }
177
178 @Override
179 public String getSlot() {
180 return mSlot;
181 }
182
183 public void setSlot(String slot) {
184 mSlot = slot;
185 }
186
187 @Override
188 public void setStaticDrawableColor(int color) {
189 ColorStateList list = ColorStateList.valueOf(color);
190 float intensity = color == Color.WHITE ? 0 : 1;
191 mMobileDrawable.setDarkIntensity(intensity);
192
193 mIn.setImageTintList(list);
194 mOut.setImageTintList(list);
195 mMobileType.setImageTintList(list);
196 mMobileRoaming.setImageTintList(list);
197 }
198
199 @Override
Evan Laird20b87bf2018-04-12 09:54:11 -0400200 public void setDecorColor(int color) {
201 //TODO: May also not be needed
202 }
203
204 @Override
Evan Lairde1d13c92018-03-20 16:58:01 -0400205 public boolean isIconVisible() {
206 return mState.visible;
207 }
208
Evan Laird20b87bf2018-04-12 09:54:11 -0400209 @Override
210 public void setVisibleState(int state) {
211 //TODO: May not be needed. Mobile is always expected to be visible (not a dot)
212 }
213
Evan Lairde1d13c92018-03-20 16:58:01 -0400214 @VisibleForTesting
215 public MobileIconState getState() {
216 return mState;
217 }
218
219 @Override
220 public String toString() {
221 return "StatusBarMobileView(slot=" + mSlot + " state=" + mState + ")";
222 }
223}