1 /* 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 17 package com.android.systemui.statusbar; 18 19 import static com.android.systemui.plugins.DarkIconDispatcher.getTint; 20 import static com.android.systemui.statusbar.StatusBarIconView.STATE_DOT; 21 import static com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN; 22 import static com.android.systemui.statusbar.StatusBarIconView.STATE_ICON; 23 24 import android.content.Context; 25 import android.content.res.ColorStateList; 26 import android.graphics.Rect; 27 import android.util.AttributeSet; 28 import android.view.Gravity; 29 import android.view.LayoutInflater; 30 import android.view.View; 31 import android.widget.ImageView; 32 import android.widget.LinearLayout; 33 34 import com.android.systemui.R; 35 import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; 36 import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState; 37 38 import java.util.ArrayList; 39 40 /** 41 * Start small: StatusBarWifiView will be able to layout from a WifiIconState 42 */ 43 public class StatusBarWifiView extends BaseStatusBarFrameLayout implements DarkReceiver { 44 private static final String TAG = "StatusBarWifiView"; 45 46 /// Used to show etc dots 47 private StatusBarIconView mDotView; 48 /// Contains the main icon layout 49 private LinearLayout mWifiGroup; 50 private ImageView mWifiIcon; 51 private ImageView mIn; 52 private ImageView mOut; 53 private View mInoutContainer; 54 private View mSignalSpacer; 55 private View mAirplaneSpacer; 56 private WifiIconState mState; 57 private String mSlot; 58 @StatusBarIconView.VisibleState 59 private int mVisibleState = STATE_HIDDEN; 60 fromContext(Context context, String slot)61 public static StatusBarWifiView fromContext(Context context, String slot) { 62 LayoutInflater inflater = LayoutInflater.from(context); 63 StatusBarWifiView v = (StatusBarWifiView) inflater.inflate(R.layout.status_bar_wifi_group, null); 64 v.setSlot(slot); 65 v.init(); 66 v.setVisibleState(STATE_ICON); 67 return v; 68 } 69 StatusBarWifiView(Context context)70 public StatusBarWifiView(Context context) { 71 super(context); 72 } 73 StatusBarWifiView(Context context, AttributeSet attrs)74 public StatusBarWifiView(Context context, AttributeSet attrs) { 75 super(context, attrs); 76 } 77 StatusBarWifiView(Context context, AttributeSet attrs, int defStyleAttr)78 public StatusBarWifiView(Context context, AttributeSet attrs, int defStyleAttr) { 79 super(context, attrs, defStyleAttr); 80 } 81 setSlot(String slot)82 public void setSlot(String slot) { 83 mSlot = slot; 84 } 85 86 @Override setStaticDrawableColor(int color)87 public void setStaticDrawableColor(int color) { 88 ColorStateList list = ColorStateList.valueOf(color); 89 mWifiIcon.setImageTintList(list); 90 mIn.setImageTintList(list); 91 mOut.setImageTintList(list); 92 mDotView.setDecorColor(color); 93 } 94 95 @Override setDecorColor(int color)96 public void setDecorColor(int color) { 97 mDotView.setDecorColor(color); 98 } 99 100 @Override getSlot()101 public String getSlot() { 102 return mSlot; 103 } 104 105 @Override isIconVisible()106 public boolean isIconVisible() { 107 return mState != null && mState.visible; 108 } 109 110 @Override setVisibleState(@tatusBarIconView.VisibleState int state, boolean animate)111 public void setVisibleState(@StatusBarIconView.VisibleState int state, boolean animate) { 112 if (state == mVisibleState) { 113 return; 114 } 115 mVisibleState = state; 116 117 switch (state) { 118 case STATE_ICON: 119 mWifiGroup.setVisibility(View.VISIBLE); 120 mDotView.setVisibility(View.GONE); 121 break; 122 case STATE_DOT: 123 mWifiGroup.setVisibility(View.GONE); 124 mDotView.setVisibility(View.VISIBLE); 125 break; 126 case STATE_HIDDEN: 127 default: 128 mWifiGroup.setVisibility(View.GONE); 129 mDotView.setVisibility(View.GONE); 130 break; 131 } 132 } 133 134 @Override 135 @StatusBarIconView.VisibleState getVisibleState()136 public int getVisibleState() { 137 return mVisibleState; 138 } 139 140 @Override getDrawingRect(Rect outRect)141 public void getDrawingRect(Rect outRect) { 142 super.getDrawingRect(outRect); 143 float translationX = getTranslationX(); 144 float translationY = getTranslationY(); 145 outRect.left += translationX; 146 outRect.right += translationX; 147 outRect.top += translationY; 148 outRect.bottom += translationY; 149 } 150 init()151 private void init() { 152 mWifiGroup = findViewById(R.id.wifi_group); 153 mWifiIcon = findViewById(R.id.wifi_signal); 154 mIn = findViewById(R.id.wifi_in); 155 mOut = findViewById(R.id.wifi_out); 156 mSignalSpacer = findViewById(R.id.wifi_signal_spacer); 157 mAirplaneSpacer = findViewById(R.id.wifi_airplane_spacer); 158 mInoutContainer = findViewById(R.id.inout_container); 159 160 initDotView(); 161 } 162 initDotView()163 private void initDotView() { 164 mDotView = new StatusBarIconView(mContext, mSlot, null); 165 mDotView.setVisibleState(STATE_DOT); 166 167 int width = mContext.getResources().getDimensionPixelSize(R.dimen.status_bar_icon_size); 168 LayoutParams lp = new LayoutParams(width, width); 169 lp.gravity = Gravity.CENTER_VERTICAL | Gravity.START; 170 addView(mDotView, lp); 171 } 172 applyWifiState(WifiIconState state)173 public void applyWifiState(WifiIconState state) { 174 boolean requestLayout = false; 175 176 if (state == null) { 177 requestLayout = getVisibility() != View.GONE; 178 setVisibility(View.GONE); 179 mState = null; 180 } else if (mState == null) { 181 requestLayout = true; 182 mState = state.copy(); 183 initViewState(); 184 } else if (!mState.equals(state)) { 185 requestLayout = updateState(state.copy()); 186 } 187 188 if (requestLayout) { 189 requestLayout(); 190 } 191 } 192 updateState(WifiIconState state)193 private boolean updateState(WifiIconState state) { 194 setContentDescription(state.contentDescription); 195 if (mState.resId != state.resId && state.resId >= 0) { 196 mWifiIcon.setImageDrawable(mContext.getDrawable(state.resId)); 197 } 198 199 mIn.setVisibility(state.activityIn ? View.VISIBLE : View.GONE); 200 mOut.setVisibility(state.activityOut ? View.VISIBLE : View.GONE); 201 mInoutContainer.setVisibility( 202 (state.activityIn || state.activityOut) ? View.VISIBLE : View.GONE); 203 mAirplaneSpacer.setVisibility(state.airplaneSpacerVisible ? View.VISIBLE : View.GONE); 204 mSignalSpacer.setVisibility(state.signalSpacerVisible ? View.VISIBLE : View.GONE); 205 206 boolean needsLayout = state.activityIn != mState.activityIn 207 ||state.activityOut != mState.activityOut; 208 209 if (mState.visible != state.visible) { 210 needsLayout |= true; 211 setVisibility(state.visible ? View.VISIBLE : View.GONE); 212 } 213 214 mState = state; 215 return needsLayout; 216 } 217 initViewState()218 private void initViewState() { 219 setContentDescription(mState.contentDescription); 220 if (mState.resId >= 0) { 221 mWifiIcon.setImageDrawable(mContext.getDrawable(mState.resId)); 222 } 223 224 mIn.setVisibility(mState.activityIn ? View.VISIBLE : View.GONE); 225 mOut.setVisibility(mState.activityOut ? View.VISIBLE : View.GONE); 226 mInoutContainer.setVisibility( 227 (mState.activityIn || mState.activityOut) ? View.VISIBLE : View.GONE); 228 mAirplaneSpacer.setVisibility(mState.airplaneSpacerVisible ? View.VISIBLE : View.GONE); 229 mSignalSpacer.setVisibility(mState.signalSpacerVisible ? View.VISIBLE : View.GONE); 230 setVisibility(mState.visible ? View.VISIBLE : View.GONE); 231 } 232 233 @Override onDarkChanged(ArrayList<Rect> areas, float darkIntensity, int tint)234 public void onDarkChanged(ArrayList<Rect> areas, float darkIntensity, int tint) { 235 int areaTint = getTint(areas, this, tint); 236 ColorStateList color = ColorStateList.valueOf(areaTint); 237 mWifiIcon.setImageTintList(color); 238 mIn.setImageTintList(color); 239 mOut.setImageTintList(color); 240 mDotView.setDecorColor(areaTint); 241 mDotView.setIconColor(areaTint, false); 242 } 243 244 245 @Override toString()246 public String toString() { 247 return "StatusBarWifiView(slot=" + mSlot + " state=" + mState + ")"; 248 } 249 } 250