12e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson/*
22e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * Copyright (C) 2011 The Android Open Source Project
32e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson *
42e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * Licensed under the Apache License, Version 2.0 (the "License");
52e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * you may not use this file except in compliance with the License.
62e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * You may obtain a copy of the License at
72e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson *
82e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson *      http://www.apache.org/licenses/LICENSE-2.0
92e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson *
102e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * Unless required by applicable law or agreed to in writing, software
112e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * distributed under the License is distributed on an "AS IS" BASIS,
122e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * See the License for the specific language governing permissions and
142e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * limitations under the License.
152e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson */
162e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
172e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonpackage com.android.systemui.statusbar;
182e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
192e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.content.Context;
202e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.util.AttributeSet;
2128f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandlerimport android.util.Slog;
222e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.view.View;
232e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.view.ViewGroup;
242f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlockimport android.view.accessibility.AccessibilityEvent;
252e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.widget.ImageView;
262e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.widget.LinearLayout;
272e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
282e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport com.android.systemui.statusbar.policy.NetworkController;
292e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
302e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport com.android.systemui.R;
312e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
325ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler// Intimately tied to the design of res/layout/signal_cluster_view.xml
332e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonpublic class SignalClusterView
342f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock        extends LinearLayout
352e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        implements NetworkController.SignalCluster {
362e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
3728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    static final boolean DEBUG = false;
3828f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    static final String TAG = "SignalClusterView";
392f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock
402e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    NetworkController mNC;
412e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
4228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    private boolean mWifiVisible = false;
4328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    private int mWifiStrengthId = 0, mWifiActivityId = 0;
4428f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    private boolean mMobileVisible = false;
4528f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    private int mMobileStrengthId = 0, mMobileActivityId = 0, mMobileTypeId = 0;
465ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler    private boolean mIsAirplaneMode = false;
47061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    private int mAirplaneIconId = 0;
48bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler    private String mWifiDescription, mMobileDescription, mMobileTypeDescription;
4928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
502e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    ViewGroup mWifiGroup, mMobileGroup;
51061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    ImageView mWifi, mMobile, mWifiActivity, mMobileActivity, mMobileType, mAirplane;
525ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler    View mSpacer;
532e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
542e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    public SignalClusterView(Context context) {
552e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        this(context, null);
562e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
572e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
582e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    public SignalClusterView(Context context, AttributeSet attrs) {
592e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        this(context, attrs, 0);
602e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
612e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
622e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    public SignalClusterView(Context context, AttributeSet attrs, int defStyle) {
632e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        super(context, attrs, defStyle);
642e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
652e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
662e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    public void setNetworkController(NetworkController nc) {
6728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        if (DEBUG) Slog.d(TAG, "NetworkController=" + nc);
682e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mNC = nc;
692e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
702e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
712e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    @Override
722e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    protected void onAttachedToWindow() {
732e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        super.onAttachedToWindow();
742e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
752e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mWifiGroup      = (ViewGroup) findViewById(R.id.wifi_combo);
762e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mWifi           = (ImageView) findViewById(R.id.wifi_signal);
772e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mWifiActivity   = (ImageView) findViewById(R.id.wifi_inout);
782e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mMobileGroup    = (ViewGroup) findViewById(R.id.mobile_combo);
792e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mMobile         = (ImageView) findViewById(R.id.mobile_signal);
802e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mMobileActivity = (ImageView) findViewById(R.id.mobile_inout);
812e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mMobileType     = (ImageView) findViewById(R.id.mobile_type);
825ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler        mSpacer         =             findViewById(R.id.spacer);
83061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        mAirplane       = (ImageView) findViewById(R.id.airplane);
8428f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
8528f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        apply();
862e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
872e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
882e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    @Override
892e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    protected void onDetachedFromWindow() {
9028f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mWifiGroup      = null;
9128f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mWifi           = null;
9228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mWifiActivity   = null;
9328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mMobileGroup    = null;
9428f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mMobile         = null;
9528f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mMobileActivity = null;
9628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mMobileType     = null;
97061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        mSpacer         = null;
98061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        mAirplane       = null;
9928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
1002e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        super.onDetachedFromWindow();
1012e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
1022e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
103061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    @Override
104bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler    public void setWifiIndicators(boolean visible, int strengthIcon, int activityIcon,
105bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler            String contentDescription) {
10628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mWifiVisible = visible;
10728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mWifiStrengthId = strengthIcon;
10828f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mWifiActivityId = activityIcon;
109bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler        mWifiDescription = contentDescription;
11028f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
11128f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        apply();
11228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    }
11328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
114061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    @Override
11528f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    public void setMobileDataIndicators(boolean visible, int strengthIcon, int activityIcon,
116bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler            int typeIcon, String contentDescription, String typeContentDescription) {
11728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mMobileVisible = visible;
11828f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mMobileStrengthId = strengthIcon;
11928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mMobileActivityId = activityIcon;
12028f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mMobileTypeId = typeIcon;
121bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler        mMobileDescription = contentDescription;
122bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler        mMobileTypeDescription = typeContentDescription;
12328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
12428f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        apply();
12528f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    }
12628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
127061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    @Override
128061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    public void setIsAirplaneMode(boolean is, int airplaneIconId) {
1295ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler        mIsAirplaneMode = is;
130061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        mAirplaneIconId = airplaneIconId;
131061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn
132061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        apply();
1335ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler    }
1345ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler
1352f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock    @Override
1362f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
1372f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock        // Standard group layout onPopulateAccessibilityEvent() implementations
1382f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock        // ignore content description, so populate manually
1392f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock        if (mWifiVisible && mWifiGroup.getContentDescription() != null)
1402f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock            event.getText().add(mWifiGroup.getContentDescription());
1412f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock        if (mMobileVisible && mMobileGroup.getContentDescription() != null)
1422f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock            event.getText().add(mMobileGroup.getContentDescription());
1432f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock        return super.dispatchPopulateAccessibilityEvent(event);
1442f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock    }
1452f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock
14628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    // Run after each indicator change.
14728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    private void apply() {
1482e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        if (mWifiGroup == null) return;
1492e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
15028f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        if (mWifiVisible) {
1512e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson            mWifiGroup.setVisibility(View.VISIBLE);
15228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler            mWifi.setImageResource(mWifiStrengthId);
15328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler            mWifiActivity.setImageResource(mWifiActivityId);
154bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler            mWifiGroup.setContentDescription(mWifiDescription);
1552e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        } else {
1562e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson            mWifiGroup.setVisibility(View.GONE);
1572e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        }
1582e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
15928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        if (DEBUG) Slog.d(TAG,
16028f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler                String.format("wifi: %s sig=%d act=%d",
16128f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler                    (mWifiVisible ? "VISIBLE" : "GONE"),
16228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler                    mWifiStrengthId, mWifiActivityId));
1632e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
164061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        if (mMobileVisible && !mIsAirplaneMode) {
1652e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson            mMobileGroup.setVisibility(View.VISIBLE);
16628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler            mMobile.setImageResource(mMobileStrengthId);
16728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler            mMobileActivity.setImageResource(mMobileActivityId);
16828f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler            mMobileType.setImageResource(mMobileTypeId);
169bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler            mMobileGroup.setContentDescription(mMobileTypeDescription + " " + mMobileDescription);
1702e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        } else {
1712e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson            mMobileGroup.setVisibility(View.GONE);
1722e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        }
17328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
174061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        if (mIsAirplaneMode) {
175061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn            mAirplane.setVisibility(View.VISIBLE);
176061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn            mAirplane.setImageResource(mAirplaneIconId);
177061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        } else {
178061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn            mAirplane.setVisibility(View.GONE);
179061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        }
180061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn
1815ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler        if (mMobileVisible && mWifiVisible && mIsAirplaneMode) {
1825ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler            mSpacer.setVisibility(View.INVISIBLE);
1835ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler        } else {
1845ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler            mSpacer.setVisibility(View.GONE);
1855ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler        }
1865ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler
18728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        if (DEBUG) Slog.d(TAG,
18828f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler                String.format("mobile: %s sig=%d act=%d typ=%d",
18928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler                    (mMobileVisible ? "VISIBLE" : "GONE"),
19028f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler                    mMobileStrengthId, mMobileActivityId, mMobileTypeId));
19128f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
19228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mMobileType.setVisibility(
19328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler                !mWifiVisible ? View.VISIBLE : View.GONE);
1942e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
1952e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson}
1962e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
197