前情提要
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 网络信号栏定制修改,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!