在 SystemUI 的 Statusbar 中 添加 ethernet status icon

来源:互联网 发布:云存储软件 编辑:程序博客网 时间:2024/06/08 09:28

由于源处网站被360安全警告提示,有广告或木码,所以就不贴出源处了,请谅解

涉及的源代码主要是 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java


这个代码里 集成了 3G, wifi, bluetooth, wimax 还有电池量 等信号的 状态显示功能,所以ethernet status icon也添加到这里来了。

1. NetworkController 类:

/** * Construct this controller object and register for updates. */ public NetworkController(Context context) {    mContext = context;     final Resources res = context.getResources();     ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService( Context.CONNECTIVITY_SERVICE);     //mHasMobileDataFeature = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE); //这里把mobile注销了     mEthernetConnected = cm.isNetworkSupported(ConnectivityManager.TYPE_ETHERNET); //添加ethernet功能     mShowPhoneRSSIForData = res.getBoolean(R.bool.config_showPhoneRSSIForData);     mShowAtLeastThreeGees = res.getBoolean(R.bool.config_showMin3G);     mAlwaysShowCdmaRssi = res.getBoolean( com.android.internal.R.bool.config_alwaysUseCdmaRssi);     // set up the default wifi icon, used when no radios have ever appeared     updateWifiIcons();     pdateWimaxIcons();     // telephony     mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);     mPhone.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE                                          | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS                                           | PhoneStateListener.LISTEN_CALL_STATE                                          | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE                                          | PhoneStateListener.LISTEN_DATA_ACTIVITY);     mHspaDataDistinguishable = mContext.getResources().getBoolean( R.bool.config_hspa_data_distinguishable);     mNetworkNameSeparator = mContext.getString(R.string.status_bar_network_name_separator);     mNetworkNameDefault = mContext.getString( com.android.internal.R.string.lockscreen_carrier_default);     mNetworkName = mNetworkNameDefault;     // wifi     mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);     Handler handler = new WifiHandler();     mWifiChannel = new AsyncChannel();     Messenger wifiMessenger = mWifiManager.getMessenger();     if (wifiMessenger != null) {        mWifiChannel.connect(mContext, handler, wifiMessenger);     }    // broadcasts     IntentFilter filter = new IntentFilter();     filter.addAction(WifiManager.RSSI_CHANGED_ACTION);     filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);     filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);     filter.addAction(EthernetManager.ETHERNET_STATE_CHANGED_ACTION);     filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);     filter.addAction(Telephony.Intents.SPN_STRINGS_UPDATED_ACTION);     filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);     filter.addAction(ConnectivityManager.INET_CONDITION_ACTION);     filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);     filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);     mWimaxSupported = mContext.getResources().getBoolean( com.android.internal.R.bool.config_wimaxEnabled);     if(mWimaxSupported) {         filter.addAction(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION);         filter.addAction(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION);         filter.addAction(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION);    }     context.registerReceiver(this, filter);     // AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it     updateAirplaneMode();     // yuck     mBatteryStats = BatteryStatsService.getService(); }
2. 这个类的主要运行函数是 onReceive():

    @Override    public void onReceive(Context context, Intent intent) {        final String action = intent.getAction();        if (action.equals(WifiManager.RSSI_CHANGED_ACTION)                || action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)                || action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {            updateWifiState(intent);            refreshViews();  //刷新显示栏        } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {            updateSimState(intent);            updateDataIcon();            refreshViews();        } else if (action.equals(Telephony.Intents.SPN_STRINGS_UPDATED_ACTION)) {            updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false),                        intent.getStringExtra(Telephony.Intents.EXTRA_SPN),                        intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false),                        intent.getStringExtra(Telephony.Intents.EXTRA_PLMN));            refreshViews();        } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION) ||                 action.equals(ConnectivityManager.INET_CONDITION_ACTION)) {            updateConnectivity(intent);  //这个是更新链接状态            refreshViews();        } else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {            refreshViews();        } else if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {            updateAirplaneMode();            refreshViews();        } else if (action.equals(EthernetManager.ETHERNET_STATE_CHANGED_ACTION)) {            updateEth(intent);  //更新网络功能            refreshViews();        } else if (action.equals(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION) ||                action.equals(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION) ||                action.equals(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION)) {            updateWimaxState(intent);            refreshViews();        }    }
3. refreshViews() ,连接状态更新后,要刷新显示内容,这个函数有点长,缩略一下:

// ===== Update the views =======================================================void refreshViews() {    Context context = mContext;     int combinedSignalIconId = 0;     int combinedActivityIconId = 0;     String combinedLabel = "";     String wifiLabel = "";     String mobileLabel = "";     int N;    .............................    if (mEthernetConnected) {        switch (mEthernetActivity) {         //根据mEthernetActiviy 来判断不同的状态,进而显示不同图片         case EthernetStateTracker.EVENT_HW_CONNECTED:         case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_SUCCEEDED:             mEthernetIconId = sEthImages[0];             break;         case EthernetStateTracker.EVENT_HW_DISCONNECTED:         case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_FAILED:             mEthernetIconId = sEthImages[1];             break;         default:             mEthernetIconId = sEthImages[2];         }         combinedActivityIconId = mEthernetIconId;         combinedLabel = "";         combinedSignalIconId = mEthernetIconId;         mContentDescriptionCombinedSignal = "";     }    .............................    if (DEBUG) {            Slog.d(TAG, "refreshViews connected={"                    + (mWifiConnected?" wifi":"")                    + (mDataConnected?" data":"")                    + " } level="                    + ((mSignalStrength == null)?"??":Integer.toString(mSignalStrength.getLevel()))                    + " combinedSignalIconId=0x"                    + Integer.toHexString(combinedSignalIconId)                    + "/" + getResourceName(combinedSignalIconId)                    + " combinedActivityIconId=0x" + Integer.toHexString(combinedActivityIconId)                    + " mAirplaneMode=" + mAirplaneMode                    + " mDataActivity=" + mDataActivity                    + " mPhoneSignalIconId=0x" + Integer.toHexString(mPhoneSignalIconId)                    + " mDataDirectionIconId=0x" + Integer.toHexString(mDataDirectionIconId)                    + " mDataSignalIconId=0x" + Integer.toHexString(mDataSignalIconId)                    + " mDataTypeIconId=0x" + Integer.toHexString(mDataTypeIconId)                    + " mEthernetIconId=0x" + Integer.toHexString(mEthernetIconId)                    + " mWifiIconId=0x" + Integer.toHexString(mWifiIconId)                    + " mBluetoothTetherIconId=0x" + Integer.toHexString(mBluetoothTetherIconId)           );    }     if (mLastPhoneSignalIconId != mPhoneSignalIconId             || mLastDataDirectionOverlayIconId != combinedActivityIconId             || mLastWifiIconId != mWifiIconId             || mLastWimaxIconId != mWimaxIconId             || mLastEthernetIconId != mEthernetIconId             || mLastDataTypeIconId != mDataTypeIconId) {                // NB: the mLast*s will be updated later         for (SignalCluster cluster : mSignalClusters) {            refreshSignalCluster(cluster); //刷新信号簇        }    }    .............................    // the ethernet icon on statusbar     if (mLastEthernetIconId != mEthernetIconId){        mLastEthernetIconId = mEthernetIconId;         N = mEthernetIconViews.size();        for (int i=0; i<N; i++) {            final ImageView v = mEthernetIconViews.get(i);            if (mEthernetIconId == 0) {                v.setVisibility(View.GONE);            } else {                 v.setVisibility(View.VISIBLE); //设为可见                v.setImageResource(mEthernetIconId);//显示图片内容                v.setContentDescription(mContentDescriptionEthernet);//内容描述            }        }    }     // the combinedLabel in the notification panel     if (!mLastCombinedLabel.equals(combinedLabel)) {        mLastCombinedLabel = combinedLabel;         N = mCombinedLabelViews.size();         for (int i=0; i<N; i++) {            TextView v = mCombinedLabelViews.get(i);            v.setText(combinedLabel);        }    }    // wifi label    N = mWifiLabelViews.size();    for (int i=0; i<N; i++) {        TextView v = mWifiLabelViews.get(i);        if ("".equals(wifiLabel)) {            v.setVisibility(View.GONE);        } else {            v.setVisibility(View.VISIBLE);            v.setText(wifiLabel);        }    }     // mobile label     N = mMobileLabelViews.size();     for (int i=0; i<N; i++) {         TextView v = mMobileLabelViews.get(i);         if ("".equals(mobileLabel)) {            v.setVisibility(View.GONE);        } else {            v.setVisibility(View.VISIBLE);            v.setText(mobileLabel);        }    }}
4.  OnReceive() 得到 EthernetManager.ETHERNET_STATE_CHANGED_ACTION 信号后,会运行 updateEth(intent),来更新Ethernet状态:
    private final void updateEth(Intent intent) {        final int event = intent.getIntExtra(EthernetManager.EXTRA_ETHERNET_STATE, EthernetManager.ETHERNET_STATE_UNKNOWN);        switch (event) {            case EthernetStateTracker.EVENT_HW_CONNECTED:            case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_SUCCEEDED:                mEthernetIconId = sEthImages[0];                break;            case EthernetStateTracker.EVENT_HW_DISCONNECTED:            case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_FAILED:                mEthernetIconId = sEthImages[1];                return;            default:                mEthernetIconId = sEthImages[2];        }    }
5. updateConnectivity(Intent intent), onReceive() 得到 ConnectivityManager.CONNECTIVITY_ACTION 信号后,会运行这个函数:
    // ===== Full or limited Internet connectivity ==================================    private void updateConnectivity(Intent intent) {        if (CHATTY) {            Slog.d(TAG, "updateConnectivity: intent=" + intent);        }        NetworkInfo info = (NetworkInfo)(intent.getParcelableExtra(                ConnectivityManager.EXTRA_NETWORK_INFO));        int connectionStatus = intent.getIntExtra(ConnectivityManager.EXTRA_INET_CONDITION, 0);        if (info.isConnected()) {  //通过 ethernetinfo 来判断 ethernet 连接状态            mEthernetActivity = EthernetStateTracker.EVENT_HW_CONNECTED;        } else if (!info.isConnected() && info.isConnectedOrConnecting()) {            mEthernetActivity = EthernetStateTracker.EVENT_DHCP_START;        } else {            mEthernetActivity = EthernetStateTracker.EVENT_HW_DISCONNECTED;        }        Slog.d(TAG, "updateConnectivity: mEthernetActivity = " + mEthernetActivity);        if (CHATTY) {            Slog.d(TAG, "updateConnectivity: networkInfo=" + info);            Slog.d(TAG, "updateConnectivity: connectionStatus=" + connectionStatus);        }        mInetCondition = (connectionStatus > INET_CONDITION_THRESHOLD ? 1 : 0);        if (info != null && info.getType() == ConnectivityManager.TYPE_BLUETOOTH) {            mBluetoothTethered = info.isConnected();        } else {            mBluetoothTethered = false;        }        // We want to update all the icons, all at once, for any condition change        updateDataNetType();        updateWimaxIcons();        updateDataIcon();        updateEthernetIcons(); //更新etherent Icon        updateTelephonySignalStrength();        updateWifiIcons();    }
updateEthernetIcons():
    private void updateEthernetIcons() {        if (mEthernetConnected) {            mEthernetIconId = sEthImages[0];        } else {            mEthernetIconId = sEthImages[1];        }    }




0 0
原创粉丝点击