Boot Sounds setting in OtherSoundSettings

Uses a persistent system property so it can be accessed by bootanim.

BUG:30690353
Change-Id: Iffb7e140074b8bf4b0faabdecbbf163b14360655
diff --git a/res/values/strings.xml b/res/values/strings.xml
index dc2dd90..ad14781 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5998,6 +5998,9 @@
     <!-- Sound: Other sounds: Value for the emergency tone option with value 2: vibrate. [CHAR LIMIT=30] -->
     <string name="emergency_tone_vibrate">Vibrate</string>
 
+    <!-- Sound: Other sounds: Title for the option enabling boot sounds. [CHAR LIMIT=30] -->
+    <string name="boot_sounds_title">Power on sounds</string>
+
     <!-- Sound: Title for the Do not Disturb option and associated settings page. [CHAR LIMIT=30] -->
     <string name="zen_mode_settings_title">Do not disturb</string>
 
diff --git a/res/xml/other_sound_settings.xml b/res/xml/other_sound_settings.xml
index 66535e3..da67d03 100644
--- a/res/xml/other_sound_settings.xml
+++ b/res/xml/other_sound_settings.xml
@@ -55,6 +55,11 @@
             android:title="@string/dock_audio_media_title"
             android:summary="%s" />
 
+    <!-- Boot sounds -->
+    <SwitchPreference
+            android:key="boot_sounds"
+            android:title="@string/boot_sounds_title" />
+
     <!-- Emergency tone -->
     <DropDownPreference
             android:key="emergency_tone"
diff --git a/src/com/android/settings/notification/OtherSoundSettings.java b/src/com/android/settings/notification/OtherSoundSettings.java
index 2ea6a79..c538a7b 100644
--- a/src/com/android/settings/notification/OtherSoundSettings.java
+++ b/src/com/android/settings/notification/OtherSoundSettings.java
@@ -25,10 +25,13 @@
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.SystemProperties;
 import android.os.Vibrator;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings.Global;
 import android.provider.Settings.System;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
 import android.telephony.TelephonyManager;
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
@@ -68,6 +71,10 @@
     private static final String KEY_DOCK_AUDIO_MEDIA = "dock_audio_media";
     private static final String KEY_EMERGENCY_TONE = "emergency_tone";
 
+    // Boot Sounds needs to be a system property so it can be accessed during boot.
+    private static final String KEY_BOOT_SOUNDS = "boot_sounds";
+    private static final String PROPERTY_BOOT_SOUNDS = "persist.sys.bootanim.play_sound";
+
     private static final SettingPref PREF_DIAL_PAD_TONES = new SettingPref(
             TYPE_SYSTEM, KEY_DIAL_PAD_TONES, System.DTMF_TONE_WHEN_DIALING, DEFAULT_ON) {
         @Override
@@ -174,6 +181,8 @@
         PREF_EMERGENCY_TONE,
     };
 
+    private SwitchPreference mBootSounds;
+
     private final SettingsObserver mSettingsObserver = new SettingsObserver();
 
     private Context mContext;
@@ -199,6 +208,9 @@
         for (SettingPref pref : PREFS) {
             pref.init(this);
         }
+
+        mBootSounds = (SwitchPreference) findPreference(KEY_BOOT_SOUNDS);
+        mBootSounds.setChecked(SystemProperties.getBoolean(PROPERTY_BOOT_SOUNDS, true));
     }
 
     @Override
@@ -213,6 +225,16 @@
         mSettingsObserver.register(false);
     }
 
+    @Override
+    public boolean onPreferenceTreeClick(Preference preference) {
+        if (preference == mBootSounds) {
+            SystemProperties.set(PROPERTY_BOOT_SOUNDS, mBootSounds.isChecked() ? "1" : "0");
+            return false;
+        } else {
+            return super.onPreferenceTreeClick(preference);
+        }
+    }
+
     private static boolean hasDockSettings(Context context) {
         return context.getResources().getBoolean(R.bool.has_dock_settings);
     }