1 /*
2  * Copyright (C) 2019 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.gestures;
18 
19 import android.content.Context;
20 import android.provider.Settings;
21 import android.widget.CompoundButton;
22 import android.widget.CompoundButton.OnCheckedChangeListener;
23 
24 import androidx.annotation.VisibleForTesting;
25 import androidx.preference.Preference;
26 import androidx.preference.PreferenceScreen;
27 
28 import com.android.settings.R;
29 import com.android.settings.core.PreferenceControllerMixin;
30 import com.android.settingslib.core.AbstractPreferenceController;
31 import com.android.settingslib.widget.MainSwitchPreference;
32 
33 public class PreventRingingSwitchPreferenceController extends AbstractPreferenceController
34         implements PreferenceControllerMixin, OnCheckedChangeListener {
35 
36     private static final String KEY = "gesture_prevent_ringing_switch";
37     private final Context mContext;
38 
39     @VisibleForTesting
40     MainSwitchPreference mSwitch;
41 
PreventRingingSwitchPreferenceController(Context context)42     public PreventRingingSwitchPreferenceController(Context context) {
43         super(context);
44         mContext = context;
45     }
46 
47     @Override
getPreferenceKey()48     public String getPreferenceKey() {
49         return KEY;
50     }
51 
52     @Override
displayPreference(PreferenceScreen screen)53     public void displayPreference(PreferenceScreen screen) {
54         super.displayPreference(screen);
55         if (isAvailable()) {
56             Preference pref = screen.findPreference(getPreferenceKey());
57             if (pref != null) {
58                 pref.setOnPreferenceClickListener(preference -> {
59                     int preventRinging = Settings.Secure.getInt(mContext.getContentResolver(),
60                             Settings.Secure.VOLUME_HUSH_GESTURE,
61                             Settings.Secure.VOLUME_HUSH_VIBRATE);
62                     boolean isChecked = preventRinging != Settings.Secure.VOLUME_HUSH_OFF;
63                     Settings.Secure.putInt(mContext.getContentResolver(),
64                             Settings.Secure.VOLUME_HUSH_GESTURE, isChecked
65                                     ? Settings.Secure.VOLUME_HUSH_OFF
66                                     : Settings.Secure.VOLUME_HUSH_VIBRATE);
67                     return true;
68                 });
69                 mSwitch = (MainSwitchPreference) pref;
70                 mSwitch.setTitle(mContext.getString(R.string.prevent_ringing_main_switch_title));
71                 mSwitch.addOnSwitchChangeListener(this);
72                 updateState(mSwitch);
73             }
74         }
75     }
76 
setChecked(boolean isChecked)77     public void setChecked(boolean isChecked) {
78         if (mSwitch != null) {
79             mSwitch.updateStatus(isChecked);
80         }
81     }
82 
83     @Override
updateState(Preference preference)84     public void updateState(Preference preference) {
85         int preventRingingSetting = Settings.Secure.getInt(mContext.getContentResolver(),
86                 Settings.Secure.VOLUME_HUSH_GESTURE, Settings.Secure.VOLUME_HUSH_VIBRATE);
87         setChecked(preventRingingSetting != Settings.Secure.VOLUME_HUSH_OFF);
88     }
89 
90     @Override
isAvailable()91     public boolean isAvailable() {
92         return mContext.getResources().getBoolean(
93                 com.android.internal.R.bool.config_volumeHushGestureEnabled);
94     }
95 
96     @Override
onCheckedChanged(CompoundButton buttonView, boolean isChecked)97     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
98         final int preventRingingSetting = Settings.Secure.getInt(mContext.getContentResolver(),
99                 Settings.Secure.VOLUME_HUSH_GESTURE, Settings.Secure.VOLUME_HUSH_VIBRATE);
100         final int newRingingSetting = preventRingingSetting == Settings.Secure.VOLUME_HUSH_OFF
101                 ? Settings.Secure.VOLUME_HUSH_VIBRATE
102                 : preventRingingSetting;
103 
104         Settings.Secure.putInt(mContext.getContentResolver(),
105                 Settings.Secure.VOLUME_HUSH_GESTURE, isChecked
106                         ? newRingingSetting
107                         : Settings.Secure.VOLUME_HUSH_OFF);
108     }
109 }
110