• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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