Android9.0 SystemUI 網路訊號欄定製修改的流程解析
前情提要
Android 8.1平臺SystemUI 導航欄載入流程解析
9.0 改動點簡要說明
1、新增 StatusBarMobileView 替代 SignalClusterView,用以控制訊號欄顯示
同時增加的還有 StatusBarIconView、StatusBarWifiView
2、整體流程和 8.1 類似
效果圖
整體流程圖
上程式碼
先來看初始賦值的地方 MobileSignalController.java,在 notifyListeners() 方法中進行我們對應的定製,
最後通過 callback.setMobileDataIndicators() 將狀態值傳遞到 StatusBarSignalPolicy.java 解析顯示
vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\statusbar\policy\MobileSignalController.java
@Override public void notifyListeners(SignalCallback callback) { MobileIconGroup icons = getIcons(); String contentDescription = getStringIfExists(getContentDescription()); String dataContentDescription = getStringIfExists(icons.mDataContentDescription); if (mCurrentState.inetCondition == 0) { dataContentDescription = mContext.getString(R.string.data_connection_no_internet); } final boolean dataDisabled = mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED && mCurrentState.userSetup; /// M: Customize the signal strength icon id. @ { int iconId = getCurrentIconId(); iconId = mStatusBarExt.getCustomizeSignalStrengthIcon( mSubscriptionInfo.getSubscriptionId(),iconId,mSignalStrength,mDataNetType,mServiceState); /// @ } if (mSignalStrength != null) { /*int dbm = mSignalStrength.getDbm(); int asu = mSignalStrength.getAsuLevel(); Log.i("ccz","dbm="+dbm + " asu="+asu);*/ Log.e("ccz","isGSM=="+mSignalStrength.isGsm() + " connected=="+mCurrentState.connected+" dataConnected=="+mCurrentState.dataConnected); } if (mCurrentState.connected) { //cczheng add get signal icon [S] //通過 getSignalStrengthIcon 方法,根據自定義規則,返回要顯示對應資源id iconId = TelephonyIcons.getSignalStrengthIcon(mSignalStrength != null ? mSignalStrength.getDbm() : -120,mSignalStrength != null ? mSignalStrength.getAsuLevel() : 0); //iconId = TelephonyIcons.getSignalStrengthIcon(mCurrentState.level); //cczheng add get signal icon [E] }else{//未連線成功時顯示 X iconId = R.drawable.stat_sys_signal_disable; } // Show icon in QS when we are connected or data is disabled. boolean showDataIcon = mCurrentState.dataConnected || dataDisabled; Log.i("ccz","dataDisabled="+dataDisabled + " showDataIcon="+showDataIcon); IconState statusIcon = new IconState(mCurrentState.enabled && !mCurrentState.airplaneMode,contentDescription); int qsTypeIcon = 0; IconState qsIcon = null; String description = null; // Only send data sim callbacks to QS. if (mCurrentState.dataSim) { qsTypeIcon = (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.mQsDataType : 0; qsIcon = new IconState(mCurrentState.enabled && !mCurrentState.isEmergency,getQsCurrentIconId(),contentDescription); description = mCurrentState.isEmergency ? null : mCurrentState.networkName; } boolean activityIn = mCurrentState.dataConnected && !mCurrentState.carrierNetworkChangeMode && mCurrentState.activityIn; boolean activityOut = mCurrentState.dataConnected && !mCurrentState.carrierNetworkChangeMode && mCurrentState.activityOut; showDataIcon &= mCurrentState.isDefault || dataDisabled; int typeIcon = (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.mDataType : 0; /// M: Add for lwa. typeIcon = mCurrentState.lwaRegState == NetworkTypeUtils.LWA_STATE_CONNCTED && showDataIcon ? NetworkTypeUtils.LWA_ICON : typeIcon; /** M: Support [Network Type on StatusBar],change the implement methods. * Get the network icon base on service state. * Add one more parameter for network type. * @ { **/ int networkIcon = mCurrentState.networkIcon; /// M: Support volte icon.Bug fix when airplane mode is on go to hide volte icon int volteIcon = mCurrentState.airplaneMode && !isImsOverWfc() ? 0 : mCurrentState.volteIcon; /// M: when data disabled,common show data icon as x,but op do not need show it @ { mStatusBarExt.isDataDisabled(mSubscriptionInfo.getSubscriptionId(),dataDisabled); /// @ } /// M: Customize the data type icon id. @ { typeIcon = mStatusBarExt.getDataTypeIcon( mSubscriptionInfo.getSubscriptionId(),typeIcon,mCurrentState.dataConnected ? TelephonyManager.DATA_CONNECTED : TelephonyManager.DATA_DISCONNECTED,mServiceState); /// @ } /// M: Customize the network type icon id. @ { networkIcon = mStatusBarExt.getNetworkTypeIcon( mSubscriptionInfo.getSubscriptionId(),networkIcon,mServiceState); /// for operator //通過 description 傳遞運營商資訊 description = mCurrentState.operator; // for qsdatetype qsTypeIcon = mCurrentState.mQsDataType; /// @ } //cczheng add for when datadisable set mMobileDataActivity GONE [S] //資料網路關閉時,id 置為0,不顯示上下行小箭頭 if (isDataDisabled()) { typeIcon = 0; } Log.d("ccz","qsTypeIcon="+qsTypeIcon); //cczheng add for when datadisable set mMobileDataActivity GONE [E] Log.e("ccz"," showDataIcon="+showDataIcon+" activityIn="+activityIn +" activityOut="+activityOut); Log.i("ccz","networkName="+mCurrentState.networkName + " description="+description); callback.setMobileDataIndicators(statusIcon,qsIcon,volteIcon,qsTypeIcon,activityIn,activityOut,dataContentDescription,description,icons.mIsWide,mSubscriptionInfo.getSubscriptionId(),mCurrentState.roaming,mCurrentState.isDefaultData,mCurrentState.customizedState); /// M: update plmn label @{ mNetworkController.refreshPlmnCarrierLabel(); /// @} } private final void updateTelephony() { ..... /// M: For network type big icon. mCurrentState.networkIcon = NetworkTypeUtils.getNetworkTypeIcon(mServiceState,mConfig,hasService()); /// M: For volte type icon. mCurrentState.volteIcon = getVolteIcon(); //cczheng add for qsdatetype mCurrentState.mQsDataType = ((MobileIconGroup)mCurrentState.iconGroup).mQsDataType; //cczheng add for operator mCurrentState.operator = getOperatorType(); notifyListenersIfNecessary(); } private String getOperatorType(){ if (!hasService()) { // Not in service,don't show operator return "0"; } int operatorType = NetworkTypeUtils.getOperatorType(mPhone); if (operatorType == 0) return "0"; else return mContext.getResources().getString(operatorType); }
根據通用標準自定義顯示規則
dbm >= -107 4格
-107 > dbm >= -111 3格
-111 > dbm >= -114 2格
-114 > dbm >= -117 1格
vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\statusbar\policy\TelephonyIcons.java
static final int[] TELEPHONY_SIGNAL_STRENGTH_FULL = { R.drawable.stat_sys_signal_0_fully,R.drawable.stat_sys_signal_1_fully,R.drawable.stat_sys_signal_2_fully,R.drawable.stat_sys_signal_3_fully,R.drawable.stat_sys_signal_4_fully,}; /** * Customize Signal strength icon. * @param level telephony signal strength leve. * @return Signal strength icon id. */ static final int getSignalStrengthIcon(int level) { android.util.Log.e("ccz","getSignalStrengthIcon() level=="+level); if (level >= 0 && level < TELEPHONY_SIGNAL_STRENGTH_FULL.length) { return TELEPHONY_SIGNAL_STRENGTH_FULL[level]; } return 0; } static final int getSignalStrengthIcon(int dbm,int asu) { int level = 0; if(dbm >= -107) level = 4; else if (dbm >= -111) level = 3; else if (dbm >= -114) level = 2; else if (dbm >= -117) level = 1; android.util.Log.e("ccz","getSignalStrengthIcon() dbm=="+dbm + " asu=="+asu + " level=="+level); return TELEPHONY_SIGNAL_STRENGTH_FULL[level]; }
捨棄原來的網路大圖示,新增網路小圖示,這樣可以在下方顯示網路資料圖示
vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\mediatek\systemui\statusbar\networktype\NetworkTypeUtils.java
//cczheng add show small networkType static final Map<Integer,Integer> sNetworkTypeSmallIcons = new HashMap<Integer,Integer>() { { // For CDMA 3G put(TelephonyManager.NETWORK_TYPE_EVDO_0,R.drawable.stat_sys_data_fully_connected_3g); put(TelephonyManager.NETWORK_TYPE_EVDO_A,R.drawable.stat_sys_data_fully_connected_3g); put(TelephonyManager.NETWORK_TYPE_EVDO_B,R.drawable.stat_sys_data_fully_connected_3g); put(TelephonyManager.NETWORK_TYPE_EHRPD,R.drawable.stat_sys_data_fully_connected_3g); // For CDMA 1x put(TelephonyManager.NETWORK_TYPE_CDMA,R.drawable.stat_sys_data_fully_connected_1x); put(TelephonyManager.NETWORK_TYPE_1xRTT,R.drawable.stat_sys_data_fully_connected_1x); // Edge put(TelephonyManager.NETWORK_TYPE_EDGE,R.drawable.stat_sys_data_fully_connected_e); // 3G put(TelephonyManager.NETWORK_TYPE_UMTS,R.drawable.stat_sys_data_fully_connected_3g); // For 4G put(TelephonyManager.NETWORK_TYPE_LTE,R.drawable.stat_sys_data_fully_connected_4g); // 3G put(TelephonyManager.NETWORK_TYPE_HSDPA,R.drawable.stat_sys_data_fully_connected_3g); put(TelephonyManager.NETWORK_TYPE_HSUPA,R.drawable.stat_sys_data_fully_connected_3g); put(TelephonyManager.NETWORK_TYPE_HSPA,R.drawable.stat_sys_data_fully_connected_3g); put(TelephonyManager.NETWORK_TYPE_HSPAP,R.drawable.stat_sys_data_fully_connected_3g); put(TelephonyManager.NETWORK_TYPE_IWLAN,0); } }; public static int getNetworkTypeIcon(ServiceState serviceState,Config config,boolean hasService) { if (!hasService) { // Not in service,no network type. return 0; } int tempNetworkType = getNetworkType(serviceState); //cczheng change sNetworkTypeIcons to sNetworkTypeSmallIcons,show small networkType //Integer iconId = sNetworkTypeIcons.get(tempNetworkType); Integer iconId = sNetworkTypeSmallIcons.get(tempNetworkType);//add if (iconId == null) { iconId = tempNetworkType == TelephonyManager.NETWORK_TYPE_UNKNOWN ? 0 : config.showAtLeast3G ? R.drawable.stat_sys_network_type_3g : R.drawable.stat_sys_network_type_g; } Log.i("ccz","Operator=="+ serviceState.getOperatorAlphaLong()); return iconId.intValue(); } //cczheng add for operatortype static final int[] OPERATOR_TYPE = { R.string.operator_cmcc,//CHINA_MOBILE R.string.operator_cucc,//CHINA_UNICOM R.string.operator_ctcc//CHINA_TELECOM }; public static int getOperatorType(TelephonyManager telephonyManager) { int type = 0; String operator = telephonyManager.getSimOperator(); switch (operator) { case "46000": case "46002": case "46007": case "41004": type = OPERATOR_TYPE[0]; break; case "46001": case "46006": type = OPERATOR_TYPE[1]; break; case "46003": case "46011": type = OPERATOR_TYPE[2]; break; default: break; } return type; }
StatusBarSignalPolicy 通過 description 傳遞運營商型別
vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\statusbar\phone\StatusBarSignalPolicy.java @Override public void setMobileDataIndicators(IconState statusIcon,IconState qsIcon,int statusType,int networkType,int volteIcon,int qsType,boolean activityIn,boolean activityOut,String typeContentDescription,String description,boolean isWide,int subId,boolean roaming,boolean isDefaultData,int customizedState) { Log.i("ccz","StatusBarSignalPolicy setMobileDataIndicators()"); MobileIconState state = getState(subId); if (state == null) { return; } ..... //cczheng add for operator because description is unless state.mOperator = description; Log.e("ccz","mMobileStrengthId="+statusIcon.icon); // Always send a copy to maintain value type semantics mIconController.setMobileIcons(mSlotMobile,MobileIconState.copyStates(mMobileStates)); }
StatusBarMobileView 獲取傳遞的資源id值顯示對應的圖示
vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\statusbar\StatusBarMobileView.java public class StatusBarMobileView extends FrameLayout implements DarkReceiver,StatusIconDisplayable { private static final String TAG = "StatusBarMobileView"; .... //cczheng add private ImageView mMobileDataActivity; private TextView mOperatorType; private void init() { .... mNetworkType = findViewById(R.id.network_type); mVolteType = findViewById(R.id.volte_indicator_ext); /// @} mMobileDataActivity = findViewById(R.id.data_inout); mOperatorType = findViewById(R.id.tv_operator); mMobileDrawable = new SignalDrawable(getContext()); //cczheng annotaion don't use system full style //mMobile.setImageDrawable(mMobileDrawable); initDotView(); mIsWfcEnable = SystemProperties.get("persist.vendor.mtk_wfc_support").equals("1"); /// M: Add for Plugin feature @ { mStatusBarExt = OpSystemUICustomizationFactoryBase.getOpFactory(mContext) .makeSystemUIStatusBar(mContext); /// @ } } private void initViewState() { setContentDescription(mState.contentDescription); if (!mState.visible) { mMobileGroup.setVisibility(View.GONE); } else { mMobileGroup.setVisibility(View.VISIBLE); } //cczheng don't use system style change empty line style 註釋原來的實心訊號格 //mMobileDrawable.setLevel(mState.strengthId); mMobile.setImageResource(mState.strengthId); //show date in out icon 資料流量小箭頭 mMobileDataActivity.setImageResource(getDataActivityIcon(mState.activityIn,mState.activityOut)); if (mState.typeId > 0) { if (!mStatusBarExt.disableHostFunction()) { mMobileType.setContentDescription(mState.typeContentDescription); mMobileType.setImageResource(mState.typeId); } //cczheng hide small datatype icon x or 4G mMobileType.setVisibility(View.GONE /*View.VISIBLE*/); } else { mMobileType.setVisibility(View.GONE); } mMobileRoaming.setVisibility(mState.roaming ? View.VISIBLE : View.GONE); mIn.setVisibility(mState.activityIn ? View.VISIBLE : View.GONE); mOut.setVisibility(mState.activityIn ? View.VISIBLE : View.GONE); //mInoutContainer.setVisibility((mState.activityIn || mState.activityOut) // ? View.VISIBLE : View.GONE); mMobileDataActivity.setVisibility(mState.typeId != 0 ? View.VISIBLE : View.GONE); /// M: Add for [Network Type and volte on Statusbar] @{ setCustomizeViewProperty(); /// @} showWfcIfAirplaneMode(); /// M: Add data group for plugin feature. @ { mStatusBarExt.addCustomizedView(mState.subId,mContext,mMobileGroup); setCustomizedOpViews(); /// @ } } private void updateState(MobileIconState state) { setContentDescription(state.contentDescription); if (mState.visible != state.visible) { mMobileGroup.setVisibility(state.visible ? View.VISIBLE : View.GONE); // To avoid StatusBarMobileView will not show in extreme case,// force request layout once if visible state changed. requestLayout(); } if (mState.strengthId != state.strengthId) { //cczheng don't use system style change empty line style //mMobileDrawable.setLevel(state.strengthId); mMobile.setImageResource(state.strengthId); } //show date in out icon mMobileDataActivity.setImageResource(getDataActivityIcon(state.activityIn,state.activityOut)); if (mState.typeId != state.typeId) { if (state.typeId != 0) { if (!mStatusBarExt.disableHostFunction()) { mMobileType.setContentDescription(state.typeContentDescription); mMobileType.setImageResource(state.typeId); } //cczheng hide small datatype icon x or 4G //資料流量標識 mMobileDataActivity 替代 mMobileType mMobileType.setVisibility(View.GONE /*View.VISIBLE*/); } else { mMobileType.setVisibility(View.GONE); } } mMobileRoaming.setVisibility(state.roaming ? View.VISIBLE : View.GONE); mIn.setVisibility(state.activityIn ? View.VISIBLE : View.GONE); mOut.setVisibility(state.activityIn ? View.VISIBLE : View.GONE); //mInoutContainer.setVisibility((state.activityIn || state.activityOut) // ? View.VISIBLE : View.GONE); mMobileDataActivity.setVisibility(state.typeId != 0 ? View.VISIBLE : View.GONE); /// M: Add for [Network Type and volte on Statusbar] @{ if (mState.networkIcon != state.networkIcon) { setNetworkIcon(state.networkIcon); } if (mState.volteIcon != state.volteIcon) { setVolteIcon(state.volteIcon); } if (mState.mOperator != state.mOperator) { setOperatorText(state.mOperator); } if (mState.mCustomizedState != state.mCustomizedState || mState.networkIcon != state.networkIcon) { // if cs reg state has changed or network icon change to LTE,need to update. mStatusBarExt.setDisVolteView(mState.subId,state.volteIcon,mVolteType); } /// @} mState = state; // should added after set mState showWfcIfAirplaneMode(); setCustomizedOpViews(); } //cczheng add for data in out icon [S] final int DATA_ACTIVITY_NONE = R.drawable.ct_stat_sys_signal_not_inout; final int DATA_ACTIVITY_IN = R.drawable.ct_stat_sys_signal_in; final int DATA_ACTIVITY_OUT = R.drawable.ct_stat_sys_signal_out; final int DATA_ACTIVITY_INOUT = R.drawable.ct_stat_sys_signal_inout; /** * M: getDataActivityIcon: Get DataActivity icon by dataActivity type. * @param activityIn : dataActivity Type * @param activityOut : dataActivity Type * @return dataActivity icon ID */ public int getDataActivityIcon(boolean activityIn,boolean activityOut) { Log.i("ccz","mActivityIn="+activityIn+" mActivityOut="+activityOut); int icon = DATA_ACTIVITY_NONE; if (activityIn && activityOut) { icon = DATA_ACTIVITY_INOUT; }else if (activityIn) { icon = DATA_ACTIVITY_IN; }else if (activityOut) { icon = DATA_ACTIVITY_OUT; } return icon; } //cczheng add for data in out icon [S] private void setOperatorText(String mOperator){ if ("0".equals(mOperator)) { mOperatorType.setVisibility(View.GONE); } else { mOperatorType.setText(mOperator); mOperatorType.setVisibility(View.VISIBLE); } }
StatusBarMobileView 對應佈局檔案 status_bar_mobile_signal_group 修改
vendor\mediatek\proprietary\packages\apps\SystemUI\res\layout\status_bar_mobile_signal_group.xml
<com.android.systemui.statusbar.StatusBarMobileView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:systemui="http://schemas.android.com/apk/res-auto" android:id="@+id/mobile_combo" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" > <com.android.keyguard.AlphaOptimizedLinearLayout android:id="@+id/mobile_group" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" android:orientation="horizontal" > <ImageView android:id="@+id/volte_indicator_ext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:visibility="gone" /> <!-- <ImageView android:id="@+id/network_type" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center_vertical" android:visibility="gone" /> --> <!-- cczheng annotaion network_type and add data in out view--> <FrameLayout android:layout_height="17dp" android:layout_width="wrap_content"> <ImageView android:id="@+id/network_type" android:layout_height="wrap_content" android:layout_width="wrap_content" android:paddingEnd="2dp" android:visibility="gone"/> <ImageView android:id="@+id/data_inout" android:layout_height="wrap_content" android:layout_width="wrap_content" android:paddingEnd="2dp" android:visibility="gone"/> </FrameLayout> <!-- end --> ....... <ImageView android:id="@+id/mobile_roaming" android:layout_width="wrap_content" android:layout_height="17dp" android:paddingStart="1dp" android:paddingTop="1.5dp" android:paddingBottom="3dp" android:paddingEnd="1dp" android:scaleType="fitCenter" android:src="@drawable/stat_sys_roaming_ext" android:contentDescription="@string/data_connection_roaming" android:visibility="gone" /> <!-- cczheng add for sim operator --> <TextView android:id="@+id/tv_operator" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone"/> </com.android.keyguard.AlphaOptimizedLinearLayout> </com.android.systemui.statusbar.StatusBarMobileView>
總結
以上所述是小編給大家介紹的Android9.0 SystemUI 網路訊號欄定製修改,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!