1 /* 2 * Copyright (C) 2022 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.app.NotificationManager; 20 import android.content.BroadcastReceiver; 21 import android.content.Context; 22 import android.content.Intent; 23 import android.content.IntentFilter; 24 import android.media.AudioManager; 25 import android.os.Handler; 26 import android.os.Looper; 27 import android.os.Message; 28 import android.service.notification.NotificationListenerService; 29 30 import androidx.annotation.NonNull; 31 import androidx.lifecycle.DefaultLifecycleObserver; 32 import androidx.lifecycle.LifecycleOwner; 33 34 import com.android.settings.R; 35 36 /** 37 * This slider is used to represent ring volume when ring is separated from notification 38 */ 39 // LINT.IfChange 40 public class SeparateRingVolumePreferenceController extends 41 RingerModeAffectedVolumePreferenceController implements DefaultLifecycleObserver { 42 43 private static final String KEY_SEPARATE_RING_VOLUME = "separate_ring_volume"; 44 private static final String TAG = "SeparateRingVolumePreferenceController"; 45 46 private final RingReceiver mReceiver = new RingReceiver(); 47 private final H mHandler = new H(); 48 SeparateRingVolumePreferenceController(Context context)49 public SeparateRingVolumePreferenceController(Context context) { 50 this(context, KEY_SEPARATE_RING_VOLUME); 51 } 52 SeparateRingVolumePreferenceController(Context context, String key)53 public SeparateRingVolumePreferenceController(Context context, String key) { 54 super(context, key, TAG); 55 56 mNormalIconId = R.drawable.ic_ring_volume; 57 mVibrateIconId = R.drawable.ic_volume_ringer_vibrate; 58 mSilentIconId = R.drawable.ic_ring_volume_off; 59 60 updateRingerMode(); 61 } 62 63 @Override onResume(@onNull LifecycleOwner owner)64 public void onResume(@NonNull LifecycleOwner owner) { 65 mReceiver.register(true); 66 updateEffectsSuppressor(); 67 selectPreferenceIconState(); 68 updateContentDescription(); 69 70 if (mPreference != null) { 71 mPreference.setVisible(getAvailabilityStatus() == AVAILABLE); 72 } 73 } 74 75 @Override onPause(@onNull LifecycleOwner owner)76 public void onPause(@NonNull LifecycleOwner owner) { 77 mReceiver.register(false); 78 } 79 80 @Override getPreferenceKey()81 public String getPreferenceKey() { 82 return KEY_SEPARATE_RING_VOLUME; 83 } 84 85 @Override getAvailabilityStatus()86 public int getAvailabilityStatus() { 87 return !mHelper.isSingleVolume() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; 88 } 89 90 @Override getAudioStream()91 public int getAudioStream() { 92 return AudioManager.STREAM_RING; 93 } 94 95 @Override hintsMatch(int hints)96 protected boolean hintsMatch(int hints) { 97 return (hints & NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS) != 0 98 || (hints & NotificationListenerService.HINT_HOST_DISABLE_EFFECTS) != 0; 99 } 100 101 private final class H extends Handler { 102 private static final int UPDATE_EFFECTS_SUPPRESSOR = 1; 103 private static final int UPDATE_RINGER_MODE = 2; 104 H()105 private H() { 106 super(Looper.getMainLooper()); 107 } 108 109 @Override handleMessage(Message msg)110 public void handleMessage(Message msg) { 111 switch (msg.what) { 112 case UPDATE_EFFECTS_SUPPRESSOR: 113 updateEffectsSuppressor(); 114 break; 115 case UPDATE_RINGER_MODE: 116 updateRingerMode(); 117 break; 118 } 119 } 120 } 121 122 private class RingReceiver extends BroadcastReceiver { 123 private boolean mRegistered; 124 register(boolean register)125 public void register(boolean register) { 126 if (mRegistered == register) return; 127 if (register) { 128 final IntentFilter filter = new IntentFilter(); 129 filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED); 130 filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION); 131 mContext.registerReceiver(this, filter); 132 } else { 133 mContext.unregisterReceiver(this); 134 } 135 mRegistered = register; 136 } 137 138 @Override onReceive(Context context, Intent intent)139 public void onReceive(Context context, Intent intent) { 140 final String action = intent.getAction(); 141 if (NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED.equals(action)) { 142 mHandler.sendEmptyMessage(H.UPDATE_EFFECTS_SUPPRESSOR); 143 } else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) { 144 mHandler.sendEmptyMessage(H.UPDATE_RINGER_MODE); 145 } 146 } 147 } 148 149 } 150 // LINT.ThenChange(SeparateRingVolumePreference.kt) 151