blob: f5d4889f1e15b4ce572ecf41f2c323dcda458c1b [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar;
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.NetworkControllerImpl;
// Intimately tied to the design of res/layout/signal_cluster_view.xml
public class SignalClusterView
extends LinearLayout
implements NetworkControllerImpl.SignalCluster {
static final boolean DEBUG = false;
static final String TAG = "SignalClusterView";
static final PorterDuffColorFilter PROBLEM_FILTER
= new PorterDuffColorFilter(0xffab653b, PorterDuff.Mode.SRC_ATOP);
NetworkControllerImpl mNC;
private boolean mWifiVisible = false;
private int mWifiStrengthId = 0;
private boolean mInetProblem;
private boolean mMobileVisible = false;
private int mMobileStrengthId = 0, mMobileTypeId = 0;
private boolean mIsAirplaneMode = false;
private int mAirplaneIconId = 0;
private String mWifiDescription, mMobileDescription, mMobileTypeDescription;
ViewGroup mWifiGroup, mMobileGroup;
ImageView mWifi, mMobile, mMobileType, mAirplane;
View mSpacer;
public SignalClusterView(Context context) {
this(context, null);
}
public SignalClusterView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SignalClusterView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setNetworkController(NetworkControllerImpl nc) {
if (DEBUG) Log.d(TAG, "NetworkController=" + nc);
mNC = nc;
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mWifiGroup = (ViewGroup) findViewById(R.id.wifi_combo);
mWifi = (ImageView) findViewById(R.id.wifi_signal);
mMobileGroup = (ViewGroup) findViewById(R.id.mobile_combo);
mMobile = (ImageView) findViewById(R.id.mobile_signal);
mMobileType = (ImageView) findViewById(R.id.mobile_type);
mSpacer = findViewById(R.id.spacer);
mAirplane = (ImageView) findViewById(R.id.airplane);
apply();
}
@Override
protected void onDetachedFromWindow() {
mWifiGroup = null;
mWifi = null;
mMobileGroup = null;
mMobile = null;
mMobileType = null;
mSpacer = null;
mAirplane = null;
super.onDetachedFromWindow();
}
@Override
public void setWifiIndicators(boolean visible, int strengthIcon, boolean problem,
String contentDescription) {
mWifiVisible = visible;
mWifiStrengthId = strengthIcon;
mInetProblem = problem;
mWifiDescription = contentDescription;
apply();
}
@Override
public void setMobileDataIndicators(boolean visible, int strengthIcon, boolean problem,
int typeIcon, String contentDescription, String typeContentDescription) {
mMobileVisible = visible;
mMobileStrengthId = strengthIcon;
mInetProblem = problem;
mMobileTypeId = typeIcon;
mMobileDescription = contentDescription;
mMobileTypeDescription = typeContentDescription;
apply();
}
@Override
public void setIsAirplaneMode(boolean is, int airplaneIconId) {
mIsAirplaneMode = is;
mAirplaneIconId = airplaneIconId;
apply();
}
@Override
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
// Standard group layout onPopulateAccessibilityEvent() implementations
// ignore content description, so populate manually
if (mWifiVisible && mWifiGroup != null && mWifiGroup.getContentDescription() != null)
event.getText().add(mWifiGroup.getContentDescription());
if (mMobileVisible && mMobileGroup != null && mMobileGroup.getContentDescription() != null)
event.getText().add(mMobileGroup.getContentDescription());
return super.dispatchPopulateAccessibilityEvent(event);
}
@Override
public void onRtlPropertiesChanged(int layoutDirection) {
super.onRtlPropertiesChanged(layoutDirection);
if (mWifi != null) {
mWifi.setImageDrawable(null);
}
if (mMobile != null) {
mMobile.setImageDrawable(null);
}
if (mMobileType != null) {
mMobileType.setImageDrawable(null);
}
if(mAirplane != null) {
mAirplane.setImageDrawable(null);
}
apply();
}
private void applyInetProblem(ImageView iv) {
iv.setColorFilter(Build.IS_DEBUGGABLE && mInetProblem ? PROBLEM_FILTER : null);
}
// Run after each indicator change.
private void apply() {
if (mWifiGroup == null) return;
if (mWifiVisible) {
mWifi.setImageResource(mWifiStrengthId);
applyInetProblem(mWifi);
mWifiGroup.setContentDescription(mWifiDescription);
mWifiGroup.setVisibility(View.VISIBLE);
} else {
mWifiGroup.setVisibility(View.GONE);
}
if (DEBUG) Log.d(TAG,
String.format("wifi: %s sig=%d",
(mWifiVisible ? "VISIBLE" : "GONE"),
mWifiStrengthId));
if (mMobileVisible && !mIsAirplaneMode) {
mMobile.setImageResource(mMobileStrengthId);
mMobileType.setImageResource(mMobileTypeId);
applyInetProblem(mMobile);
mMobileGroup.setContentDescription(mMobileTypeDescription + " " + mMobileDescription);
mMobileGroup.setVisibility(View.VISIBLE);
} else {
mMobileGroup.setVisibility(View.GONE);
}
if (mIsAirplaneMode) {
mAirplane.setImageResource(mAirplaneIconId);
mAirplane.setVisibility(View.VISIBLE);
} else {
mAirplane.setVisibility(View.GONE);
}
if (mMobileVisible && mWifiVisible && mIsAirplaneMode) {
mSpacer.setVisibility(View.INVISIBLE);
} else {
mSpacer.setVisibility(View.GONE);
}
if (DEBUG) Log.d(TAG,
String.format("mobile: %s sig=%d typ=%d",
(mMobileVisible ? "VISIBLE" : "GONE"),
mMobileStrengthId, mMobileTypeId));
mMobileType.setVisibility(
!mWifiVisible ? View.VISIBLE : View.GONE);
}
}