/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.notification; import android.app.AutomaticZenRule; import android.app.Fragment; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.service.notification.ConditionProviderService; import android.support.v7.preference.Preference; import android.support.v7.preference.Preference.OnPreferenceClickListener; import android.support.v7.preference.PreferenceScreen; import android.util.Log; import android.widget.Toast; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settingslib.core.AbstractPreferenceController; public abstract class ZenModeRuleSettingsBase extends ZenModeSettingsBase { protected static final String TAG = ZenModeSettingsBase.TAG; protected static final boolean DEBUG = ZenModeSettingsBase.DEBUG; private static final String KEY_RULE_NAME = "rule_name"; protected Context mContext; protected boolean mDisableListeners; protected AutomaticZenRule mRule; protected String mId; private Preference mRuleName; protected ZenAutomaticRuleHeaderPreferenceController mHeader; protected ZenAutomaticRuleSwitchPreferenceController mSwitch; abstract protected void onCreateInternal(); abstract protected boolean setRule(AutomaticZenRule rule); abstract protected void updateControlsInternal(); @Override public void onCreate(Bundle icicle) { mContext = getActivity(); final Intent intent = getActivity().getIntent(); if (DEBUG) Log.d(TAG, "onCreate getIntent()=" + intent); if (intent == null) { Log.w(TAG, "No intent"); toastAndFinish(); return; } mId = intent.getStringExtra(ConditionProviderService.EXTRA_RULE_ID); if (mId == null) { Log.w(TAG, "rule id is null"); toastAndFinish(); return; } if (DEBUG) Log.d(TAG, "mId=" + mId); if (refreshRuleOrFinish()) { return; } super.onCreate(icicle); onCreateInternal(); final PreferenceScreen root = getPreferenceScreen(); mRuleName = root.findPreference(KEY_RULE_NAME); mRuleName.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { showRuleNameDialog(); return true; } }); } @Override public void onResume() { super.onResume(); if (isUiRestricted()) { return; } updateControls(); } @Override public int getHelpResource() { return R.string.help_uri_interruptions; } /** * Update state of header preference managed by PreferenceController. */ protected void updateHeader() { final PreferenceScreen screen = getPreferenceScreen(); mSwitch.onResume(mRule,mId); mSwitch.displayPreference(screen); updatePreference(mSwitch); mHeader.onResume(mRule); mHeader.displayPreference(screen); updatePreference(mHeader); } private void updatePreference(AbstractPreferenceController controller) { final PreferenceScreen screen = getPreferenceScreen(); if (!controller.isAvailable()) { return; } final String key = controller.getPreferenceKey(); final Preference preference = screen.findPreference(key); if (preference == null) { Log.d(TAG, String.format("Cannot find preference with key %s in Controller %s", key, controller.getClass().getSimpleName())); return; } controller.updateState(preference); } protected void updateRule(Uri newConditionId) { mRule.setConditionId(newConditionId); mBackend.setZenRule(mId, mRule); } @Override protected void onZenModeConfigChanged() { super.onZenModeConfigChanged(); if (!refreshRuleOrFinish()) { updateControls(); } } private boolean refreshRuleOrFinish() { mRule = getZenRule(); if (DEBUG) Log.d(TAG, "mRule=" + mRule); if (!setRule(mRule)) { toastAndFinish(); return true; } return false; } private void showRuleNameDialog() { ZenRuleNameDialog.show(this, mRule.getName(), null, new RuleNameChangeListener()); } private void toastAndFinish() { Toast.makeText(mContext, R.string.zen_mode_rule_not_found_text, Toast.LENGTH_SHORT) .show(); getActivity().finish(); } private void updateRuleName() { if (mRule != null) { mRuleName.setSummary(mRule.getName()); } else { if (DEBUG) Log.d(TAG, "updateRuleName - mRuleName " + "not updated; mRuleName returned null"); } } private AutomaticZenRule getZenRule() { return NotificationManager.from(mContext).getAutomaticZenRule(mId); } private void updateControls() { mDisableListeners = true; updateRuleName(); updateControlsInternal(); updateHeader(); mDisableListeners = false; } public class RuleNameChangeListener implements ZenRuleNameDialog.PositiveClickListener { public RuleNameChangeListener() {} @Override public void onOk(String ruleName, Fragment parent) { mMetricsFeatureProvider.action(mContext, MetricsProto.MetricsEvent.ACTION_ZEN_MODE_RULE_NAME_CHANGE_OK); mRule.setName(ruleName); mBackend.setZenRule(mId, mRule); } } }