1 /* 2 * Copyright (C) 2020 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.privacy; 18 19 import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR; 20 import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_X; 21 import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected; 22 23 import android.app.tvsettings.TvSettingsEnums; 24 import android.content.Intent; 25 import android.os.Bundle; 26 27 import androidx.annotation.Keep; 28 import androidx.annotation.Nullable; 29 import androidx.preference.Preference; 30 import androidx.preference.PreferenceCategory; 31 32 import com.android.tv.settings.R; 33 import com.android.tv.settings.SettingsPreferenceFragment; 34 import com.android.tv.settings.overlay.FlavorUtils; 35 import com.android.tv.settings.util.SliceUtils; 36 import com.android.tv.twopanelsettings.slices.CustomContentDescriptionPreference; 37 import com.android.tv.twopanelsettings.slices.SlicePreference; 38 39 /** 40 * The Privacy policies screen in Settings. 41 */ 42 @Keep 43 public class PrivacyFragment extends SettingsPreferenceFragment { 44 private static final String KEY_ACCOUNT_SETTINGS_CATEGORY = "accountSettings"; 45 private static final String KEY_USAGE = "usageAndDiag"; 46 private static final String KEY_ADS = "ads"; 47 private static final String KEY_ASSISTANT = "assistant"; 48 private static final String KEY_PURCHASES = "purchases"; 49 private static final String KEY_SECURITY = "security"; 50 private static final String KEY_OVERLAY_SECURITY = "overlay_security"; 51 private static final String KEY_MIC = "microphone"; 52 private static final String KEY_CAMERA = "camera"; 53 private static final String KEY_UPDATE = "update"; 54 getPreferenceScreenResId()55 private int getPreferenceScreenResId() { 56 switch (FlavorUtils.getFlavor(getContext())) { 57 case FLAVOR_X: 58 case FLAVOR_VENDOR: 59 return R.xml.privacy_x; 60 default: 61 return R.xml.privacy; 62 } 63 } 64 65 @Override onCreatePreferences(Bundle bundle, String s)66 public void onCreatePreferences(Bundle bundle, String s) { 67 setPreferencesFromResource(getPreferenceScreenResId(), null); 68 PreferenceCategory accountPrefCategory = findPreference(KEY_ACCOUNT_SETTINGS_CATEGORY); 69 Preference assistantSlicePreference = findPreference(KEY_ASSISTANT); 70 Preference purchasesSlicePreference = findPreference(KEY_PURCHASES); 71 Preference adsPreference = findPreference(KEY_ADS); 72 final Preference securityPreference = findPreference(KEY_SECURITY); 73 final Preference overlaySecuritySlicePreference = findPreference(KEY_OVERLAY_SECURITY); 74 final Preference updateSlicePreference = findPreference(KEY_UPDATE); 75 76 PrivacyToggle.MIC_TOGGLE.preparePreferenceWithSensorFragment(getContext(), 77 findPreference(KEY_MIC), SensorFragment.TOGGLE_EXTRA); 78 PrivacyToggle.CAMERA_TOGGLE.preparePreferenceWithSensorFragment(getContext(), 79 findPreference(KEY_CAMERA), SensorFragment.TOGGLE_EXTRA); 80 81 if (FlavorUtils.getFeatureFactory(getContext()).getBasicModeFeatureProvider() 82 .isBasicMode(getContext())) { 83 accountPrefCategory.setVisible(false); 84 assistantSlicePreference.setVisible(false); 85 purchasesSlicePreference.setVisible(false); 86 adsPreference.setVisible(false); 87 showSecurityPreference(securityPreference, overlaySecuritySlicePreference); 88 if (updateSlicePreference != null) { 89 updateSlicePreference.setVisible(false); 90 } 91 return; 92 } 93 if (assistantSlicePreference instanceof SlicePreference 94 && SliceUtils.isSliceProviderValid( 95 getContext(), ((SlicePreference) assistantSlicePreference).getUri())) { 96 assistantSlicePreference.setVisible(true); 97 } 98 if (purchasesSlicePreference instanceof SlicePreference 99 && SliceUtils.isSliceProviderValid( 100 getContext(), ((SlicePreference) purchasesSlicePreference).getUri())) { 101 purchasesSlicePreference.setVisible(true); 102 } 103 accountPrefCategory.setVisible( 104 assistantSlicePreference.isVisible() || purchasesSlicePreference.isVisible()); 105 findPreference(KEY_ADS).setOnPreferenceClickListener(preference -> { 106 Intent intent = new Intent(); 107 intent.setAction("com.google.android.gms.settings.ADS_PRIVACY"); 108 startActivity(intent); 109 return true; 110 }); 111 if (adsPreference instanceof CustomContentDescriptionPreference) { 112 ((CustomContentDescriptionPreference) adsPreference).setContentDescription( 113 getResources().getString(R.string.ads_content_description)); 114 } 115 if (isOverlaySecuritySlicePreferenceEnabled(overlaySecuritySlicePreference)) { 116 showOverlaySecuritySlicePreference( 117 overlaySecuritySlicePreference, securityPreference); 118 } else { 119 showSecurityPreference(securityPreference, overlaySecuritySlicePreference); 120 } 121 122 if (updateSlicePreference != null) { 123 updateSlicePreference.setVisible( 124 isUpdateSlicePreferenceEnabled(updateSlicePreference)); 125 } 126 } 127 isOverlaySecuritySlicePreferenceEnabled( @ullable Preference overlaySecuritySlicePreference)128 private boolean isOverlaySecuritySlicePreferenceEnabled( 129 @Nullable Preference overlaySecuritySlicePreference) { 130 return overlaySecuritySlicePreference instanceof SlicePreference 131 && SliceUtils.isSettingsSliceEnabled( 132 getContext(), ((SlicePreference) overlaySecuritySlicePreference).getUri()); 133 } 134 showOverlaySecuritySlicePreference( @ullable Preference overlaySecuritySlicePreference, @Nullable Preference securityPreference)135 private void showOverlaySecuritySlicePreference( 136 @Nullable Preference overlaySecuritySlicePreference, 137 @Nullable Preference securityPreference) { 138 if (overlaySecuritySlicePreference != null) { 139 overlaySecuritySlicePreference.setVisible(true); 140 } 141 if (securityPreference != null) { 142 securityPreference.setVisible(false); 143 } 144 } 145 showSecurityPreference( @ullable Preference securityPreference, @Nullable Preference overlaySecuritySlicePreference)146 private void showSecurityPreference( 147 @Nullable Preference securityPreference, 148 @Nullable Preference overlaySecuritySlicePreference) { 149 if (securityPreference != null) { 150 securityPreference.setVisible(true); 151 } 152 if (overlaySecuritySlicePreference != null) { 153 overlaySecuritySlicePreference.setVisible(false); 154 } 155 } 156 isUpdateSlicePreferenceEnabled( @ullable Preference updateSlicePreference)157 private boolean isUpdateSlicePreferenceEnabled( 158 @Nullable Preference updateSlicePreference) { 159 return updateSlicePreference instanceof SlicePreference 160 && SliceUtils.isSettingsSliceEnabled( 161 getContext(), ((SlicePreference) updateSlicePreference).getUri()); 162 } 163 164 @Override onPreferenceTreeClick(Preference preference)165 public boolean onPreferenceTreeClick(Preference preference) { 166 switch (preference.getKey()) { 167 case KEY_USAGE: 168 logEntrySelected(TvSettingsEnums.PRIVACY_DIAGNOSTICS); 169 break; 170 case KEY_ADS: 171 logEntrySelected(TvSettingsEnums.PRIVACY_ADS); 172 break; 173 } 174 return super.onPreferenceTreeClick(preference); 175 } 176 177 @Override getPageId()178 protected int getPageId() { 179 return TvSettingsEnums.PRIVACY; 180 } 181 } 182