AccessPointPreference.java revision aaa8a1b54a038424bd3e6590efe52c4fac14143b
198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler/*
298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler * Copyright (C) 2016 The Android Open Source Project
398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler *
498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler * you may not use this file except in compliance with the License.
698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler * You may obtain a copy of the License at
798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler *
898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler *
1098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler * Unless required by applicable law or agreed to in writing, software
1198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
1298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler * See the License for the specific language governing permissions and
1498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler * limitations under the License
1598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler */
1698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerpackage com.android.settingslib.wifi;
1798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
1898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.content.Context;
1998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.content.pm.PackageManager;
202c096596b7042d6870fef38fc886285424653834Stephen Chenimport android.content.res.Resources;
212c096596b7042d6870fef38fc886285424653834Stephen Chenimport android.content.res.TypedArray;
2298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.graphics.drawable.Drawable;
2398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.graphics.drawable.StateListDrawable;
24ed8f5297a36ea7a21cd24a1f2b36b45031b8a50bStephen Chenimport android.net.NetworkBadging;
2598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.net.wifi.WifiConfiguration;
2673938992a819d8c24522054099ff37175c267ab2Sundeep Ghumanimport android.net.wifi.WifiManager;
2798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.os.Looper;
2898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.os.UserHandle;
2998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.support.v7.preference.Preference;
3098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.support.v7.preference.PreferenceViewHolder;
3198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.text.TextUtils;
3298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.util.AttributeSet;
3398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.util.SparseArray;
342c096596b7042d6870fef38fc886285424653834Stephen Chenimport android.widget.ImageView;
3598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport android.widget.TextView;
36bf339f5cc5212aa3fb714a044496788308d53ac7Sundeep Ghuman
3798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerimport com.android.settingslib.R;
38bf339f5cc5212aa3fb714a044496788308d53ac7Sundeep Ghumanimport com.android.settingslib.TronUtils;
39f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghumanimport com.android.settingslib.Utils;
4098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
4198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantlerpublic class AccessPointPreference extends Preference {
4298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
4398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    private static final int[] STATE_SECURED = {
4498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            R.attr.state_encrypted
4598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    };
462c096596b7042d6870fef38fc886285424653834Stephen Chen    private static final int[] STATE_SAVED = {
472c096596b7042d6870fef38fc886285424653834Stephen Chen            R.attr.state_encrypted,
482c096596b7042d6870fef38fc886285424653834Stephen Chen            R.attr.state_saved
492c096596b7042d6870fef38fc886285424653834Stephen Chen    };
5098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
512c096596b7042d6870fef38fc886285424653834Stephen Chen    private static final int[] wifi_friction_attributes = { R.attr.wifi_friction };
5298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
532c096596b7042d6870fef38fc886285424653834Stephen Chen    private final StateListDrawable mFrictionSld;
5498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    private final int mBadgePadding;
5598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    private final UserBadgeCache mBadgeCache;
5698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    private TextView mTitleView;
5745a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez
5898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    private boolean mForSavedNetworks = false;
5998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    private AccessPoint mAccessPoint;
6098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    private Drawable mBadge;
6198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    private int mLevel;
6298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    private CharSequence mContentDescription;
6345a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez    private int mDefaultIconResId;
64699deaf6103d182dbd291ca2b420f30b439753d4Sundeep Ghuman    private int mWifiBadge = NetworkBadging.BADGING_NONE;
6598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
6698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    static final int[] WIFI_CONNECTION_STRENGTH = {
6798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            R.string.accessibility_wifi_one_bar,
6898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            R.string.accessibility_wifi_two_bars,
6998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            R.string.accessibility_wifi_three_bars,
7098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            R.string.accessibility_wifi_signal_full
7198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    };
7298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
7398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    // Used for dummy pref.
7498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    public AccessPointPreference(Context context, AttributeSet attrs) {
7598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        super(context, attrs);
762c096596b7042d6870fef38fc886285424653834Stephen Chen        mFrictionSld = null;
7798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        mBadgePadding = 0;
7898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        mBadgeCache = null;
7998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    }
8098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
8198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    public AccessPointPreference(AccessPoint accessPoint, Context context, UserBadgeCache cache,
8298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            boolean forSavedNetworks) {
8398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        super(context);
842c096596b7042d6870fef38fc886285424653834Stephen Chen        setWidgetLayoutResource(R.layout.access_point_friction_widget);
8598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        mBadgeCache = cache;
8698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        mAccessPoint = accessPoint;
8798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        mForSavedNetworks = forSavedNetworks;
8898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        mAccessPoint.setTag(this);
8998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        mLevel = -1;
9098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
912c096596b7042d6870fef38fc886285424653834Stephen Chen        TypedArray frictionSld;
922c096596b7042d6870fef38fc886285424653834Stephen Chen        try {
932c096596b7042d6870fef38fc886285424653834Stephen Chen            frictionSld = context.getTheme().obtainStyledAttributes(wifi_friction_attributes);
942c096596b7042d6870fef38fc886285424653834Stephen Chen        } catch (Resources.NotFoundException e) {
952c096596b7042d6870fef38fc886285424653834Stephen Chen            // Fallback for platforms that do not need friction icon resources.
962c096596b7042d6870fef38fc886285424653834Stephen Chen            frictionSld = null;
972c096596b7042d6870fef38fc886285424653834Stephen Chen        }
982c096596b7042d6870fef38fc886285424653834Stephen Chen        mFrictionSld = frictionSld != null ? (StateListDrawable) frictionSld.getDrawable(0) : null;
992c096596b7042d6870fef38fc886285424653834Stephen Chen
10098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        // Distance from the end of the title at which this AP's user badge should sit.
10198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        mBadgePadding = context.getResources()
10298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler                .getDimensionPixelSize(R.dimen.wifi_preference_badge_padding);
10398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        refresh();
10498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    }
10598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
10645a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez    public AccessPointPreference(AccessPoint accessPoint, Context context, UserBadgeCache cache,
10745a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez            int iconResId, boolean forSavedNetworks) {
10845a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez        super(context);
1092c096596b7042d6870fef38fc886285424653834Stephen Chen        setWidgetLayoutResource(R.layout.access_point_friction_widget);
11045a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez        mBadgeCache = cache;
11145a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez        mAccessPoint = accessPoint;
11245a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez        mForSavedNetworks = forSavedNetworks;
11345a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez        mAccessPoint.setTag(this);
11445a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez        mLevel = -1;
11545a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez        mDefaultIconResId = iconResId;
11645a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez
1172c096596b7042d6870fef38fc886285424653834Stephen Chen        TypedArray frictionSld;
1182c096596b7042d6870fef38fc886285424653834Stephen Chen        try {
1192c096596b7042d6870fef38fc886285424653834Stephen Chen            frictionSld = context.getTheme().obtainStyledAttributes(wifi_friction_attributes);
1202c096596b7042d6870fef38fc886285424653834Stephen Chen        } catch (Resources.NotFoundException e) {
1212c096596b7042d6870fef38fc886285424653834Stephen Chen            // Fallback for platforms that do not need friction icon resources.
1222c096596b7042d6870fef38fc886285424653834Stephen Chen            frictionSld = null;
1232c096596b7042d6870fef38fc886285424653834Stephen Chen        }
1242c096596b7042d6870fef38fc886285424653834Stephen Chen        mFrictionSld = frictionSld != null ? (StateListDrawable) frictionSld.getDrawable(0) : null;
1252c096596b7042d6870fef38fc886285424653834Stephen Chen
12645a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez        // Distance from the end of the title at which this AP's user badge should sit.
12745a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez        mBadgePadding = context.getResources()
12845a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez                .getDimensionPixelSize(R.dimen.wifi_preference_badge_padding);
12945a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez    }
13045a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez
13198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    public AccessPoint getAccessPoint() {
13298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        return mAccessPoint;
13398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    }
13498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
13598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    @Override
13698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    public void onBindViewHolder(final PreferenceViewHolder view) {
13798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        super.onBindViewHolder(view);
13898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        if (mAccessPoint == null) {
13998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            // Used for dummy pref.
14098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            return;
14198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
14298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        Drawable drawable = getIcon();
14398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        if (drawable != null) {
14498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            drawable.setLevel(mLevel);
14598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
14698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
14798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        mTitleView = (TextView) view.findViewById(com.android.internal.R.id.title);
14898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        if (mTitleView != null) {
14998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            // Attach to the end of the title view
15098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            mTitleView.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, mBadge, null);
15198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            mTitleView.setCompoundDrawablePadding(mBadgePadding);
15298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
15398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        view.itemView.setContentDescription(mContentDescription);
1542c096596b7042d6870fef38fc886285424653834Stephen Chen
1552c096596b7042d6870fef38fc886285424653834Stephen Chen        if (!mForSavedNetworks) {
1562c096596b7042d6870fef38fc886285424653834Stephen Chen            ImageView frictionImageView = (ImageView) view.findViewById(R.id.friction_icon);
1572c096596b7042d6870fef38fc886285424653834Stephen Chen            bindFrictionImage(frictionImageView);
1582c096596b7042d6870fef38fc886285424653834Stephen Chen        }
15998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    }
16098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
16198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    protected void updateIcon(int level, Context context) {
16298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        if (level == -1) {
16345a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez            safeSetDefaultIcon();
164ed8f5297a36ea7a21cd24a1f2b36b45031b8a50bStephen Chen            return;
165ed8f5297a36ea7a21cd24a1f2b36b45031b8a50bStephen Chen        }
166ed8f5297a36ea7a21cd24a1f2b36b45031b8a50bStephen Chen        TronUtils.logWifiSettingsBadge(context, mWifiBadge);
167ed8f5297a36ea7a21cd24a1f2b36b45031b8a50bStephen Chen        Drawable drawable = NetworkBadging.getWifiIcon(level, mWifiBadge, getContext().getTheme());
168ed8f5297a36ea7a21cd24a1f2b36b45031b8a50bStephen Chen        if (!mForSavedNetworks && drawable != null) {
169ed8f5297a36ea7a21cd24a1f2b36b45031b8a50bStephen Chen            drawable.setTint(Utils.getColorAccent(getContext()));
170ed8f5297a36ea7a21cd24a1f2b36b45031b8a50bStephen Chen            setIcon(drawable);
17198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        } else {
172ed8f5297a36ea7a21cd24a1f2b36b45031b8a50bStephen Chen            safeSetDefaultIcon();
17398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
17498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    }
17598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
1762c096596b7042d6870fef38fc886285424653834Stephen Chen    /**
1772c096596b7042d6870fef38fc886285424653834Stephen Chen     * Binds the friction icon drawable using a StateListDrawable.
1782c096596b7042d6870fef38fc886285424653834Stephen Chen     *
1792c096596b7042d6870fef38fc886285424653834Stephen Chen     * <p>Friction icons will be rebound when notifyChange() is called, and therefore
1802c096596b7042d6870fef38fc886285424653834Stephen Chen     * do not need to be managed in refresh()</p>.
1812c096596b7042d6870fef38fc886285424653834Stephen Chen     */
1822c096596b7042d6870fef38fc886285424653834Stephen Chen    private void bindFrictionImage(ImageView frictionImageView) {
1832c096596b7042d6870fef38fc886285424653834Stephen Chen        if (frictionImageView == null || mFrictionSld == null) {
1842c096596b7042d6870fef38fc886285424653834Stephen Chen            return;
1852c096596b7042d6870fef38fc886285424653834Stephen Chen        }
1862c096596b7042d6870fef38fc886285424653834Stephen Chen        if (mAccessPoint.getSecurity() != AccessPoint.SECURITY_NONE) {
1872c096596b7042d6870fef38fc886285424653834Stephen Chen            if (mAccessPoint.isSaved()) {
1882c096596b7042d6870fef38fc886285424653834Stephen Chen                mFrictionSld.setState(STATE_SAVED);
1892c096596b7042d6870fef38fc886285424653834Stephen Chen            } else {
1902c096596b7042d6870fef38fc886285424653834Stephen Chen                mFrictionSld.setState(STATE_SECURED);
1912c096596b7042d6870fef38fc886285424653834Stephen Chen            }
1922c096596b7042d6870fef38fc886285424653834Stephen Chen        }
1932c096596b7042d6870fef38fc886285424653834Stephen Chen        Drawable drawable = mFrictionSld.getCurrent();
1942c096596b7042d6870fef38fc886285424653834Stephen Chen        frictionImageView.setImageDrawable(drawable);
1952c096596b7042d6870fef38fc886285424653834Stephen Chen    }
1962c096596b7042d6870fef38fc886285424653834Stephen Chen
19745a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez    private void safeSetDefaultIcon() {
19845a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez        if (mDefaultIconResId != 0) {
19945a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez            setIcon(mDefaultIconResId);
20045a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez        } else {
20145a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez            setIcon(null);
20245a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez        }
20345a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez    }
20445a1594247eecf02d64f6b95b19a6843f298d0e7Salvador Martinez
20598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    protected void updateBadge(Context context) {
20698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        WifiConfiguration config = mAccessPoint.getConfig();
20798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        if (config != null) {
20898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            // Fetch badge (may be null)
20998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            // Get the badge using a cache since the PM will ask the UserManager for the list
21098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            // of profiles every time otherwise.
21198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            mBadge = mBadgeCache.getUserBadge(config.creatorUid);
21298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
21398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    }
21498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
21598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    /**
21698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler     * Updates the title and summary; may indirectly call notifyChanged().
21798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler     */
21898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    public void refresh() {
21998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        if (mForSavedNetworks) {
22098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            setTitle(mAccessPoint.getConfigName());
22198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        } else {
22298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            setTitle(mAccessPoint.getSsid());
22398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
22498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
22598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        final Context context = getContext();
226aaa8a1b54a038424bd3e6590efe52c4fac14143bSundeep Ghuman        int level = mAccessPoint.getLevel();
227f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman        int wifiBadge = mAccessPoint.getBadge();
228f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman        if (level != mLevel || wifiBadge != mWifiBadge) {
22998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            mLevel = level;
230f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman            mWifiBadge = wifiBadge;
23198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            updateIcon(mLevel, context);
2328897a5044b6e2612c80fecb72de031027229c2a0Julia Reynolds            notifyChanged();
23398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
234f84e0573fc61ff36bc29b731574a11530c00538aSundeep Ghuman
23598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        updateBadge(context);
23698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
23798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        setSummary(mForSavedNetworks ? mAccessPoint.getSavedNetworkSummary()
23898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler                : mAccessPoint.getSettingsSummary());
23998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
2408897a5044b6e2612c80fecb72de031027229c2a0Julia Reynolds        mContentDescription = getTitle();
24198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        if (getSummary() != null) {
2428897a5044b6e2612c80fecb72de031027229c2a0Julia Reynolds            mContentDescription = TextUtils.concat(mContentDescription, ",", getSummary());
24398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
24498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        if (level >= 0 && level < WIFI_CONNECTION_STRENGTH.length) {
2458897a5044b6e2612c80fecb72de031027229c2a0Julia Reynolds            mContentDescription = TextUtils.concat(mContentDescription, ",",
24698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler                    getContext().getString(WIFI_CONNECTION_STRENGTH[level]));
24798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
24898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    }
24998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
25098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    @Override
25198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    protected void notifyChanged() {
25298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        if (Looper.getMainLooper() != Looper.myLooper()) {
25398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            // Let our BG thread callbacks call setTitle/setSummary.
25498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            postNotifyChanged();
25598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        } else {
25698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            super.notifyChanged();
25798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
25898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    }
25998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
26098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    public void onLevelChanged() {
26198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        postNotifyChanged();
26298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    }
26398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
26498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    private void postNotifyChanged() {
26598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        if (mTitleView != null) {
26698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            mTitleView.post(mNotifyChanged);
26798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        } // Otherwise we haven't been bound yet, and don't need to update.
26898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    }
26998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
27098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    private final Runnable mNotifyChanged = new Runnable() {
27198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        @Override
27298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        public void run() {
27398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            notifyChanged();
27498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
27598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    };
27698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
27798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    public static class UserBadgeCache {
27898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        private final SparseArray<Drawable> mBadges = new SparseArray<>();
27998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        private final PackageManager mPm;
28098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
28198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        public UserBadgeCache(PackageManager pm) {
28298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            mPm = pm;
28398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
28498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler
28598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        private Drawable getUserBadge(int userId) {
28698608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            int index = mBadges.indexOfKey(userId);
28798608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            if (index < 0) {
28898608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler                Drawable badge = mPm.getUserBadgeForDensity(new UserHandle(userId), 0 /* dpi */);
28998608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler                mBadges.put(userId, badge);
29098608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler                return badge;
29198608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            }
29298608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler            return mBadges.valueAt(index);
29398608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler        }
29498608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler    }
29598608e43ebec9999a5e20d9c36b6bbb387cf56fcTony Mantler}
296