2 * Copyright (C) 2014 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.android.settings.notification;
19 import android.content.Context;
20 import android.content.Intent;
21 import android.os.Bundle;
22 import android.os.Handler;
23 import android.os.Looper;
24 import android.os.Message;
25 import android.os.UserHandle;
26 import android.preference.SeekBarVolumizer;
27 import android.provider.SearchIndexableResource;
28 import android.support.v7.preference.Preference;
29 import android.text.TextUtils;
31 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
32 import com.android.settings.R;
33 import com.android.settings.RingtonePreference;
34 import com.android.settings.dashboard.DashboardFragment;
35 import com.android.settings.search.BaseSearchIndexProvider;
36 import com.android.settings.widget.PreferenceCategoryController;
37 import com.android.settingslib.core.AbstractPreferenceController;
38 import com.android.settingslib.core.lifecycle.Lifecycle;
40 import java.util.ArrayList;
41 import java.util.Arrays;
42 import java.util.List;
44 public class SoundSettings extends DashboardFragment {
45 private static final String TAG = "SoundSettings";
47 private static final String SELECTED_PREFERENCE_KEY = "selected_preference";
48 private static final int REQUEST_CODE = 200;
50 private static final int SAMPLE_CUTOFF = 2000; // manually cap sample playback at 2 seconds
52 private final VolumePreferenceCallback mVolumeCallback = new VolumePreferenceCallback();
53 private final H mHandler = new H();
55 private RingtonePreference mRequestPreference;
58 public int getMetricsCategory() {
59 return MetricsEvent.SOUND;
63 public void onCreate(Bundle savedInstanceState) {
64 super.onCreate(savedInstanceState);
65 if (savedInstanceState != null) {
66 String selectedPreference = savedInstanceState.getString(SELECTED_PREFERENCE_KEY, null);
67 if (!TextUtils.isEmpty(selectedPreference)) {
68 mRequestPreference = (RingtonePreference) findPreference(selectedPreference);
74 public int getHelpResource() {
75 return R.string.help_url_sound;
79 public void onPause() {
81 mVolumeCallback.stopSample();
85 public boolean onPreferenceTreeClick(Preference preference) {
86 if (preference instanceof RingtonePreference) {
87 mRequestPreference = (RingtonePreference) preference;
88 mRequestPreference.onPrepareRingtonePickerIntent(mRequestPreference.getIntent());
89 startActivityForResultAsUser(
90 mRequestPreference.getIntent(),
93 UserHandle.of(mRequestPreference.getUserId()));
96 return super.onPreferenceTreeClick(preference);
100 protected String getLogTag() {
105 protected int getPreferenceScreenResId() {
106 return R.xml.sound_settings;
110 protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
111 return buildPreferenceControllers(context, this, mVolumeCallback, getLifecycle());
115 public void onActivityResult(int requestCode, int resultCode, Intent data) {
116 if (mRequestPreference != null) {
117 mRequestPreference.onActivityResult(requestCode, resultCode, data);
118 mRequestPreference = null;
123 public void onSaveInstanceState(Bundle outState) {
124 super.onSaveInstanceState(outState);
125 if (mRequestPreference != null) {
126 outState.putString(SELECTED_PREFERENCE_KEY, mRequestPreference.getKey());
132 final class VolumePreferenceCallback implements VolumeSeekBarPreference.Callback {
133 private SeekBarVolumizer mCurrent;
136 public void onSampleStarting(SeekBarVolumizer sbv) {
137 if (mCurrent != null && mCurrent != sbv) {
138 mCurrent.stopSample();
141 if (mCurrent != null) {
142 mHandler.removeMessages(H.STOP_SAMPLE);
143 mHandler.sendEmptyMessageDelayed(H.STOP_SAMPLE, SAMPLE_CUTOFF);
148 public void onStreamValueChanged(int stream, int progress) {
152 public void stopSample() {
153 if (mCurrent != null) {
154 mCurrent.stopSample();
162 private final class H extends Handler {
163 private static final int STOP_SAMPLE = 1;
166 super(Looper.getMainLooper());
170 public void handleMessage(Message msg) {
173 mVolumeCallback.stopSample();
179 private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
180 SoundSettings fragment, VolumeSeekBarPreference.Callback callback,
181 Lifecycle lifecycle) {
182 final List<AbstractPreferenceController> controllers = new ArrayList<>();
183 controllers.add(new ZenModePreferenceController(context, lifecycle));
184 controllers.add(new VibrateWhenRingPreferenceController(context));
187 controllers.add(new AlarmVolumePreferenceController(context, callback, lifecycle));
188 controllers.add(new MediaVolumePreferenceController(context, callback, lifecycle));
190 new NotificationVolumePreferenceController(context, callback, lifecycle));
191 controllers.add(new RingVolumePreferenceController(context, callback, lifecycle));
193 // === Phone & notification ringtone ===
194 controllers.add(new PhoneRingtonePreferenceController(context));
195 controllers.add(new AlarmRingtonePreferenceController(context));
196 controllers.add(new NotificationRingtonePreferenceController(context));
198 // === Work Sound Settings ===
199 controllers.add(new WorkSoundPreferenceController(context, fragment, lifecycle));
201 // === Other Sound Settings ===
202 final DialPadTonePreferenceController dialPadTonePreferenceController =
203 new DialPadTonePreferenceController(context, fragment, lifecycle);
204 final ScreenLockSoundPreferenceController screenLockSoundPreferenceController =
205 new ScreenLockSoundPreferenceController(context, fragment, lifecycle);
206 final ChargingSoundPreferenceController chargingSoundPreferenceController =
207 new ChargingSoundPreferenceController(context, fragment, lifecycle);
208 final DockingSoundPreferenceController dockingSoundPreferenceController =
209 new DockingSoundPreferenceController(context, fragment, lifecycle);
210 final TouchSoundPreferenceController touchSoundPreferenceController =
211 new TouchSoundPreferenceController(context, fragment, lifecycle);
212 final VibrateOnTouchPreferenceController vibrateOnTouchPreferenceController =
213 new VibrateOnTouchPreferenceController(context, fragment, lifecycle);
214 final DockAudioMediaPreferenceController dockAudioMediaPreferenceController =
215 new DockAudioMediaPreferenceController(context, fragment, lifecycle);
216 final BootSoundPreferenceController bootSoundPreferenceController =
217 new BootSoundPreferenceController(context);
218 final EmergencyTonePreferenceController emergencyTonePreferenceController =
219 new EmergencyTonePreferenceController(context, fragment, lifecycle);
221 controllers.add(dialPadTonePreferenceController);
222 controllers.add(screenLockSoundPreferenceController);
223 controllers.add(chargingSoundPreferenceController);
224 controllers.add(dockingSoundPreferenceController);
225 controllers.add(touchSoundPreferenceController);
226 controllers.add(vibrateOnTouchPreferenceController);
227 controllers.add(dockAudioMediaPreferenceController);
228 controllers.add(bootSoundPreferenceController);
229 controllers.add(emergencyTonePreferenceController);
230 controllers.add(new PreferenceCategoryController(context,
231 "other_sounds_and_vibrations_category",
232 Arrays.asList(dialPadTonePreferenceController,
233 screenLockSoundPreferenceController,
234 chargingSoundPreferenceController,
235 dockingSoundPreferenceController,
236 touchSoundPreferenceController,
237 vibrateOnTouchPreferenceController,
238 dockAudioMediaPreferenceController,
239 bootSoundPreferenceController,
240 emergencyTonePreferenceController)));
247 public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
248 new BaseSearchIndexProvider() {
250 public List<SearchIndexableResource> getXmlResourcesToIndex(
251 Context context, boolean enabled) {
252 final SearchIndexableResource sir = new SearchIndexableResource(context);
253 sir.xmlResId = R.xml.sound_settings;
254 return Arrays.asList(sir);
258 public List<AbstractPreferenceController> createPreferenceControllers(
260 return buildPreferenceControllers(context, null /* fragment */,
261 null /* callback */, null /* lifecycle */);
265 public List<String> getNonIndexableKeys(Context context) {
266 List<String> keys = super.getNonIndexableKeys(context);
268 keys.add((new ZenModePreferenceController(context, null)).getPreferenceKey());
273 // === Work Sound Settings ===
275 void enableWorkSync() {
276 final WorkSoundPreferenceController workSoundController =
277 use(WorkSoundPreferenceController.class);
278 if (workSoundController != null) {
279 workSoundController.enableWorkSync();