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