OSDN Git Service

239bb49a7cc3b4b4d42c477e49a7f1e43f2c54e6
[android-x86/packages-apps-Settings.git] / src / com / android / settings / notification / SoundSettings.java
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package com.android.settings.notification;
18
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;
30
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;
39
40 import java.util.ArrayList;
41 import java.util.Arrays;
42 import java.util.List;
43
44 public class SoundSettings extends DashboardFragment {
45     private static final String TAG = "SoundSettings";
46
47     private static final String SELECTED_PREFERENCE_KEY = "selected_preference";
48     private static final int REQUEST_CODE = 200;
49
50     private static final int SAMPLE_CUTOFF = 2000;  // manually cap sample playback at 2 seconds
51
52     private final VolumePreferenceCallback mVolumeCallback = new VolumePreferenceCallback();
53     private final H mHandler = new H();
54
55     private RingtonePreference mRequestPreference;
56
57     @Override
58     public int getMetricsCategory() {
59         return MetricsEvent.SOUND;
60     }
61
62     @Override
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);
69             }
70         }
71     }
72
73     @Override
74     public int getHelpResource() {
75         return R.string.help_url_sound;
76     }
77
78     @Override
79     public void onPause() {
80         super.onPause();
81         mVolumeCallback.stopSample();
82     }
83
84     @Override
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(),
91                     REQUEST_CODE,
92                     null,
93                     UserHandle.of(mRequestPreference.getUserId()));
94             return true;
95         }
96         return super.onPreferenceTreeClick(preference);
97     }
98
99     @Override
100     protected String getLogTag() {
101         return TAG;
102     }
103
104     @Override
105     protected int getPreferenceScreenResId() {
106         return R.xml.sound_settings;
107     }
108
109     @Override
110     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
111         return buildPreferenceControllers(context, this, mVolumeCallback, getLifecycle());
112     }
113
114     @Override
115     public void onActivityResult(int requestCode, int resultCode, Intent data) {
116         if (mRequestPreference != null) {
117             mRequestPreference.onActivityResult(requestCode, resultCode, data);
118             mRequestPreference = null;
119         }
120     }
121
122     @Override
123     public void onSaveInstanceState(Bundle outState) {
124         super.onSaveInstanceState(outState);
125         if (mRequestPreference != null) {
126             outState.putString(SELECTED_PREFERENCE_KEY, mRequestPreference.getKey());
127         }
128     }
129
130     // === Volumes ===
131
132     final class VolumePreferenceCallback implements VolumeSeekBarPreference.Callback {
133         private SeekBarVolumizer mCurrent;
134
135         @Override
136         public void onSampleStarting(SeekBarVolumizer sbv) {
137             if (mCurrent != null && mCurrent != sbv) {
138                 mCurrent.stopSample();
139             }
140             mCurrent = sbv;
141             if (mCurrent != null) {
142                 mHandler.removeMessages(H.STOP_SAMPLE);
143                 mHandler.sendEmptyMessageDelayed(H.STOP_SAMPLE, SAMPLE_CUTOFF);
144             }
145         }
146
147         @Override
148         public void onStreamValueChanged(int stream, int progress) {
149             // noop
150         }
151
152         public void stopSample() {
153             if (mCurrent != null) {
154                 mCurrent.stopSample();
155             }
156         }
157     }
158
159     // === Callbacks ===
160
161
162     private final class H extends Handler {
163         private static final int STOP_SAMPLE = 1;
164
165         private H() {
166             super(Looper.getMainLooper());
167         }
168
169         @Override
170         public void handleMessage(Message msg) {
171             switch (msg.what) {
172                 case STOP_SAMPLE:
173                     mVolumeCallback.stopSample();
174                     break;
175             }
176         }
177     }
178
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));
185
186         // === Volumes ===
187         controllers.add(new AlarmVolumePreferenceController(context, callback, lifecycle));
188         controllers.add(new MediaVolumePreferenceController(context, callback, lifecycle));
189         controllers.add(
190                 new NotificationVolumePreferenceController(context, callback, lifecycle));
191         controllers.add(new RingVolumePreferenceController(context, callback, lifecycle));
192
193         // === Phone & notification ringtone ===
194         controllers.add(new PhoneRingtonePreferenceController(context));
195         controllers.add(new AlarmRingtonePreferenceController(context));
196         controllers.add(new NotificationRingtonePreferenceController(context));
197
198         // === Work Sound Settings ===
199         controllers.add(new WorkSoundPreferenceController(context, fragment, lifecycle));
200
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);
220
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)));
241
242         return controllers;
243     }
244
245     // === Indexing ===
246
247     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
248             new BaseSearchIndexProvider() {
249
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);
255                 }
256
257                 @Override
258                 public List<AbstractPreferenceController> createPreferenceControllers(
259                         Context context) {
260                     return buildPreferenceControllers(context, null /* fragment */,
261                             null /* callback */, null /* lifecycle */);
262                 }
263
264                 @Override
265                 public List<String> getNonIndexableKeys(Context context) {
266                     List<String> keys = super.getNonIndexableKeys(context);
267                     // Duplicate results
268                     keys.add((new ZenModePreferenceController(context, null)).getPreferenceKey());
269                     return keys;
270                 }
271             };
272
273     // === Work Sound Settings ===
274
275     void enableWorkSync() {
276         final WorkSoundPreferenceController workSoundController =
277                 use(WorkSoundPreferenceController.class);
278         if (workSoundController != null) {
279             workSoundController.enableWorkSync();
280         }
281     }
282 }