1 /*
2  * Copyright (C) 2015 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.tv.settings.device.displaysound;
18 
19 import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
20 import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
21 import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR;
22 import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_X;
23 import static com.android.tv.settings.util.InstrumentationUtils.logToggleInteracted;
24 
25 import android.app.tvsettings.TvSettingsEnums;
26 import android.content.ContentResolver;
27 import android.content.Context;
28 import android.media.AudioManager;
29 import android.os.Bundle;
30 import android.provider.Settings;
31 import android.text.TextUtils;
32 
33 import androidx.annotation.Keep;
34 import androidx.preference.Preference;
35 import androidx.preference.TwoStatePreference;
36 
37 import com.android.tv.settings.R;
38 import com.android.tv.settings.SettingsPreferenceFragment;
39 import com.android.tv.settings.overlay.FlavorUtils;
40 import com.android.tv.settings.util.SliceUtils;
41 import com.android.tv.twopanelsettings.slices.SlicePreference;
42 
43 /**
44  * The "Display & sound" screen in TV Settings.
45  */
46 @Keep
47 public class DisplaySoundFragment extends SettingsPreferenceFragment {
48 
49     static final String KEY_SOUND_EFFECTS = "sound_effects";
50     private static final String KEY_CEC = "cec";
51 
52     private AudioManager mAudioManager;
53 
newInstance()54     public static DisplaySoundFragment newInstance() {
55         return new DisplaySoundFragment();
56     }
57 
getSoundEffectsEnabled(ContentResolver contentResolver)58     public static boolean getSoundEffectsEnabled(ContentResolver contentResolver) {
59         return Settings.System.getInt(contentResolver, Settings.System.SOUND_EFFECTS_ENABLED, 1)
60                 != 0;
61     }
62 
63     @Override
onAttach(Context context)64     public void onAttach(Context context) {
65         mAudioManager = context.getSystemService(AudioManager.class);
66         super.onAttach(context);
67     }
68 
getPreferenceScreenResId()69     private int getPreferenceScreenResId() {
70         switch (FlavorUtils.getFlavor(getContext())) {
71             case FLAVOR_CLASSIC:
72             case FLAVOR_TWO_PANEL:
73                 return R.xml.display_sound;
74             case FLAVOR_X:
75             case FLAVOR_VENDOR:
76                 return R.xml.display_sound_x;
77             default:
78                 return R.xml.display_sound;
79         }
80     }
81 
82     @Override
onCreatePreferences(Bundle savedInstanceState, String rootKey)83     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
84         setPreferencesFromResource(getPreferenceScreenResId(), null);
85 
86         final TwoStatePreference soundPref = findPreference(KEY_SOUND_EFFECTS);
87         soundPref.setChecked(getSoundEffectsEnabled());
88         updateCecPreference();
89     }
90 
91     @Override
onResume()92     public void onResume() {
93         super.onResume();
94         // Update the subtitle of CEC setting when navigating back to this page.
95         updateCecPreference();
96     }
97 
98     @Override
onPreferenceTreeClick(Preference preference)99     public boolean onPreferenceTreeClick(Preference preference) {
100         if (TextUtils.equals(preference.getKey(), KEY_SOUND_EFFECTS)) {
101             final TwoStatePreference soundPref = (TwoStatePreference) preference;
102             logToggleInteracted(TvSettingsEnums.DISPLAY_SOUND_SYSTEM_SOUNDS, soundPref.isChecked());
103             setSoundEffectsEnabled(soundPref.isChecked());
104         }
105         return super.onPreferenceTreeClick(preference);
106     }
107 
getSoundEffectsEnabled()108     private boolean getSoundEffectsEnabled() {
109         return getSoundEffectsEnabled(getActivity().getContentResolver());
110     }
111 
setSoundEffectsEnabled(boolean enabled)112     private void setSoundEffectsEnabled(boolean enabled) {
113         if (enabled) {
114             mAudioManager.loadSoundEffects();
115         } else {
116             mAudioManager.unloadSoundEffects();
117         }
118         Settings.System.putInt(getActivity().getContentResolver(),
119                 Settings.System.SOUND_EFFECTS_ENABLED, enabled ? 1 : 0);
120     }
121 
updateCecPreference()122     private void updateCecPreference() {
123         Preference cecPreference = findPreference(KEY_CEC);
124         if (cecPreference instanceof SlicePreference
125                 && SliceUtils.isSliceProviderValid(
126                         getContext(), ((SlicePreference) cecPreference).getUri())) {
127             ContentResolver resolver = getContext().getContentResolver();
128             // Note that default CEC is enabled. You'll find similar retrieval of property in
129             // HdmiControlService.
130             boolean cecEnabled =
131                     Settings.Global.getInt(resolver, Settings.Global.HDMI_CONTROL_ENABLED, 1) != 0;
132             cecPreference.setSummary(cecEnabled ? R.string.enabled : R.string.disabled);
133             cecPreference.setVisible(true);
134         } else {
135             cecPreference.setVisible(false);
136         }
137     }
138 
139     @Override
getPageId()140     protected int getPageId() {
141         return TvSettingsEnums.DISPLAY_SOUND;
142     }
143 }
144