blob: afd373ed6321ec1aa2636ffe83211664bdf6bb20 [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;
20
21import android.content.Context;
22import android.content.res.ColorStateList;
23import android.graphics.Rect;
24import android.graphics.drawable.Drawable;
25import android.util.AttributeSet;
26import android.view.ContextThemeWrapper;
27import android.view.LayoutInflater;
28import android.view.View;
29import android.widget.ImageView;
30
31import com.android.keyguard.AlphaOptimizedLinearLayout;
32import com.android.settingslib.Utils;
33import com.android.systemui.R;
34import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
35import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
36
37/**
38 * Start small: StatusBarWifiView will be able to layout from a WifiIconState
39 */
40public class StatusBarWifiView extends AlphaOptimizedLinearLayout implements DarkReceiver,
41 StatusIconDisplayable {
42 private static final String TAG = "StatusBarWifiView";
43
44 private ImageView mWifiIcon;
45 private ImageView mIn;
46 private ImageView mOut;
47 private View mInoutContainer;
48 private View mSignalSpacer;
49 private View mAirplaneSpacer;
50 private WifiIconState mState;
51 private String mSlot;
52 private float mDarkIntensity = 0;
53
54 private ContextThemeWrapper mDarkContext;
55 private ContextThemeWrapper mLightContext;
56
57 public static StatusBarWifiView fromContext(Context context) {
58 LayoutInflater inflater = LayoutInflater.from(context);
59 return (StatusBarWifiView) inflater.inflate(R.layout.status_bar_wifi_group, null);
60 }
61
62 public StatusBarWifiView(Context context) {
63 super(context);
64 }
65
66 public StatusBarWifiView(Context context, AttributeSet attrs) {
67 super(context, attrs);
68 }
69
70 public StatusBarWifiView(Context context, AttributeSet attrs, int defStyleAttr) {
71 super(context, attrs, defStyleAttr);
72 }
73
74 public StatusBarWifiView(Context context, AttributeSet attrs, int defStyleAttr,
75 int defStyleRes) {
76 super(context, attrs, defStyleAttr, defStyleRes);
77 }
78
79 @Override
80 protected void onFinishInflate() {
81 super.onFinishInflate();
82 init();
83 }
84
85 public void setSlot(String slot) {
86 mSlot = slot;
87 }
88
89 @Override
90 public void setStaticDrawableColor(int color) {
91 ColorStateList list = ColorStateList.valueOf(color);
92 mWifiIcon.setImageTintList(list);
93 mIn.setImageTintList(list);
94 mOut.setImageTintList(list);
95 }
96
97 @Override
98 public String getSlot() {
99 return mSlot;
100 }
101
102 @Override
103 public boolean isIconVisible() {
104 return mState != null && mState.visible;
105 }
106
107 private void init() {
108 int dualToneLightTheme = Utils.getThemeAttr(mContext, R.attr.lightIconTheme);
109 int dualToneDarkTheme = Utils.getThemeAttr(mContext, R.attr.darkIconTheme);
110 mLightContext = new ContextThemeWrapper(mContext, dualToneLightTheme);
111 mDarkContext = new ContextThemeWrapper(mContext, dualToneDarkTheme);
112
113 mWifiIcon = findViewById(R.id.wifi_signal);
114 mIn = findViewById(R.id.wifi_in);
115 mOut = findViewById(R.id.wifi_out);
116 mSignalSpacer = findViewById(R.id.wifi_signal_spacer);
117 mAirplaneSpacer = findViewById(R.id.wifi_airplane_spacer);
118 mInoutContainer = findViewById(R.id.inout_container);
119 }
120
121 public void applyWifiState(WifiIconState state) {
122 if (state == null) {
123 setVisibility(View.GONE);
124 mState = null;
125 return;
126 }
127
128 if (mState == null) {
129 mState = state;
130 initViewState();
131 }
132
133 if (!mState.equals(state)) {
134 updateState(state);
135 }
136 }
137
138 private void updateState(WifiIconState state) {
139 if (mState.resId != state.resId && state.resId >= 0) {
140 NeutralGoodDrawable drawable = NeutralGoodDrawable
141 .create(mLightContext, mDarkContext, state.resId);
142 drawable.setDarkIntensity(mDarkIntensity);
143 mWifiIcon.setImageDrawable(drawable);
144 }
145
146 mIn.setVisibility(state.activityIn ? View.VISIBLE : View.GONE);
147 mOut.setVisibility(state.activityOut ? View.VISIBLE : View.GONE);
148 mInoutContainer.setVisibility(
149 (state.activityIn || state.activityOut) ? View.VISIBLE : View.GONE);
150 mAirplaneSpacer.setVisibility(state.airplaneSpacerVisible ? View.VISIBLE : View.GONE);
151 mSignalSpacer.setVisibility(state.signalSpacerVisible ? View.VISIBLE : View.GONE);
152 if (mState.visible != state.visible) {
153 setVisibility(state.visible ? View.VISIBLE : View.GONE);
154 }
155
156 mState = state;
157 }
158
159 private void initViewState() {
160 if (mState.resId >= 0) {
161 NeutralGoodDrawable drawable = NeutralGoodDrawable.create(
162 mLightContext, mDarkContext, mState.resId);
163 drawable.setDarkIntensity(mDarkIntensity);
164 mWifiIcon.setImageDrawable(drawable);
165 }
166
167 mIn.setVisibility(mState.activityIn ? View.VISIBLE : View.GONE);
168 mOut.setVisibility(mState.activityOut ? View.VISIBLE : View.GONE);
169 mInoutContainer.setVisibility(
170 (mState.activityIn || mState.activityOut) ? View.VISIBLE : View.GONE);
171 mAirplaneSpacer.setVisibility(mState.airplaneSpacerVisible ? View.VISIBLE : View.GONE);
172 mSignalSpacer.setVisibility(mState.signalSpacerVisible ? View.VISIBLE : View.GONE);
173 setVisibility(mState.visible ? View.VISIBLE : View.GONE);
174 }
175
176 @Override
177 public void onDarkChanged(Rect area, float darkIntensity, int tint) {
178 mDarkIntensity = darkIntensity;
179 Drawable d = mWifiIcon.getDrawable();
180 if (d instanceof NeutralGoodDrawable) {
181 ((NeutralGoodDrawable)d).setDarkIntensity(darkIntensity);
182 }
183 mIn.setImageTintList(ColorStateList.valueOf(getTint(area, this, tint)));
184 mOut.setImageTintList(ColorStateList.valueOf(getTint(area, this, tint)));
185 }
186
187
188 @Override
189 public String toString() {
190 return "StatusBarWifiView(slot=" + mSlot + " state=" + mState + ")";
191 }
192}