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