在 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
- 在 SystemUI 的 Statusbar 中 添加 ethernet status icon
- SystemUI statusbar 更换自己的UI图标
- MFC在Icon文件夹中添加ico图标的问题
- 如何在MenuItem中添加icon图标
- systemUI之statusBar
- systemui statusbar service 小结
- Andorid SystemUI, StatusBar, Keyguard
- systemUI之statusbar
- iOS自定义statusbar上icon的颜色
- Android 5.1 SystemUi 之 StatusBar的简单分析
- SystemUI源码分析三(StatusBar的加载流程)
- 关于第三方apk如何禁用systemUI的statusbar
- Android 5.1 SystemUi 之 StatusBar的简单分析
- 修改SystemUI下面的com.android.systemui.statusbar.phone.PhoneStatueBar文件里面去掉addIntruderView这句话
- 网站中添加icon
- StatusBar on Dialogs-在VC中为作为主窗口的对话框添加状态栏的几种方法
- 在viewController中隐藏statusBar
- 修改状态栏(StatusBar)图标(icon)(定制自己的状态栏)
- OPC 通信预安装软件介绍(西门子PLC与上位机PC之间的通信)
- 接口和抽象类有什么区别
- vector的创建和使用
- HDU 5428 The Factor
- hdu 5431 AB String
- 在 SystemUI 的 Statusbar 中 添加 ethernet status icon
- js中常见数据类型输出情况
- 水桶定律
- 工作周报051
- 计算机视觉领域稍微容易中的期刊(二)
- iOS开发--UICollectionView网格视图
- mysql怎么查询条件以另一个表中条件进行查询
- Floyd算法:用动态规划求解多源(全源)最短路径
- 4.2 内核工作队列原理汇总