免打扰功能的入口在NotificationSettings中,
点击列表项跳转到ZenModeSettings。java
android:title="@string/zen_mode_settings_title"
settings:keywords="@string/keywords_sounds_and_notifications_interruptions"
android:fragment="com.android.settings.notification.ZenModeSettings" />
ZenModeSettings 继承了ZenModeSettingsBase,
ZenModeSettingsBase的子类还有ZenModeAutomationSettings,ZenModePrioritySettings,ZenModeRuleSettingsBase
其中ZenModeRuleSettingsBase是一个抽象类,它的子类有ZenModeEventRuleSettings,ZenModeExternalRuleSettings,ZenModeScheduleRuleSettings。android
ZenModeSettings 只是显示ZenModePrioritySettings和ZenModeAutomationSettings的入口web
android:title="@string/zen_mode_priority_settings_title"
android:fragment="com.android.settings.notification.ZenModePrioritySettings" />
android:title="@string/zen_mode_automation_settings_title"
android:fragment="com.android.settings.notification.ZenModeAutomationSettings" />
ZenModePrioritySettings负责自定义免打扰规则
能够对提醒、活动、消息、通话、重复来电者的免打扰规则进行设置。ide
对提醒的免打扰规则设置,调用NotificationManager的方法设置通知svg
public boolean setZenModeConfig(ZenModeConfig config, String reason) {
checkCallerIsSystem();
return mZenModeHelper.setConfig(config, reason);
}
mReminders.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (mDisableListeners) return true;
final boolean val = (Boolean) newValue;
MetricsLogger.action(mContext, MetricsLogger.ACTION_ZEN_ALLOW_REMINDERS, val);
if (val == mConfig.allowReminders) return true;
if (DEBUG) Log.d(TAG, "onPrefChange allowReminders=" + val);
final ZenModeConfig newConfig = mConfig.copy();
newConfig.allowReminders = val;
return setZenModeConfig(newConfig);
}
});
protected boolean setZenModeConfig(ZenModeConfig config) {
final String reason = getClass().getSimpleName();
final boolean success = NotificationManager.from(mContext).setZenModeConfig(config, reason);
if (success) {
mConfig = config;
if (DEBUG) Log.d(TAG, "Saved mConfig=" + mConfig);
onZenModeConfigChanged();
}
return success;
}
其余内容的通知设置均调用NotificationManager的setZenModeConfig方法进行设置spa
ZenModeAutomationSettings负责显示已有的通知规则和添加自定义通知规则
通知规则包括时间规则(经过ZenModeScheduleRuleSettings进行设置)和事件规则(经过ZenModeEventRuleSettings进行设置)。
通知规则的内容有规则名称、日期、开始和结束事件、免打扰规则code
事件通知规则和时间通知均继承自ZenModeRuleSettingsBase
开关控制的实如今这个父类中,切换开关仍然调用NotificationManager的setZenModeConfig(ZenModeConfig config, String reason)方法xml
@Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
if (DEBUG) Log.d(TAG, "onSwitchChanged " + isChecked);
if (mDisableListeners) return;
final boolean enabled = isChecked;
if (enabled == mRule.enabled) return;
MetricsLogger.action(mContext, MetricsLogger.ACTION_ZEN_ENABLE_RULE, enabled);
if (DEBUG) Log.d(TAG, "onSwitchChanged enabled=" + enabled);
mRule.enabled = enabled;
mRule.snoozing = false;
setZenModeConfig(mConfig);
if (enabled) {
final int toastText = getEnabledToastText();
if (toastText != 0) {
mEnabledToast = Toast.makeText(mContext, toastText, Toast.LENGTH_SHORT);
mEnabledToast.show();
}
} else {
if (mEnabledToast != null) {
mEnabledToast.cancel();
}
}
}