Android8.1 下拉状态栏添加铃声静音快捷键简单记录

Android8.1 下拉状态栏添加铃声静音快捷键简单记录
1.修改quick_settings_tiles_default

    <!-- The default tiles to display in QuickSettings -->
    <string name="quick_settings_tiles_default" translatable="false">
        wifi,bt,dnd,battery,cell,airplane
    </string>

由于如果直接在airplane后加ring会导致显示不全ring无法显示在一次下拉中(只能在下拉一次后再次下拉的时候才能显示,如果要强改可能需要改布局文件造成更多的修改),并且dnd(免打扰功能)没有需求,所以直接把dnd换成ring。

    <!-- The default tiles to display in QuickSettings -->
    <string name="quick_settings_tiles_default" translatable="false">
        wifi,bt,ring,battery,cell,airplane
    </string>

2.metrics_constants.proto中添加 QS_RING = 1145;

//frameworks\base\proto\src\metrics_constants.proto

    // logged when we cancel an app transition.
    APP_TRANSITION_CANCELLED = 1144;

    QS_RING = 1145;


    // ---- End O-MR1 Constants, all O-MR1 constants go above this line ----

    // Add new aosp constants above this line.
    // END OF AOSP CONSTANTS
  }
}

3.新建RingTile ,修改QSFactoryImpl。

在createTile中添加else if (tileSpec.equals("ring")) {return new RingTile(mHost);}

public class QSFactoryImpl implements QSFactory {
.............
    public QSTile createTile(String tileSpec) {
        /// M: Add extra tiles in quicksetting @{
        Context context = mHost.getContext();
        IQuickSettingsPlugin quickSettingsPlugin = OpSystemUICustomizationFactoryBase
                .getOpFactory(context).makeQuickSettings(context);
        /// @}
        if (tileSpec.equals("wifi")) return new WifiTile(mHost);
        else if (tileSpec.equals("bt")) return new BluetoothTile(mHost);
        else if (tileSpec.equals("cell")) return new CellularTile(mHost);
         .............
        else if (tileSpec.equals("ring")) {
            return new RingTile(mHost);
        }
        .............
        }
    }

新建RingTile。

package com.android.systemui.qs.tiles;

import com.android.systemui.qs.GlobalSetting;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
import com.android.systemui.R;
import android.service.quicksettings.Tile;
import android.content.Intent;
import android.media.AudioManager;
import android.provider.Settings;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;


public class RingTile extends QSTileImpl<BooleanState> {
    private boolean mListening;
    private AudioManager mAudioManager;
    private final GlobalSetting mGlobalSetting;
    private boolean isRingerModeSilent;

    public RingTile(QSHost host) {
        super(host);
        mAudioManager = (AudioManager) mContext.getSystemService(mContext.AUDIO_SERVICE);
        mGlobalSetting = new GlobalSetting(mContext, mHandler, Settings.System.MODE_RINGER_STREAMS_AFFECTED) {
            @Override
            protected void handleValueChanged(int value) {
                handleRefreshState(value);
            }
        };
    }

    @Override
    public int getMetricsCategory() {
        return MetricsEvent.QS_RING;
    }

    @Override
    public CharSequence getTileLabel() {
        return mContext.getString(R.string.quick_settings_ringer_silent);
    }

    @Override
    public BooleanState newTileState() {
        return new BooleanState();
    }

    @Override
    public void handleSetListening(boolean listening) {
        if (mListening == listening) return;
        mListening = listening;
        mGlobalSetting.setListening(mListening);
    }

  //长按快捷图标跳转对应设置
    @Override
    public Intent getLongClickIntent() {
        return new Intent(Settings.ACTION_SOUND_SETTINGS);
    }

    @Override
    protected void handleClick() {
        if (mAudioManager.getRingerMode()!= AudioManager.RINGER_MODE_SILENT) {
            mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
        } else {
            mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
        }
        refreshState();
    }

    @Override
    protected void handleUpdateState(BooleanState state, Object arg) {
        state.label = mContext.getString(R.string.quick_settings_ringer_silent);
        if (mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
            state.icon = ResourceIcon.get(R.drawable.ic_qs_ringer_silent);
            state.state = Tile.STATE_ACTIVE;
        } else {
            state.icon = ResourceIcon.get(R.drawable.ic_qs_ringer_audible);
            state.state = Tile.STATE_INACTIVE;
        }
    }

}

定义Silent的string。

//vendor\mediatek\proprietary\packages\apps\SystemUI\res\values\strings.xml
<string name="quick_settings_ringer_silent">Silent</string>

state.state这个属性,跟图标的最终显示颜色有关。system ui中的下拉栏中的图标基本是svg图片,fillColor属性为 #FFFFFFFF,但是最终显示却不是白色,是因为setTint,动态修改了颜色。

//vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\qs\tileimpl\QSIconViewImpl.java
    protected void setIcon(ImageView iv, QSTile.State state) {
        updateIcon(iv, state);
        if (state.disabledByPolicy) {
            iv.setColorFilter(getContext().getColor(R.color.qs_tile_disabled_color));
        } else {
            iv.clearColorFilter();
        }
        if (state.state != mState) {
            int color = getColor(state.state);
            mState = state.state;
            if (iv.isShown() && mTint != 0) {
                animateGrayScale(mTint, color, iv);
                mTint = color;
            } else {
                if (iv instanceof AlphaControlledSlashImageView) {
                    ((AlphaControlledSlashImageView)iv)
                            .setFinalImageTintList(ColorStateList.valueOf(color));
                } else {
                    setTint(iv, color);
                }
                mTint = color;
            }
        }
    }

参考链接:

android(cm11)状态栏源代码分析(一)
SystemUI之Qs Tile加载流程
android 7.0 system UI之快速启动栏的分析(一)
Android 8.1 SystemUI下拉状态栏修改
Android下拉状态栏快捷开关的添加
Android 状态栏下拉列表添加自定义item开关
Android 9.0 SystemUI 下拉状态栏快捷开关
Android N SystemUI-状态栏
SystemUI 状态栏 system icon 和 notification icon 的修改
AndroidN SystemUI新增小图标
Android 8.0 SystemUI下拉状态栏快捷开关
Android实现手机静音
Android中 跳转到系统设置界面方法总结

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容