summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/notification/RingVolumePreferenceController.java
diff options
context:
space:
mode:
authorDoris Ling <dling@google.com>2016-11-30 17:33:50 -0800
committerDoris Ling <dling@google.com>2016-12-01 17:24:05 -0800
commit1b3ec0474875ce754c3f7cd80f762b091d48b627 (patch)
treef4dac358a756c0fb36de2bf223385ca602929e78 /src/com/android/settings/notification/RingVolumePreferenceController.java
parent7aad8a97a4726360bb616f103d0b4051df2617a6 (diff)
downloadpackages_apps_Settings-1b3ec0474875ce754c3f7cd80f762b091d48b627.tar.gz
packages_apps_Settings-1b3ec0474875ce754c3f7cd80f762b091d48b627.tar.bz2
packages_apps_Settings-1b3ec0474875ce754c3f7cd80f762b091d48b627.zip
Update SoundSettings to extend DashboardFragment.
- initial round of refactoring SoundSettings to use DashboardFragment. - add controller for Cast, Do not disturb, Alarm volume, Media volume, Ring volume and Notification volume. Bug: 32276590 Test: make RunSettingsRoboTests Change-Id: I5c02a344bff5117bfce93d7ccac650fccc82d2b0
Diffstat (limited to 'src/com/android/settings/notification/RingVolumePreferenceController.java')
-rw-r--r--src/com/android/settings/notification/RingVolumePreferenceController.java207
1 files changed, 207 insertions, 0 deletions
diff --git a/src/com/android/settings/notification/RingVolumePreferenceController.java b/src/com/android/settings/notification/RingVolumePreferenceController.java
new file mode 100644
index 0000000000..2297837680
--- /dev/null
+++ b/src/com/android/settings/notification/RingVolumePreferenceController.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2016 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.NotificationManager;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.media.AudioManager;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Vibrator;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.Utils;
+import com.android.settings.core.lifecycle.Lifecycle;
+import com.android.settings.notification.VolumeSeekBarPreference.Callback;
+
+import java.util.Objects;
+
+public class RingVolumePreferenceController extends VolumeSeekBarPreferenceController {
+
+ private static final String TAG = "RingVolumeController";
+ private static final String KEY_RING_VOLUME = "ring_volume";
+
+ private AudioManager mAudioManager;
+ private Vibrator mVibrator;
+ private int mRingerMode = -1;
+ private ComponentName mSuppressor;
+ private final RingReceiver mReceiver = new RingReceiver();
+ private final H mHandler = new H();
+ private AudioHelper mHelper;
+
+ public RingVolumePreferenceController(Context context, Callback callback, Lifecycle lifecycle) {
+ this(context, callback, lifecycle, new AudioHelper(context));
+ }
+
+ @VisibleForTesting
+ RingVolumePreferenceController(Context context, Callback callback, Lifecycle lifecycle,
+ AudioHelper helper) {
+ super(context, callback, lifecycle);
+ mHelper = helper;
+ mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+ mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
+ if (mVibrator != null && !mVibrator.hasVibrator()) {
+ mVibrator = null;
+ }
+ updateRingerMode();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mReceiver.register(true);
+ updateEffectsSuppressor();
+ updatePreferenceIcon();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mReceiver.register(false);
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return KEY_RING_VOLUME;
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return Utils.isVoiceCapable(mContext) && !mHelper.isSingleVolume();
+ }
+
+ @Override
+ public int getAudioStream() {
+ return AudioManager.STREAM_RING;
+ }
+
+ @Override
+ public int getMuteIcon() {
+ return com.android.internal.R.drawable.ic_audio_ring_notif_mute;
+ }
+
+ private void updateRingerMode() {
+ final int ringerMode = mAudioManager.getRingerModeInternal();
+ if (mRingerMode == ringerMode) return;
+ mRingerMode = ringerMode;
+ updatePreferenceIcon();
+ }
+
+ private boolean wasRingerModeVibrate() {
+ return mVibrator != null && mRingerMode == AudioManager.RINGER_MODE_SILENT
+ && mAudioManager.getLastAudibleStreamVolume(AudioManager.STREAM_RING) == 0;
+ }
+
+ private void updateEffectsSuppressor() {
+ final ComponentName suppressor = NotificationManager.from(mContext).getEffectsSuppressor();
+ if (Objects.equals(suppressor, mSuppressor)) return;
+ mSuppressor = suppressor;
+ if (mPreference != null) {
+ final String text = suppressor != null ?
+ mContext.getString(com.android.internal.R.string.muted_by,
+ getSuppressorCaption(suppressor)) : null;
+ mPreference.setSuppressionText(text);
+ }
+ updatePreferenceIcon();
+ }
+
+ private void updatePreferenceIcon() {
+ if (mPreference != null) {
+ mPreference.showIcon(mSuppressor != null
+ ? com.android.internal.R.drawable.ic_audio_ring_notif_mute
+ : mRingerMode == AudioManager.RINGER_MODE_VIBRATE || wasRingerModeVibrate()
+ ? com.android.internal.R.drawable.ic_audio_ring_notif_vibrate
+ : com.android.internal.R.drawable.ic_audio_ring_notif);
+ }
+ }
+
+ private String getSuppressorCaption(ComponentName suppressor) {
+ final PackageManager pm = mContext.getPackageManager();
+ try {
+ final ServiceInfo info = pm.getServiceInfo(suppressor, 0);
+ if (info != null) {
+ final CharSequence seq = info.loadLabel(pm);
+ if (seq != null) {
+ final String str = seq.toString().trim();
+ if (str.length() > 0) {
+ return str;
+ }
+ }
+ }
+ } catch (Throwable e) {
+ Log.w(TAG, "Error loading suppressor caption", e);
+ }
+ return suppressor.getPackageName();
+ }
+
+ private final class H extends Handler {
+ private static final int UPDATE_EFFECTS_SUPPRESSOR = 1;
+ private static final int UPDATE_RINGER_MODE = 2;
+
+ private H() {
+ super(Looper.getMainLooper());
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case UPDATE_EFFECTS_SUPPRESSOR:
+ updateEffectsSuppressor();
+ break;
+ case UPDATE_RINGER_MODE:
+ updateRingerMode();
+ break;
+ }
+ }
+ }
+
+ private class RingReceiver extends BroadcastReceiver {
+ private boolean mRegistered;
+
+ public void register(boolean register) {
+ if (mRegistered == register) return;
+ if (register) {
+ final IntentFilter filter = new IntentFilter();
+ filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED);
+ filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
+ mContext.registerReceiver(this, filter);
+ } else {
+ mContext.unregisterReceiver(this);
+ }
+ mRegistered = register;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED.equals(action)) {
+ mHandler.sendEmptyMessage(H.UPDATE_EFFECTS_SUPPRESSOR);
+ } else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) {
+ mHandler.sendEmptyMessage(H.UPDATE_RINGER_MODE);
+ }
+ }
+ }
+
+}