在 SystemUI 的 Statusbar 中 添加 ethernet status icon

由于源处网站被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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值