]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blob - app/src/main/java/com/stoutner/privacybrowser/fragments/DomainSettingsFragment.java
Add `System default` entries in domain settings. https://redmine.stoutner.com/issues/153
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / fragments / DomainSettingsFragment.java
1 /*
2  * Copyright © 2017 Soren Stoutner <soren@stoutner.com>.
3  *
4  * This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
5  *
6  * Privacy Browser is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * Privacy Browser is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Privacy Browser.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 package com.stoutner.privacybrowser.fragments;
21
22 import android.annotation.SuppressLint;
23 import android.content.Context;
24 import android.content.SharedPreferences;
25 import android.database.Cursor;
26 import android.os.Build;
27 import android.os.Bundle;
28 // We have to use `android.support.v4.app.Fragment` until minimum API >= 23.  Otherwise we cannot call `getContext()`.
29 import android.preference.PreferenceManager;
30 import android.support.v4.app.Fragment;
31 import android.view.LayoutInflater;
32 import android.view.View;
33 import android.view.ViewGroup;
34 import android.webkit.WebView;
35 import android.widget.AdapterView;
36 import android.widget.ArrayAdapter;
37 import android.widget.CompoundButton;
38 import android.widget.EditText;
39 import android.widget.ImageView;
40 import android.widget.LinearLayout;
41 import android.widget.Spinner;
42 import android.widget.Switch;
43 import android.widget.TextView;
44
45 import com.stoutner.privacybrowser.R;
46 import com.stoutner.privacybrowser.activities.MainWebViewActivity;
47 import com.stoutner.privacybrowser.helpers.DomainsDatabaseHelper;
48
49 public class DomainSettingsFragment extends Fragment {
50     // `DATABASE_ID` is used by activities calling this fragment.
51     public static final String DATABASE_ID = "database_id";
52
53     // `databaseId` is used in `onCreate()` and `onCreateView()`.
54     private int databaseId;
55
56     @Override
57     public void onCreate(Bundle savedInstanceState) {
58         super.onCreate(savedInstanceState);
59
60         // Store the database id in `databaseId`.
61         databaseId = getArguments().getInt(DATABASE_ID);
62     }
63
64     // We have to use the deprecated `getDrawable()` until the minimum API >= 21.
65     @SuppressWarnings("deprecation")
66     @Override
67     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
68         // Inflate `domain_settings`.  `false` does not attach it to the root `container`.
69         View domainSettingsView = inflater.inflate(R.layout.domain_settings, container, false);
70
71         // Get a handle for the `Context`.
72         Context context = getContext();
73
74         // Get handles for the views in the fragment.
75         EditText domainNameEditText = (EditText) domainSettingsView.findViewById(R.id.domain_settings_name_edittext);
76         Switch javaScriptEnabledSwitch = (Switch) domainSettingsView.findViewById(R.id.domain_settings_javascript_switch);
77         final ImageView javaScriptImageView = (ImageView) domainSettingsView.findViewById(R.id.domain_settings_javascript_imageview);
78         Switch firstPartyCookiesEnabledSwitch = (Switch) domainSettingsView.findViewById(R.id.domain_settings_first_party_cookies_switch);
79         final ImageView firstPartyCookiesImageView = (ImageView) domainSettingsView.findViewById(R.id.domain_settings_first_party_cookies_imageview);
80         LinearLayout thirdPartyCookiesLinearLayout = (LinearLayout) domainSettingsView.findViewById(R.id.domain_settings_third_party_cookies_linearlayout);
81         final Switch thirdPartyCookiesEnabledSwitch = (Switch) domainSettingsView.findViewById(R.id.domain_settings_third_party_cookies_switch);
82         final ImageView thirdPartyCookiesImageView = (ImageView) domainSettingsView.findViewById(R.id.domain_settings_third_party_cookies_imageview);
83         final Switch domStorageEnabledSwitch = (Switch) domainSettingsView.findViewById(R.id.domain_settings_dom_storage_switch);
84         final ImageView domStorageImageView = (ImageView) domainSettingsView.findViewById(R.id.domain_settings_dom_storage_imageview);
85         Switch formDataEnabledSwitch = (Switch) domainSettingsView.findViewById(R.id.domain_settings_form_data_switch);
86         final ImageView formDataImageView = (ImageView) domainSettingsView.findViewById(R.id.domain_settings_form_data_imageview);
87         Spinner userAgentSpinner = (Spinner) domainSettingsView.findViewById(R.id.domain_settings_user_agent_spinner);
88         final TextView userAgentTextView = (TextView) domainSettingsView.findViewById(R.id.domain_settings_user_agent_textview);
89         final EditText customUserAgentEditText = (EditText) domainSettingsView.findViewById(R.id.domain_settings_custom_user_agent_edittext);
90         Spinner fontSizeSpinner = (Spinner) domainSettingsView.findViewById(R.id.domain_settings_font_size_spinner);
91         final ImageView displayWebpageImagesImageView = (ImageView) domainSettingsView.findViewById(R.id.domain_settings_display_webpage_images_imageview);
92         Spinner displayWebpageImagesSpinner = (Spinner) domainSettingsView.findViewById(R.id.domain_settings_display_webpage_images_spinner);
93
94         // Initialize the database handler.  `this` specifies the context.  The two `nulls` do not specify the database name or a `CursorFactory`.
95         // The `0` specifies the database version, but that is ignored and set instead using a constant in `DomainsDatabaseHelper`.
96         DomainsDatabaseHelper domainsDatabaseHelper = new DomainsDatabaseHelper(getContext(), null, null, 0);
97
98         // Get the database `Cursor` for this ID and move it to the first row.
99         Cursor domainCursor = domainsDatabaseHelper.getCursorForId(databaseId);
100         domainCursor.moveToFirst();
101
102         // Save the `Cursor` entries as variables.
103         String domainNameString = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.DOMAIN_NAME));
104         int javaScriptEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_JAVASCRIPT));
105         int firstPartyCookiesEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_FIRST_PARTY_COOKIES));
106         int thirdPartyCookiesEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_THIRD_PARTY_COOKIES));
107         int domStorageEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_DOM_STORAGE));
108         int formDataEnabledInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.ENABLE_FORM_DATA));
109         final String currentUserAgentString = domainCursor.getString(domainCursor.getColumnIndex(DomainsDatabaseHelper.USER_AGENT));
110         int fontSizeInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.FONT_SIZE));
111         int displayImagesInt = domainCursor.getInt(domainCursor.getColumnIndex(DomainsDatabaseHelper.DISPLAY_IMAGES));
112
113         // Create `ArrayAdapters` for the `Spinners`and their `entry values`.
114         ArrayAdapter<CharSequence> userAgentArrayAdapter = ArrayAdapter.createFromResource(context, R.array.domain_settings_user_agent_entries, R.layout.spinner_item);
115         final ArrayAdapter<CharSequence> userAgentEntryValuesArrayAdapter = ArrayAdapter.createFromResource(context, R.array.domain_settings_user_agent_entry_values, R.layout.spinner_item);
116         ArrayAdapter<CharSequence> fontSizeArrayAdapter = ArrayAdapter.createFromResource(context, R.array.domain_settings_font_size_entries, R.layout.spinner_item);
117         ArrayAdapter<CharSequence> fontSizeEntryValuesArrayAdapter = ArrayAdapter.createFromResource(context, R.array.domain_settings_font_size_entry_values, R.layout.spinner_item);
118         final ArrayAdapter<CharSequence> displayImagesArrayAdapter = ArrayAdapter.createFromResource(context, R.array.display_website_images_array, R.layout.spinner_item);
119
120         // Set the `DropDownViewResource` on the `Spinners`.
121         userAgentArrayAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
122         fontSizeArrayAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
123         displayImagesArrayAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
124
125         // Set the `ArrayAdapters` for the `Spinners`.
126         userAgentSpinner.setAdapter(userAgentArrayAdapter);
127         fontSizeSpinner.setAdapter(fontSizeArrayAdapter);
128         displayWebpageImagesSpinner.setAdapter(displayImagesArrayAdapter);
129
130         // Set the domain name from the the database cursor.
131         domainNameEditText.setText(domainNameString);
132
133         // Set the JavaScript status.
134         if (javaScriptEnabledInt == 1) {  // JavaScript is enabled.
135             javaScriptEnabledSwitch.setChecked(true);
136             javaScriptImageView.setImageDrawable(getResources().getDrawable(R.drawable.javascript_enabled));
137         } else {  // JavaScript is disabled.
138             javaScriptEnabledSwitch.setChecked(false);
139             javaScriptImageView.setImageDrawable(getResources().getDrawable(R.drawable.privacy_mode));
140         }
141
142         // Set the first-party cookies status.  Once minimum API >= 21 we can use a selector as the tint mode instead of specifying different icons.
143         if (firstPartyCookiesEnabledInt == 1) {  // First-party cookies are enabled.
144             firstPartyCookiesEnabledSwitch.setChecked(true);
145             firstPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_enabled));
146         } else {  // First-party cookies are disabled.
147             firstPartyCookiesEnabledSwitch.setChecked(false);
148
149             // Set the icon according to the theme.
150             if (MainWebViewActivity.darkTheme) {
151                 firstPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_disabled_dark));
152             } else {
153                 firstPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_disabled_light));
154             }
155         }
156
157         // Only display third-party cookies if SDK_INT >= 21.
158         if (Build.VERSION.SDK_INT >= 21) {  // Third-party cookies can be configured for API >= 21.
159             // Only enable third-party-cookies if first-party cookies are enabled.
160             if (firstPartyCookiesEnabledInt == 1) {  // First-party cookies are enabled.
161                 // Set the third-party cookies status.  Once minimum API >= 21 we can use a selector as the tint mode instead of specifying different icons.
162                 if (thirdPartyCookiesEnabledInt == 1) {  // Both first-party and third-party cookies are enabled.
163                     thirdPartyCookiesEnabledSwitch.setChecked(true);
164                     thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_warning));
165                 } else {  // First party cookies are enabled but third-party cookies are disabled.
166                     thirdPartyCookiesEnabledSwitch.setChecked(false);
167
168                     // Set the icon according to the theme.
169                     if (MainWebViewActivity.darkTheme) {
170                         thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_disabled_dark));
171                     } else {
172                         thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_disabled_light));
173                     }
174                 }
175             } else {  // First-party cookies are disabled.
176                 // Set the status of third-party cookies.
177                 if (thirdPartyCookiesEnabledInt == 1) {
178                     thirdPartyCookiesEnabledSwitch.setChecked(true);
179                 } else {
180                     thirdPartyCookiesEnabledSwitch.setChecked(false);
181                 }
182
183                 // Disable the third-party cookies switch.
184                 thirdPartyCookiesEnabledSwitch.setEnabled(false);
185
186                 // Set the icon according to the theme.
187                 if (MainWebViewActivity.darkTheme) {
188                     thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_ghosted_dark));
189                 } else {
190                     thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_ghosted_light));
191                 }
192             }
193         } else {  // Third-party cookies cannot be configured for API <= 21.
194             // Hide the `LinearLayout` for third-party cookies.
195             thirdPartyCookiesLinearLayout.setVisibility(View.GONE);
196         }
197
198         // Only enable DOM storage if JavaScript is enabled.
199         if (javaScriptEnabledInt == 1) {  // JavaScript is enabled.
200             // Set the DOM storage status.  Once minimum API >= 21 we can use a selector as the tint mode instead of specifying different icons.
201             if (domStorageEnabledInt == 1) {  // Both JavaScript and DOM storage are enabled.
202                 domStorageEnabledSwitch.setChecked(true);
203                 domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_enabled));
204             } else {  // JavaScript is enabled but DOM storage is disabled.
205                 // Set the DOM storage switch to off.
206                 domStorageEnabledSwitch.setChecked(false);
207
208                 // Set the icon according to the theme.
209                 if (MainWebViewActivity.darkTheme) {
210                     domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_disabled_dark));
211                 } else {
212                     domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_disabled_light));
213                 }
214             }
215         } else {  // JavaScript is disabled.
216             // Set the checked status of DOM storage.
217             if (domStorageEnabledInt == 1) {  // DOM storage is enabled but JavaScript is disabled.
218                 domStorageEnabledSwitch.setChecked(true);
219             } else {  // Both JavaScript and DOM storage are disabled.
220                 domStorageEnabledSwitch.setChecked(false);
221             }
222
223             // Disable `domStorageEnabledSwitch`.
224             domStorageEnabledSwitch.setEnabled(false);
225
226             // Set the icon according to the theme.
227             if (MainWebViewActivity.darkTheme) {
228                 domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_ghosted_dark));
229             } else {
230                 domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_ghosted_light));
231             }
232         }
233
234         // Set the form data status.  Once minimum API >= 21 we can use a selector as the tint mode instead of specifying different icons.
235         if (formDataEnabledInt == 1) {  // Form data is enabled.
236             formDataEnabledSwitch.setChecked(true);
237             formDataImageView.setImageDrawable(getResources().getDrawable(R.drawable.form_data_enabled));
238         } else {  // Form data is disabled.
239             // Set the form data switch to off.
240             formDataEnabledSwitch.setChecked(false);
241
242             // Set the icon according to the theme.
243             if (MainWebViewActivity.darkTheme) {
244                 formDataImageView.setImageDrawable(getResources().getDrawable(R.drawable.form_data_disabled_dark));
245             } else {
246                 formDataImageView.setImageDrawable(getResources().getDrawable(R.drawable.form_data_disabled_light));
247             }
248         }
249
250         // We need to inflated a `WebView` to get the default user agent.
251         // `@SuppressLint("InflateParams")` removes the warning about using `null` as the `ViewGroup`, which in this case makes sense because we don't want to display `bare_webview` on the screen.  `false` does not attach the view to the root.
252         @SuppressLint("InflateParams") View bareWebViewLayout = inflater.inflate(R.layout.bare_webview, null, false);
253         WebView bareWebView = (WebView) bareWebViewLayout.findViewById(R.id.bare_webview);
254         final String webViewDefaultUserAgentString = bareWebView.getSettings().getUserAgentString();
255
256         // Get a handle for the shared preference.  `this` references the current context.
257         SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
258
259         // Store the default user agent string values.
260         final String defaultUserAgentString = sharedPreferences.getString("user_agent", "PrivacyBrowser/1.0");
261         final String defaultCustomUserAgentString = sharedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0");
262
263         // Get the position of the user agent in `userAgentEntryValuesArrayAdapter`.
264         int userAgentArrayPosition = userAgentEntryValuesArrayAdapter.getPosition(currentUserAgentString);
265
266         // Set the user agent.
267         if (userAgentArrayPosition == -1) {  // We are using a custom `userAgentString`.
268             // Set `userAgentSpinner` to `Custom`.
269             userAgentSpinner.setSelection(userAgentEntryValuesArrayAdapter.getPosition("Custom user agent"));
270
271             // Hide `userAgentTextView`.
272             userAgentTextView.setVisibility(View.GONE);
273
274             // Show `customUserAgentEditText` and set `userAgentString` as the text.
275             customUserAgentEditText.setVisibility(View.VISIBLE);
276             customUserAgentEditText.setText(currentUserAgentString);
277         } else{  // We are using one of the preset user agents.
278             // Set the `userAgentSpinner` selection.
279             userAgentSpinner.setSelection(userAgentArrayPosition);
280
281             // Show `userAgentTextView`.
282             userAgentTextView.setVisibility(View.VISIBLE);
283
284             // Hide `customUserAgentEditText`.
285             customUserAgentEditText.setVisibility(View.GONE);
286
287             // Set the user agent text.
288             switch (currentUserAgentString) {
289                 case "System default user agent":
290                     // Display the user agent text string.
291                     switch (defaultUserAgentString) {
292                         case "WebView default user agent":
293                             // Display the `WebView` default user agent.
294                             userAgentTextView.setText(webViewDefaultUserAgentString);
295                             break;
296
297                         case "Custom user agent":
298                             // Display the custom user agent.
299                             userAgentTextView.setText(defaultCustomUserAgentString);
300                             break;
301
302                         default:
303                             // Display the text from `defaultUserAgentString`.
304                             userAgentTextView.setText(defaultUserAgentString);
305                     }
306                     break;
307
308                 case "WebView default user agent":
309                     // Display the `WebView` default user agent.
310                     userAgentTextView.setText(webViewDefaultUserAgentString);
311                     break;
312
313                 default:
314                     // Display the text from `currentUserAgentString`.
315                     userAgentTextView.setText(currentUserAgentString);
316             }
317         }
318
319         // Set the selected font size.
320         int fontSizeArrayPosition = fontSizeEntryValuesArrayAdapter.getPosition(String.valueOf(fontSizeInt));
321         fontSizeSpinner.setSelection(fontSizeArrayPosition);
322
323         // Set the selected display website images mode.
324         displayWebpageImagesSpinner.setSelection(displayImagesInt);
325
326         // Set the display website images icon.
327         switch (displayImagesInt) {
328             case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_SYSTEM_DEFAULT:
329                 if (MainWebViewActivity.displayWebpageImagesBoolean) {
330                     // Set the icon according to the theme.
331                     if (MainWebViewActivity.darkTheme) {
332                         displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_enabled_dark));
333                     } else {
334                         displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_enabled_light));
335                     }
336                 } else {
337                     // Set the icon according to the theme.
338                     if (MainWebViewActivity.darkTheme) {
339                         displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_disabled_dark));
340                     } else {
341                         displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_disabled_light));
342                     }
343                 }
344                 break;
345
346             case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_ENABLED:
347                 // Set the icon according to the theme.
348                 if (MainWebViewActivity.darkTheme) {
349                     displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_enabled_dark));
350                 } else {
351                     displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_enabled_light));
352                 }
353                 break;
354
355             case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_DISABLED:
356                 // Set the icon according to the theme.
357                 if (MainWebViewActivity.darkTheme) {
358                     displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_disabled_dark));
359                 } else {
360                     displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_disabled_light));
361                 }
362                 break;
363         }
364
365
366         // Set the `javaScriptEnabledSwitch` `OnCheckedChangeListener()`.
367         javaScriptEnabledSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
368             @Override
369             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
370                 if (isChecked) {  // JavaScript is enabled.
371                     // Update the JavaScript icon.
372                     javaScriptImageView.setImageDrawable(getResources().getDrawable(R.drawable.javascript_enabled));
373
374                     // Enable the DOM storage `Switch`.
375                     domStorageEnabledSwitch.setEnabled(true);
376
377                     // Update the DOM storage icon.
378                     if (domStorageEnabledSwitch.isChecked()) {  // DOM storage is enabled.
379                         domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_enabled));
380                     } else {  // DOM storage is disabled.
381                         // Set the icon according to the theme.
382                         if (MainWebViewActivity.darkTheme) {
383                             domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_disabled_dark));
384                         } else {
385                             domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_disabled_light));
386                         }
387                     }
388                 } else {  // JavaScript is disabled.
389                     // Update the JavaScript icon.
390                     javaScriptImageView.setImageDrawable(getResources().getDrawable(R.drawable.privacy_mode));
391
392                     // Disable the DOM storage `Switch`.
393                     domStorageEnabledSwitch.setEnabled(false);
394
395                     // Set the DOM storage icon according to the theme.
396                     if (MainWebViewActivity.darkTheme) {
397                         domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_ghosted_dark));
398                     } else {
399                         domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_ghosted_light));
400                     }
401                 }
402             }
403         });
404
405         // Set the `firstPartyCookiesEnabledSwitch` `OnCheckedChangeListener()`.
406         firstPartyCookiesEnabledSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
407             @Override
408             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
409                 if (isChecked) {  // First-party cookies are enabled.
410                     // Update the first-party cookies icon.
411                     firstPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_enabled));
412
413                     // Enable the third-party cookies `Switch`.
414                     thirdPartyCookiesEnabledSwitch.setEnabled(true);
415
416                     // Update the third-party cookies icon.
417                     if (thirdPartyCookiesEnabledSwitch.isChecked()) {  // Third-party cookies are enabled.
418                         thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_warning));
419                     } else {  // Third-party cookies are disabled.
420                         // Set the third-party cookies icon according to the theme.
421                         if (MainWebViewActivity.darkTheme) {
422                             thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_disabled_dark));
423                         } else {
424                             thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_disabled_light));
425                         }
426                     }
427                 } else {  // First-party cookies are disabled.
428                     // Update the first-party cookies icon according to the theme.
429                     if (MainWebViewActivity.darkTheme) {
430                         firstPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_disabled_dark));
431                     } else {
432                         firstPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_disabled_light));
433                     }
434
435                     // Disable the third-party cookies `Switch`.
436                     thirdPartyCookiesEnabledSwitch.setEnabled(false);
437
438                     // Set the third-party cookies icon according to the theme.
439                     if (MainWebViewActivity.darkTheme) {
440                         thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_ghosted_dark));
441                     } else {
442                         thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_ghosted_light));
443                     }
444                 }
445             }
446         });
447
448         // Set the `thirdPartyCookiesEnabledSwitch` `OnCheckedChangeListener()`.
449         thirdPartyCookiesEnabledSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
450             @Override
451             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
452                 // Update the icon.
453                 if (isChecked) {
454                     thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_warning));
455                 } else {
456                     // Update the third-party cookies icon according to the theme.
457                     if (MainWebViewActivity.darkTheme) {
458                         thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_disabled_dark));
459                     } else {
460                         thirdPartyCookiesImageView.setImageDrawable(getResources().getDrawable(R.drawable.cookies_disabled_light));
461                     }
462                 }
463             }
464         });
465
466         // Set the `domStorageEnabledSwitch` `OnCheckedChangeListener()`.
467         domStorageEnabledSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
468             @Override
469             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
470                 // Update the icon.
471                 if (isChecked) {
472                     domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_enabled));
473                 } else {
474                     // Set the icon according to the theme.
475                     if (MainWebViewActivity.darkTheme) {
476                         domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_disabled_dark));
477                     } else {
478                         domStorageImageView.setImageDrawable(getResources().getDrawable(R.drawable.dom_storage_disabled_light));
479                     }
480                 }
481             }
482         });
483
484         // Set the `formDataEnabledSwitch` `OnCheckedChangeListener()`.
485         formDataEnabledSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
486             @Override
487             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
488                 // Update the icon.
489                 if (isChecked) {
490                     formDataImageView.setImageDrawable(getResources().getDrawable(R.drawable.form_data_enabled));
491                 } else {
492                     // Set the icon according to the theme.
493                     if (MainWebViewActivity.darkTheme) {
494                         formDataImageView.setImageDrawable(getResources().getDrawable(R.drawable.form_data_disabled_dark));
495                     } else {
496                         formDataImageView.setImageDrawable(getResources().getDrawable(R.drawable.form_data_disabled_light));
497                     }
498                 }
499             }
500         });
501
502         // Set the `userAgentSpinner` `onItemClickListener()`.
503         userAgentSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
504             @Override
505             public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
506                 // Store the new user agent string.
507                 String newUserAgentString = getResources().getStringArray(R.array.domain_settings_user_agent_entry_values)[position];
508
509                 // Set the new user agent.
510                 switch (newUserAgentString) {
511                     case "System default user agent":
512                         // Show `userAgentTextView`.
513                         userAgentTextView.setVisibility(View.VISIBLE);
514
515                         // Hide `customUserAgentEditText`.
516                         customUserAgentEditText.setVisibility(View.GONE);
517
518                         // Set the user text.
519                         switch (defaultUserAgentString) {
520                             case "WebView default user agent":
521                                 // Display the `WebView` default user agent.
522                                 userAgentTextView.setText(webViewDefaultUserAgentString);
523                                 break;
524
525                             case "Custom user agent":
526                                 // Display the custom user agent.
527                                 userAgentTextView.setText(defaultCustomUserAgentString);
528                                 break;
529
530                             default:
531                                 // Display the text from `defaultUserAgentString`.
532                                 userAgentTextView.setText(defaultUserAgentString);
533                         }
534                         break;
535
536                     case "WebView default user agent":
537                         // Show `userAgentTextView` and set the text.
538                         userAgentTextView.setVisibility(View.VISIBLE);
539                         userAgentTextView.setText(webViewDefaultUserAgentString);
540
541                         // Hide `customUserAgentEditText`.
542                         customUserAgentEditText.setVisibility(View.GONE);
543                         break;
544
545                     case "Custom user agent":
546                         // Hide `userAgentTextView`.
547                         userAgentTextView.setVisibility(View.GONE);
548
549                         // Show `customUserAgentEditText` and set `userAgentString` as the text.
550                         customUserAgentEditText.setVisibility(View.VISIBLE);
551                         customUserAgentEditText.setText(currentUserAgentString);
552                         break;
553
554                     default:
555                         // Show `userAgentTextView` and set the text.
556                         userAgentTextView.setVisibility(View.VISIBLE);
557                         userAgentTextView.setText(newUserAgentString);
558
559                         // Hide `customUserAgentEditText`.
560                         customUserAgentEditText.setVisibility(View.GONE);
561                 }
562             }
563
564             @Override
565             public void onNothingSelected(AdapterView<?> parent) {
566                 // Do nothing.
567             }
568         });
569
570         // Set the `displayImagesSwitch` `onItemClickListener()`.
571         displayWebpageImagesSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
572             @Override
573             public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
574                 // Update the icon.
575                 switch (position) {
576                     case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_SYSTEM_DEFAULT:
577                         if (MainWebViewActivity.displayWebpageImagesBoolean) {
578                             // Set the icon according to the theme.
579                             if (MainWebViewActivity.darkTheme) {
580                                 displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_enabled_dark));
581                             } else {
582                                 displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_enabled_light));
583                             }
584                         } else {
585                             // Set the icon according to the theme.
586                             if (MainWebViewActivity.darkTheme) {
587                                 displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_disabled_dark));
588                             } else {
589                                 displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_disabled_light));
590                             }
591                         }
592                         break;
593
594                     case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_ENABLED:
595                         // Set the icon according to the theme.
596                         if (MainWebViewActivity.darkTheme) {
597                             displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_enabled_dark));
598                         } else {
599                             displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_enabled_light));
600                         }
601                         break;
602
603                     case DomainsDatabaseHelper.DISPLAY_WEBPAGE_IMAGES_DISABLED:
604                         // Set the icon according to the theme.
605                         if (MainWebViewActivity.darkTheme) {
606                             displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_disabled_dark));
607                         } else {
608                             displayWebpageImagesImageView.setImageDrawable(getResources().getDrawable(R.drawable.images_disabled_light));
609                         }
610                         break;
611                 }
612             }
613
614             @Override
615             public void onNothingSelected(AdapterView<?> parent) {
616                 // Do nothing.
617             }
618         });
619
620         return domainSettingsView;
621     }
622 }