• android12.0(S) 通知栏不显示闹钟和静音图标 bug


    bug 现象:设置闹钟或静音模式后,状态栏不显示图标,但下拉状态栏中有显示

    在网上搜索了下没人报这个问题,大家是都默认了???

    找到一篇报道有写,bug 相关

    关于 Bug 修复方面,Android 12 Beta 4 修复了部分未接来电通知无法关闭的问题,

    修复了系统主题颜色不适用某些快速设置图块的问题,

    修复了快速设置图块在拖动或重新排列时,未与网格对齐的问题。修复了通知栏不显示闹钟和静音图标的问题。

    patch

    frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java

    @@ -203,8 +203,9 @@ public class KeyguardStatusBarView extends RelativeLayout implements
         // Set hidden status bar items
         private void loadBlockList() {
             Resources r = getResources();
    -        mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_volume));
    -        mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_alarm_clock));
    +        //aosp bug block alarm and mute icon
    +        // mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_volume));
    +        // mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_alarm_clock));
             mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_call_strength));
         }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java

    @@ -158,8 +158,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
             }
             mDarkIconManager = new DarkIconManager(view.findViewById(R.id.statusIcons), mFeatureFlags);
             mDarkIconManager.setShouldLog(true);
    -        mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_volume));
    -        mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_alarm_clock));
    +        //aosp bug block alarm and mute icon
    +        // mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_volume));
    +        // mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_alarm_clock));
             mBlockedIcons.add(getString(com.android.internal.R.string.status_bar_call_strength));
             mDarkIconManager.setBlockList(mBlockedIcons);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    分析思路:

    状态栏icon对应 StatusBarIconView,找到其中

    setVisibility(icon.visible && !mBlocked ? VISIBLE : GONE); 可以看到有个 mBlocked,有的显示有的不显示,那应该就是被黑了。

    StatusBarIconControllerImpl.java
    onTuningChanged(String key, String newValue) {
    mIconHideList.addAll(StatusBarIconController.getIconHideList(mContext, newValue));

    addSystemIcon(int index, StatusBarIconHolder holder) {
    	boolean hidden = mIconHideList.contains(slot);
    	l.onIconAdded(viewIndex, slot, hidden, holder));
    
    • 1
    • 2
    • 3

    StatusBarIconController.java
    addHolder(int index, String slot, boolean blocked, StatusBarIconHolder holder) {
    if (mBlockList.contains(slot)) {
    blocked = true;
    }
    switch (holder.getType()) {
    case TYPE_ICON:
    return addIcon(index, slot, blocked, holder.getIcon());

    被黑有两种方式,均在 StatusBarIconController 中过滤

    第一种看到上面直接传递的 blocked,通过 config.xml 中配置

    frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBarIconController.java

        static ArraySet<String> getIconHideList(Context context, String hideListStr) {
            ArraySet<String> ret = new ArraySet<>();
            String[] hideList = hideListStr == null
                ? context.getResources().getStringArray(R.array.config_statusBarIconsToExclude)
                : hideListStr.split(",");
            for (String slot : hideList) {
                if (!TextUtils.isEmpty(slot)) {
                    ret.add(slot);
                }
            }
            return ret;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    frameworks\base\packages\SystemUI\res\values\config.xml

        <string-array name="config_statusBarIconsToExclude" translatable="false">
            <item>@*android:string/status_bar_rotate</item>
            <item>@*android:string/status_bar_headset</item>
        </string-array>
    
    • 1
    • 2
    • 3
    • 4

    可以看到耳机(headset)和旋转(rotate)被黑了

    第二种,通过 mBlockList 进行添加,静音(volume)和闹钟(alarm_clock)和call_strength被黑了

    frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBarIconController.java

    	public void setBlockList(@Nullable List<String> blockList) {
    		mBlockList.clear();
    		if (blockList == null || blockList.isEmpty()) {
    			return;
    		}
    
    		mBlockList.addAll(blockList);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    KeyguardStatusBarView.java CollapsedStatusBarFragment.java

        private void loadBlockList() {
            Resources r = getResources();
            mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_volume));
            mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_alarm_clock));
            mBlockedIcons.add(r.getString(com.android.internal.R.string.status_bar_call_strength));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    排序(冒泡排序、选择排序、插入排序、希尔排序)-->深度剖析(一)
    android mk常用代码
    【算法模版】基础算法
    TELNET协议笔记
    JS学习笔记
    318. 最大单词长度乘积
    Mybatis框架--优化过程
    Hexo + Github 个人博客搭建教程 + 主题设置
    [车联网安全自学篇] 七. ATTACK安全之Android SSH原理分析以及攻击检测
    【第四阶段】kotlin语言的定义类和field关键字学习
  • 原文地址:https://blog.csdn.net/u012932409/article/details/126308523