diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 2e22d46088e..6d0cd764867 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1229,4 +1229,17 @@
- 6
+
+
+ - Off
+ - Limited interruptions
+ - Zero interruptions
+
+
+
+
+ - 0
+ - 1
+ - 2
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b42c88ce99c..612677b9b65 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5005,4 +5005,11 @@
shown in notifications shown on a secure lock screen
[CHAR LIMIT=50] -->
All notification contents will be shown when locked
+
+
+ Zen mode
+
+ %1$s
+
+ Zen mode
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index 26e2e20537d..580b6d5cf8a 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -109,4 +109,13 @@
android:title="@string/dock_sounds_enable_title"
android:defaultValue="false" />
+
+
diff --git a/src/com/android/settings/SoundSettings.java b/src/com/android/settings/SoundSettings.java
index 28d93f16ab7..d50686486b6 100644
--- a/src/com/android/settings/SoundSettings.java
+++ b/src/com/android/settings/SoundSettings.java
@@ -75,6 +75,7 @@ public class SoundSettings extends SettingsPreferenceFragment implements
private static final String KEY_DOCK_AUDIO_SETTINGS = "dock_audio";
private static final String KEY_DOCK_SOUNDS = "dock_sounds";
private static final String KEY_DOCK_AUDIO_MEDIA_ENABLED = "dock_audio_media_enabled";
+ private static final String KEY_ZEN_MODE = "zen_mode";
private static final String[] NEED_VOICE_CAPABILITY = {
KEY_RINGTONE, KEY_DTMF_TONE, KEY_CATEGORY_CALLS,
@@ -101,6 +102,7 @@ public class SoundSettings extends SettingsPreferenceFragment implements
private CheckBoxPreference mDockSounds;
private Intent mDockIntent;
private CheckBoxPreference mDockAudioMediaEnabled;
+ private ZenModeListPreference mZenModeListPreference;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
@@ -227,6 +229,9 @@ public class SoundSettings extends SettingsPreferenceFragment implements
};
initDockSettings();
+
+ mZenModeListPreference = (ZenModeListPreference) findPreference(KEY_ZEN_MODE);
+ mZenModeListPreference.init();
}
@Override
diff --git a/src/com/android/settings/ZenModeListPreference.java b/src/com/android/settings/ZenModeListPreference.java
new file mode 100644
index 00000000000..0315a1335fd
--- /dev/null
+++ b/src/com/android/settings/ZenModeListPreference.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2014 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;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.provider.Settings;
+import android.util.AttributeSet;
+import android.util.Log;
+
+public class ZenModeListPreference extends ListPreference {
+ private static final String TAG = "ZenModeListPreference";
+ private static final boolean DEBUG = false;
+
+ private final Handler mHandler = new Handler();
+ private final ContentResolver mResolver;
+
+ public ZenModeListPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ if (DEBUG) Log.d(TAG, "new ZenModeListPreference()");
+ mResolver = context.getContentResolver();
+ }
+
+ public void init() {
+ if (DEBUG) Log.d(TAG, "init");
+ loadZenModeSetting("init");
+ setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ if (DEBUG) Log.d(TAG, "onPreferenceChange " + newValue);
+ final boolean updateWithNewValue = saveZenModeSetting((String)newValue);
+ return updateWithNewValue;
+ }
+ });
+ mResolver.registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.ZEN_MODE),
+ false, new SettingsObserver());
+ }
+
+ private void loadZenModeSetting(String reason) {
+ if (DEBUG) Log.d(TAG, "loadZenModeSetting " + reason);
+ setValue(Integer.toString(Settings.Global.getInt(mResolver,
+ Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_OFF)));
+ }
+
+ private boolean saveZenModeSetting(String value) {
+ if (DEBUG) Log.d(TAG, "saveZenModeSetting " + value);
+ try {
+ final int v = Integer.valueOf(value);
+ checkZenMode(v);
+ return Settings.Global.putInt(mResolver, Settings.Global.ZEN_MODE, v);
+ } catch (Throwable t) {
+ Log.w(TAG, "Failed to update zen mode with value: " + value, t);
+ return false;
+ }
+ }
+
+ private static void checkZenMode(int mode) {
+ if (mode < Settings.Global.ZEN_MODE_OFF || mode > Settings.Global.ZEN_MODE_FULL) {
+ throw new IllegalArgumentException("Invalid zen mode: " + mode);
+ }
+ }
+
+ private final class SettingsObserver extends ContentObserver {
+ public SettingsObserver() {
+ super(mHandler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ loadZenModeSetting("change");
+ }
+ }
+}