</head>
<body>
- <h3>3.16 (Version Code 72)</h3>
- <p>20. November 2023 - Mindest-API 24, Ziel-API 34</p>
+ <h3><a href="https://www.stoutner.com/privacy-browser-android-3-16/">3.16</a> (Version Code 72)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=13e40f25aef5ddfcb5cd7b398c514cf2aa03e334">20. November 2023</a> - Mindest-API 24, Ziel-API 34</p>
<ul>
<li>Add importing and exporting of bookmarks to an <a href="https://redmine.stoutner.com/issues/91">HTML file</a>.</li>
<li>Open new tabs <a href="https://redmine.stoutner.com/issues/1100">adjacent to the current tab</a>.</li>
<p><svg class="icon"><use href="../shared_images/language.svg#icon"/></svg> language.</p>
<p><svg class="icon"><use href="../shared_images/link_off.svg#icon"/></svg> link_off.</p>
<p><svg class="icon"><use href="../shared_images/list.svg#icon"/></svg> list.</p>
- <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</p>
+ <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24px.svg#icon"/></svg> list_alt_rounded_24px.</p>
<p><svg class="icon"><use href="../shared_images/local_activity.svg#icon"/></svg> local_activity.</p>
<p><svg class="icon"><use href="../shared_images/location_off.svg#icon"/></svg> location_off.</p>
<p><svg class="icon"><use href="../shared_images/lock.svg#icon"/></svg> lock.</p>
<p><svg class="icon"><use href="../shared_images/smartphone.svg#icon"/></svg> smartphone.</p>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
+ <p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
<p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
</head>
<body>
- <h3>3.16 (version code 72)</h3>
- <p>20 November 2023 - minimum API 24, target API 34</p>
+ <h3><a href="https://www.stoutner.com/privacy-browser-android-3-16/">3.16</a> (version code 72)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=13e40f25aef5ddfcb5cd7b398c514cf2aa03e334">20 November 2023</a> - minimum API 24, target API 34</p>
<ul>
<li>Add importing and exporting of bookmarks to an <a href="https://redmine.stoutner.com/issues/91">HTML file</a>.</li>
<li>Open new tabs <a href="https://redmine.stoutner.com/issues/1100">adjacent to the current tab</a>.</li>
<p><svg class="icon"><use href="../shared_images/language.svg#icon"/></svg> language.</p>
<p><svg class="icon"><use href="../shared_images/link_off.svg#icon"/></svg> link_off.</p>
<p><svg class="icon"><use href="../shared_images/list.svg#icon"/></svg> list.</p>
- <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</p>
+ <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24px.svg#icon"/></svg> list_alt_rounded_24px.</p>
<p><svg class="icon"><use href="../shared_images/local_activity.svg#icon"/></svg> local_activity.</p>
<p><svg class="icon"><use href="../shared_images/location_off.svg#icon"/></svg> location_off.</p>
<p><svg class="icon"><use href="../shared_images/lock.svg#icon"/></svg> lock.</p>
<p><svg class="icon"><use href="../shared_images/smartphone.svg#icon"/></svg> smartphone.</p>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
+ <p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
<p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
</head>
<body>
- <h3>3.16 (código de versión 72)</h3>
- <p>20 de noviembre de 2023 - API mínimo 24, API objetivo 34</p>
+ <h3><a href="https://www.stoutner.com/privacy-browser-android-3-16/">3.16</a> (código de versión 72)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=13e40f25aef5ddfcb5cd7b398c514cf2aa03e334">20 de noviembre de 2023</a> - API mínimo 24, API objetivo 34</p>
<ul>
<li>Añadir la importación y exportación de favoritos a un <a href="https://redmine.stoutner.com/issues/91">archivo HTML</a>.</li>
<li>Abrir nuevas pestañas <a href="https://redmine.stoutner.com/issues/1100">adyacentes a la pestaña actual</a>.</li>
<p><svg class="icon"><use href="../shared_images/language.svg#icon"/></svg> language.</p>
<p><svg class="icon"><use href="../shared_images/link_off.svg#icon"/></svg> link_off.</p>
<p><svg class="icon"><use href="../shared_images/list.svg#icon"/></svg> list.</p>
- <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</p>
+ <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24px.svg#icon"/></svg> list_alt_rounded_24px.</p>
<p><svg class="icon"><use href="../shared_images/local_activity.svg#icon"/></svg> local_activity.</p>
<p><svg class="icon"><use href="../shared_images/location_off.svg#icon"/></svg> location_off.</p>
<p><svg class="icon"><use href="../shared_images/lock.svg#icon"/></svg> lock.</p>
<p><svg class="icon"><use href="../shared_images/smartphone.svg#icon"/></svg> smartphone.</p>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
+ <p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
<p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
</head>
<body>
- <h3>3.16 (version du code 72)</h3>
- <p>20 Novembre 2023 - API minimale : 24, API optimale : 34</p>
+ <h3><a href="https://www.stoutner.com/privacy-browser-android-3-16/">3.16</a> (version du code 72)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=13e40f25aef5ddfcb5cd7b398c514cf2aa03e334">20 Novembre 2023</a> - API minimale : 24, API optimale : 34</p>
<ul>
<li>Add importing and exporting of bookmarks to an <a href="https://redmine.stoutner.com/issues/91">HTML file</a>.</li>
<li>Open new tabs <a href="https://redmine.stoutner.com/issues/1100">adjacent to the current tab</a>.</li>
<p><svg class="icon"><use href="../shared_images/language.svg#icon"/></svg> language.</p>
<p><svg class="icon"><use href="../shared_images/link_off.svg#icon"/></svg> link_off.</p>
<p><svg class="icon"><use href="../shared_images/list.svg#icon"/></svg> list.</p>
- <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</p>
+ <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24px.svg#icon"/></svg> list_alt_rounded_24px.</p>
<p><svg class="icon"><use href="../shared_images/local_activity.svg#icon"/></svg> local_activity.</p>
<p><svg class="icon"><use href="../shared_images/location_off.svg#icon"/></svg> location_off.</p>
<p><svg class="icon"><use href="../shared_images/lock.svg#icon"/></svg> lock.</p>
<p><svg class="icon"><use href="../shared_images/smartphone.svg#icon"/></svg> smartphone.</p>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
+ <p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
<p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
</head>
<body>
- <h3>3.16 (versione codice 72)</h3>
- <p>20 Novembre 2023 - minima API 24, target API 34</p>
+ <h3><a href="https://www.stoutner.com/privacy-browser-android-3-16/">3.16</a> (versione codice 72)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=13e40f25aef5ddfcb5cd7b398c514cf2aa03e334">20 Novembre 2023</a> - minima API 24, target API 34</p>
<ul>
<li>Aggiunta la possibilità di importare e esportare i segnalibri in un <a href="https://redmine.stoutner.com/issues/91">file HTML</a>.</li>
<li>Apertura delle nuove schede <a href="https://redmine.stoutner.com/issues/1100">di fianco alla scheda in uso</a>.</li>
<p><svg class="icon"><use href="../shared_images/language.svg#icon"/></svg> language.</p>
<p><svg class="icon"><use href="../shared_images/link_off.svg#icon"/></svg> link_off.</p>
<p><svg class="icon"><use href="../shared_images/list.svg#icon"/></svg> list.</p>
- <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</p>
+ <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24px.svg#icon"/></svg> list_alt_rounded_24px.</p>
<p><svg class="icon"><use href="../shared_images/local_activity.svg#icon"/></svg> local_activity.</p>
<p><svg class="icon"><use href="../shared_images/location_off.svg#icon"/></svg> location_off.</p>
<p><svg class="icon"><use href="../shared_images/lock.svg#icon"/></svg> lock.</p>
<p><svg class="icon"><use href="../shared_images/smartphone.svg#icon"/></svg> smartphone.</p>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
+ <p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
<p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
</head>
<body>
- <h3>3.16 (código de versão 72)</h3>
- <p>20 de novembro de 2023 - minimum API 24, target API 34</p>
+ <h3><a href="https://www.stoutner.com/privacy-browser-android-3-16/">3.16</a> (código de versão 72)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=13e40f25aef5ddfcb5cd7b398c514cf2aa03e334">20 de novembro de 2023</a> - minimum API 24, target API 34</p>
<ul>
<li>Add importing and exporting of bookmarks to an <a href="https://redmine.stoutner.com/issues/91">HTML file</a>.</li>
<li>Open new tabs <a href="https://redmine.stoutner.com/issues/1100">adjacent to the current tab</a>.</li>
<p><svg class="icon"><use href="../shared_images/language.svg#icon"/></svg> language.</p>
<p><svg class="icon"><use href="../shared_images/link_off.svg#icon"/></svg> link_off.</p>
<p><svg class="icon"><use href="../shared_images/list.svg#icon"/></svg> list.</p>
- <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</p>
+ <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24px.svg#icon"/></svg> list_alt_rounded_24px.</p>
<p><svg class="icon"><use href="../shared_images/local_activity.svg#icon"/></svg> local_activity.</p>
<p><svg class="icon"><use href="../shared_images/location_off.svg#icon"/></svg> location_off.</p>
<p><svg class="icon"><use href="../shared_images/lock.svg#icon"/></svg> lock.</p>
<p><svg class="icon"><use href="../shared_images/smartphone.svg#icon"/></svg> smartphone.</p>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
+ <p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
<p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
</head>
<body>
- <h3>3.16 (код версии 72)</h3>
- <p>20 Ноябрь 2023 года - минимальный API 24, целевой API 34</p>
+ <h3><a href="https://www.stoutner.com/privacy-browser-android-3-16/">3.16</a> (код версии 72)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=13e40f25aef5ddfcb5cd7b398c514cf2aa03e334">20 Ноябрь 2023 года</a> - минимальный API 24, целевой API 34</p>
<ul>
<li>Добавлена возможность импорта/экспорта закладок в <a href="https://redmine.stoutner.com/issues/91">HTML-файл</a>.</li>
<li>Новые вкладки теперь открываются <a href="https://redmine.stoutner.com/issues/1100">рядом с текущей</a>.</li>
<p><svg class="icon"><use href="../shared_images/language.svg#icon"/></svg> language.</p>
<p><svg class="icon"><use href="../shared_images/link_off.svg#icon"/></svg> link_off.</p>
<p><svg class="icon"><use href="../shared_images/list.svg#icon"/></svg> list.</p>
- <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</p>
+ <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24px.svg#icon"/></svg> list_alt_rounded_24px.</p>
<p><svg class="icon"><use href="../shared_images/local_activity.svg#icon"/></svg> local_activity.</p>
<p><svg class="icon"><use href="../shared_images/location_off.svg#icon"/></svg> location_off.</p>
<p><svg class="icon"><use href="../shared_images/lock.svg#icon"/></svg> lock.</p>
<p><svg class="icon"><use href="../shared_images/smartphone.svg#icon"/></svg> smartphone.</p>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
+ <p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
<p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<!--
- Copyright 2022 Soren Stoutner <soren@stoutner.com>.
-
- This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
-
- It is a modified version of `list_alt_rounded_24`, which is part of the Android Material icon set and is released under the Apache License 2.0.
-
- Privacy Browser Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Privacy Browser Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Privacy Browser Android. If not, see <http://www.gnu.org/licenses/>. -->
-
-<svg
- xmlns="http://www.w3.org/2000/svg"
- viewBox="0 0 24 24"
- id="icon" >
-
- <path
- d="M5 21q-.825 0-1.413-.587Q3 19.825 3 19V5q0-.825.587-1.413Q4.175 3 5 3h14q.825 0 1.413.587Q21 4.175 21 5v14q0 .825-.587 1.413Q19.825 21 19 21Zm0-2h14V5H5v14Zm3-2q.425 0 .713-.288Q9 16.425 9 16t-.287-.713Q8.425 15 8 15t-.713.287Q7 15.575 7 16t.287.712Q7.575 17 8 17Zm0-4q.425 0 .713-.288Q9 12.425 9 12t-.287-.713Q8.425 11 8 11t-.713.287Q7 11.575 7 12t.287.712Q7.575 13 8 13Zm0-4q.425 0 .713-.288Q9 8.425 9 8t-.287-.713Q8.425 7 8 7t-.713.287Q7 7.575 7 8t.287.712Q7.575 9 8 9Zm4 8h4q.425 0 .712-.288Q17 16.425 17 16t-.288-.713Q16.425 15 16 15h-4q-.425 0-.712.287Q11 15.575 11 16t.288.712Q11.575 17 12 17Zm0-4h4q.425 0 .712-.288Q17 12.425 17 12t-.288-.713Q16.425 11 16 11h-4q-.425 0-.712.287Q11 11.575 11 12t.288.712Q11.575 13 12 13Zm0-4h4q.425 0 .712-.288Q17 8.425 17 8t-.288-.713Q16.425 7 16 7h-4q-.425 0-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9ZM5 19V5v14Z" />
-</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+<!--
+ Copyright 2022 Soren Stoutner <soren@stoutner.com>.
+
+ This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
+
+ It is a modified version of `list_alt_rounded_24`, which is part of the Android Material icon set and is released under the Apache License 2.0.
+
+ Privacy Browser Android is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Privacy Browser Android is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Privacy Browser Android. If not, see <http://www.gnu.org/licenses/>. -->
+
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ viewBox="0 0 24 24"
+ id="icon" >
+
+ <path
+ d="M5 21q-.825 0-1.413-.587Q3 19.825 3 19V5q0-.825.587-1.413Q4.175 3 5 3h14q.825 0 1.413.587Q21 4.175 21 5v14q0 .825-.587 1.413Q19.825 21 19 21Zm0-2h14V5H5v14Zm3-2q.425 0 .713-.288Q9 16.425 9 16t-.287-.713Q8.425 15 8 15t-.713.287Q7 15.575 7 16t.287.712Q7.575 17 8 17Zm0-4q.425 0 .713-.288Q9 12.425 9 12t-.287-.713Q8.425 11 8 11t-.713.287Q7 11.575 7 12t.287.712Q7.575 13 8 13Zm0-4q.425 0 .713-.288Q9 8.425 9 8t-.287-.713Q8.425 7 8 7t-.713.287Q7 7.575 7 8t.287.712Q7.575 9 8 9Zm4 8h4q.425 0 .712-.288Q17 16.425 17 16t-.288-.713Q16.425 15 16 15h-4q-.425 0-.712.287Q11 15.575 11 16t.288.712Q11.575 17 12 17Zm0-4h4q.425 0 .712-.288Q17 12.425 17 12t-.288-.713Q16.425 11 16 11h-4q-.425 0-.712.287Q11 11.575 11 12t.288.712Q11.575 13 12 13Zm0-4h4q.425 0 .712-.288Q17 8.425 17 8t-.288-.713Q16.425 7 16 7h-4q-.425 0-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9ZM5 19V5v14Z" />
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+<!--
+ Copyright 2023 Soren Stoutner <soren@stoutner.com>.
+
+ This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
+
+ It is a modified version of `subtitles`, which is part of the Android Material icon set and is released under the Apache License 2.0.
+
+ Privacy Browser Android is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Privacy Browser Android is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Privacy Browser Android. If not, see <http://www.gnu.org/licenses/>. -->
+
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ viewBox="0 -960 960 960"
+ id="icon" >
+
+ <path
+ d="M180-120q-24 0-42-18t-18-42v-600q0-24 18-42t42-18h600q24 0 42 18t18 42v600q0 24-18 42t-42 18H180Zm0-60h600v-600H180v600Zm0-600v600-600Zm95 197h270q18.75 0 31.875-13.177Q590-609.353 590-628.176 590-647 576.875-660T545-673H275q-18.75 0-31.875 13.177Q230-646.647 230-627.824 230-609 243.125-596T275-583Z"/>
+</svg>
</head>
<body>
- <h3>3.16 (version code 72)</h3>
- <p>20 Kasım 2023 - minimum API 24, target API 34</p>
+ <h3><a href="https://www.stoutner.com/privacy-browser-android-3-16/">3.16</a> (version code 72)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=13e40f25aef5ddfcb5cd7b398c514cf2aa03e334">20 Kasım 2023</a> - minimum API 24, target API 34</p>
<ul>
<li>Add importing and exporting of bookmarks to an <a href="https://redmine.stoutner.com/issues/91">HTML file</a>.</li>
<li>Open new tabs <a href="https://redmine.stoutner.com/issues/1100">adjacent to the current tab</a>.</li>
<p><svg class="icon"><use href="../shared_images/language.svg#icon"/></svg> language.</p>
<p><svg class="icon"><use href="../shared_images/link_off.svg#icon"/></svg> link_off.</p>
<p><svg class="icon"><use href="../shared_images/list.svg#icon"/></svg> list.</p>
- <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</p>
+ <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24px.svg#icon"/></svg> list_alt_rounded_24px.</p>
<p><svg class="icon"><use href="../shared_images/local_activity.svg#icon"/></svg> local_activity.</p>
<p><svg class="icon"><use href="../shared_images/location_off.svg#icon"/></svg> location_off.</p>
<p><svg class="icon"><use href="../shared_images/lock.svg#icon"/></svg> lock.</p>
<p><svg class="icon"><use href="../shared_images/smartphone.svg#icon"/></svg> smartphone.</p>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
+ <p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
<p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
</head>
<body>
- <h3>3.16 (version code 72)</h3>
- <p>20 November 2023 - 最低支持API 24, 最高支持API 34</p>
+ <h3><a href="https://www.stoutner.com/privacy-browser-android-3-16/">3.16</a> (version code 72)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=commitdiff;h=13e40f25aef5ddfcb5cd7b398c514cf2aa03e334">20 November 2023</a> - 最低支持API 24, 最高支持API 34</p>
<ul>
<li>Add importing and exporting of bookmarks to an <a href="https://redmine.stoutner.com/issues/91">HTML file</a>.</li>
<li>Open new tabs <a href="https://redmine.stoutner.com/issues/1100">adjacent to the current tab</a>.</li>
<p><svg class="icon"><use href="../shared_images/language.svg#icon"/></svg> language.</p>
<p><svg class="icon"><use href="../shared_images/link_off.svg#icon"/></svg> link_off.</p>
<p><svg class="icon"><use href="../shared_images/list.svg#icon"/></svg> list.</p>
- <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</p>
+ <p><svg class="icon"><use href="../shared_images/list_alt_rounded_24px.svg#icon"/></svg> list_alt_rounded_24px.</p>
<p><svg class="icon"><use href="../shared_images/local_activity.svg#icon"/></svg> local_activity.</p>
<p><svg class="icon"><use href="../shared_images/location_off.svg#icon"/></svg> location_off.</p>
<p><svg class="icon"><use href="../shared_images/lock.svg#icon"/></svg> lock.</p>
<p><svg class="icon"><use href="../shared_images/smartphone.svg#icon"/></svg> smartphone.</p>
<p><svg class="icon"><use href="../shared_images/sort.svg#icon"/></svg> sort.</p>
<p><svg class="icon"><use href="../shared_images/style.svg#icon"/></svg> style.</p>
+ <p><svg class="icon"><use href="../shared_images/subheader_rounded_weight400_grade0_48px.svg#icon"/></svg> subheader_<wbr>rounded_<wbr>weight400_<wbr>grade0_<wbr>48px.</p>
<p><svg class="icon"><use href="../shared_images/subtitles.svg#icon"/></svg> subtitles.</p>
<p><svg class="icon"><use href="../shared_images/tab.svg#icon"/></svg> tab.</p>
<p><svg class="icon"><use href="../shared_images/text_fields.svg#icon"/></svg> text_fields.</p>
private var domainsDatabaseHelper: DomainsDatabaseHelper? = null
private var downloadWithExternalApp = false
private var fullScreenBrowsingModeEnabled = false
- private var hideAppBar = false
+ private var hideAppBar = true
private var inFullScreenBrowsingMode = false
private var incognitoModeEnabled = false
private var loadingNewIntent = false
val allowScreenshots = sharedPreferences.getBoolean(getString(R.string.allow_screenshots_key), false)
bottomAppBar = sharedPreferences.getBoolean(getString(R.string.bottom_app_bar_key), false)
displayAdditionalAppBarIcons = sharedPreferences.getBoolean(getString(R.string.display_additional_app_bar_icons_key), false)
+ val displayUnderCutouts = sharedPreferences.getBoolean(getString(R.string.display_under_cutouts_key), false)
+
+ // Display under cutouts if specified. This must be done here as it doesn't appear to work correctly if handled after the app is fully initialized.
+ if (displayUnderCutouts) {
+ if (Build.VERSION.SDK_INT >= 30)
+ window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+ else if (Build.VERSION.SDK_INT >= 28)
+ window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
+ }
// Get the theme entry values string array.
val appThemeEntryValuesStringArray = resources.getStringArray(R.array.app_theme_entry_values)
// The deprecated command can be switched to `WindowInsetsController` once the minimum API >= 30.
@Suppress("DEPRECATION")
- rootFrameLayout.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
- View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
+ rootFrameLayout.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
} else { // Switch to normal viewing mode.
// Show the app bar if it was hidden.
if (hideAppBar) {
private lateinit var formDataPreference: Preference // The form data preference can be removed once the minimum API >= 26.
private lateinit var fullScreenBrowsingModePreference: Preference
private lateinit var hideAppBarPreference: Preference
+ private lateinit var displayUnderCutoutsPreference: Preference
private lateinit var homepagePreference: Preference
private lateinit var incognitoModePreference: Preference
private lateinit var javaScriptPreference: Preference
proxyCustomUrlPreference = findPreference(getString(R.string.proxy_custom_url_key))!!
fullScreenBrowsingModePreference = findPreference(getString(R.string.full_screen_browsing_mode_key))!!
hideAppBarPreference = findPreference(getString(R.string.hide_app_bar_key))!!
+ displayUnderCutoutsPreference = findPreference(getString(R.string.display_under_cutouts_key))!!
clearEverythingPreference = findPreference(getString(R.string.clear_everything_key))!!
clearCookiesPreference = findPreference(getString(R.string.clear_cookies_key))!!
clearDomStoragePreference = findPreference(getString(R.string.clear_dom_storage_key))!!
hideAppBarPreference.setIcon(R.drawable.app_bar_ghosted)
}
+ // Set the display under cutouts icon.
+ if (sharedPreferences.getBoolean(getString(R.string.display_under_cutouts_key), false))
+ displayUnderCutoutsPreference.setIcon(R.drawable.display_under_cutouts_enabled)
+ else
+ displayUnderCutoutsPreference.setIcon(R.drawable.display_under_cutouts_disabled)
+
// Set the clear everything icon.
if (clearEverything) {
clearEverythingPreference.setIcon(R.drawable.clear_everything_enabled)
hideAppBarPreference.setIcon(R.drawable.app_bar_disabled)
}
+ getString(R.string.display_under_cutouts_key) -> {
+ // Update the icon.
+ if (sharedPreferences.getBoolean(getString(R.string.display_under_cutouts_key), true))
+ displayUnderCutoutsPreference.setIcon(R.drawable.display_under_cutouts_enabled)
+ else
+ displayUnderCutoutsPreference.setIcon(R.drawable.display_under_cutouts_disabled)
+
+ // Restart Privacy Browser.
+ restartPrivacyBrowser()
+ }
+
getString(R.string.clear_everything_key) -> {
// Store the new clear everything status
val newClearEverythingBoolean = sharedPreferences.getBoolean(getString(R.string.clear_everything_key), true)
import java.util.Date
// Define the public constants.
-const val IMPORT_EXPORT_SCHEMA_VERSION = 17
+const val IMPORT_EXPORT_SCHEMA_VERSION = 18
const val EXPORT_SUCCESSFUL = "A"
const val IMPORT_SUCCESSFUL = "B"
private const val CLEAR_LOGCAT = "clear_logcat"
private const val CUSTOM_USER_AGENT = "custom_user_agent"
private const val DISPLAY_ADDITIONAL_APP_BAR_ICONS = "display_additional_app_bar_icons"
+private const val DISPLAY_UNDER_CUTOUTS = "display_under_cutouts"
private const val DISPLAY_WEBPAGE_IMAGES = "display_webpage_images"
private const val DOM_STORAGE = "dom_storage"
private const val DOWNLOAD_WITH_EXTERNAL_APP = "download_with_external_app"
// Although a new table could be created and all the data copied to it, I think I will just leave the old parent folder column. It will be wiped out the next time an import is run.
}
+ // Upgrade from schema version 17, first used in Privacy Browser 3.15, to schema version 18, first used in Privacy Browser 3.17.
+ if (importDatabaseVersion < 18) {
+ // Create the new display under cutout column.
+ importDatabase.execSQL("ALTER TABLE $PREFERENCES_TABLE ADD COLUMN $DISPLAY_UNDER_CUTOUTS BOOLEAN")
+
+ // Get the current display under cutout value.
+ val displayUnderCutouts = sharedPreferences.getBoolean(DISPLAY_UNDER_CUTOUTS, false)
+
+ // Populate the preferences table with the current display under cutouts value.
+ // This can switch to using the variables directly once the API >= 30. <https://www.sqlite.org/datatype3.html#boolean_datatype>
+ // <https://developer.android.com/reference/android/database/sqlite/package-summary>
+ if (displayUnderCutouts)
+ importDatabase.execSQL("UPDATE $PREFERENCES_TABLE SET $DISPLAY_UNDER_CUTOUTS = 1")
+ else
+ importDatabase.execSQL("UPDATE $PREFERENCES_TABLE SET $DISPLAY_UNDER_CUTOUTS = 0")
+ }
+
+ /* End of database upgrade logic. */
+
// Get a cursor for the bookmarks table.
val importBookmarksCursor = importDatabase.rawQuery("SELECT * FROM $BOOKMARKS_TABLE", null)
.putString(PROXY_CUSTOM_URL, importPreferencesCursor.getString(importPreferencesCursor.getColumnIndexOrThrow(PROXY_CUSTOM_URL)))
.putBoolean(FULL_SCREEN_BROWSING_MODE, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(FULL_SCREEN_BROWSING_MODE)) == 1)
.putBoolean(HIDE_APP_BAR, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(HIDE_APP_BAR)) == 1)
+ .putBoolean(DISPLAY_UNDER_CUTOUTS, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(DISPLAY_UNDER_CUTOUTS)) == 1)
.putBoolean(CLEAR_EVERYTHING, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(CLEAR_EVERYTHING)) == 1)
.putBoolean(CLEAR_COOKIES, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(CLEAR_COOKIES)) == 1)
.putBoolean(CLEAR_DOM_STORAGE, importPreferencesCursor.getInt(importPreferencesCursor.getColumnIndexOrThrow(CLEAR_DOM_STORAGE)) == 1)
"$PROXY_CUSTOM_URL TEXT, " +
"$FULL_SCREEN_BROWSING_MODE BOOLEAN, " +
"$HIDE_APP_BAR BOOLEAN, " +
+ "$DISPLAY_UNDER_CUTOUTS BOOLEAN, " +
"$CLEAR_EVERYTHING BOOLEAN, " +
"$CLEAR_COOKIES BOOLEAN, " +
"$CLEAR_DOM_STORAGE BOOLEAN, " +
preferencesContentValues.put(PROXY_CUSTOM_URL, sharedPreferences.getString(PROXY_CUSTOM_URL, context.getString(R.string.proxy_custom_url_default_value)))
preferencesContentValues.put(FULL_SCREEN_BROWSING_MODE, sharedPreferences.getBoolean(FULL_SCREEN_BROWSING_MODE, false))
preferencesContentValues.put(HIDE_APP_BAR, sharedPreferences.getBoolean(HIDE_APP_BAR, true))
+ preferencesContentValues.put(DISPLAY_UNDER_CUTOUTS, sharedPreferences.getBoolean(DISPLAY_UNDER_CUTOUTS, false))
preferencesContentValues.put(CLEAR_EVERYTHING, sharedPreferences.getBoolean(CLEAR_EVERYTHING, true))
preferencesContentValues.put(CLEAR_COOKIES, sharedPreferences.getBoolean(CLEAR_COOKIES, true))
preferencesContentValues.put(CLEAR_DOM_STORAGE, sharedPreferences.getBoolean(CLEAR_DOM_STORAGE, true))
<path
android:fillColor="@color/disabled_icon"
android:pathData="M20,4L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,6c0,-1.11 -0.89,-2 -2,-2zM20,18L4,18v-6h16v6zM20,8L4,8L4,6h16v2z" />
-</vector>
\ No newline at end of file
+</vector>
<path
android:fillColor="@color/blue_icon"
android:pathData="M20,4L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,6c0,-1.11 -0.89,-2 -2,-2zM20,18L4,18v-6h16v6zM20,8L4,8L4,6h16v2z" />
-</vector>
\ No newline at end of file
+</vector>
<path
android:fillColor="@color/ghosted_icon"
android:pathData="M20,4L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,6c0,-1.11 -0.89,-2 -2,-2zM20,18L4,18v-6h16v6zM20,8L4,8L4,6h16v2z" />
-</vector>
\ No newline at end of file
+</vector>
-<!-- This file comes from the Android Material icon set, where it is called `list_alt_rounded_24`. It is released under the Apache License 2.0. -->
+<!-- This file comes from the Android Material icon set, where it is called `list_alt_rounded_24px`. It is released under the Apache License 2.0. -->
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
-<!-- This file comes from the Android Material icon set, where it is called `list_alt_rounded_24`. It is released under the Apache License 2.0. -->
+<!-- This file comes from the Android Material icon set, where it is called `list_alt_rounded_24px`. It is released under the Apache License 2.0. -->
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
--- /dev/null
+<!-- This file comes from the Material Symbols icon set, where it is called `subheader_rounded_weight400_grade0_48px`. It is released under the Apache License 2.0. <https://fonts.google.com/icons> -->
+
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="24dp"
+ android:width="24dp"
+ android:viewportHeight="960"
+ android:viewportWidth="960" >
+
+ <path
+ android:fillColor="@color/disabled_icon"
+ android:pathData="M180,840Q156,840 138,822Q120,804 120,780L120,180Q120,156 138,138Q156,120 180,120L780,120Q804,120 822,138Q840,156 840,180L840,780Q840,804 822,822Q804,840 780,840L180,840ZM180,780L780,780Q780,780 780,780Q780,780 780,780L780,180Q780,180 780,180Q780,180 780,180L180,180Q180,180 180,180Q180,180 180,180L180,780Q180,780 180,780Q180,780 180,780ZM180,180L180,180Q180,180 180,180Q180,180 180,180L180,780Q180,780 180,780Q180,780 180,780L180,780Q180,780 180,780Q180,780 180,780L180,180Q180,180 180,180Q180,180 180,180ZM275,377L545,377Q563.75,377 576.88,363.82Q590,350.65 590,331.82Q590,313 576.88,300Q563.75,287 545,287L275,287Q256.25,287 243.13,300.18Q230,313.35 230,332.18Q230,351 243.13,364Q256.25,377 275,377Z" />
+</vector>
--- /dev/null
+<!-- This file comes from the Material Symbols icon set, where it is called `subheader_rounded_weight400_grade0_48px`. It is released under the Apache License 2.0. <https://fonts.google.com/icons> -->
+
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="24dp"
+ android:width="24dp"
+ android:viewportHeight="960"
+ android:viewportWidth="960" >
+
+ <path
+ android:fillColor="@color/blue_icon"
+ android:pathData="M180,840Q156,840 138,822Q120,804 120,780L120,180Q120,156 138,138Q156,120 180,120L780,120Q804,120 822,138Q840,156 840,180L840,780Q840,804 822,822Q804,840 780,840L180,840ZM180,780L780,780Q780,780 780,780Q780,780 780,780L780,180Q780,180 780,180Q780,180 780,180L180,180Q180,180 180,180Q180,180 180,180L180,780Q180,780 180,780Q180,780 180,780ZM180,180L180,180Q180,180 180,180Q180,180 180,180L180,780Q180,780 180,780Q180,780 180,780L180,780Q180,780 180,780Q180,780 180,780L180,180Q180,180 180,180Q180,180 180,180ZM275,377L545,377Q563.75,377 576.88,363.82Q590,350.65 590,331.82Q590,313 576.88,300Q563.75,287 545,287L275,287Q256.25,287 243.13,300.18Q230,313.35 230,332.18Q230,351 243.13,364Q256.25,377 275,377Z" />
+</vector>
<path
android:fillColor="@color/disabled_icon"
android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19H7V5h10v14z"/>
-</vector>
\ No newline at end of file
+</vector>
<path
android:fillColor="@color/blue_icon"
android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19H7V5h10v14z"/>
-</vector>
\ No newline at end of file
+</vector>
<string name="full_screen_browsing_mode_summary">Double-tap to toggle full screen browsing mode.</string>
<string name="hide_app_bar">Hide the app bar</string>
<string name="hide_app_bar_summary">Hide the app bar that contains the URL.</string>
+ <string name="display_under_cutouts">Display under cutouts</string>
+ <string name="display_under_cutouts_summary">Draw the website under cutouts, like camera notches. Changing this setting will restart Privacy Browser.</string>
<string name="clear_everything">Clear everything</string>
<!-- The form data part of this string can be removed once the minimum API >= 26. -->
<string name="clear_everything_summary">Clears cookies, DOM storage, form data, the logcat, and WebView’s cache. Then manually deletes the entire “app_webview” and “cache” directories.</string>
<string name="full_screen_browsing_mode_key" translatable="false">full_screen_browsing_mode</string>
<string name="general_category_key" translatable="false">general</string>
<string name="hide_app_bar_key" translatable="false">hide_app_bar</string>
+ <string name="display_under_cutouts_key" translatable="false">display_under_cutouts</string>
<string name="homepage_key" translatable="false">homepage</string>
<string name="incognito_mode_key" translatable="false">incognito_mode</string>
<string name="javascript_key" translatable="false">javascript</string>
app:title="@string/hide_app_bar"
app:summary="@string/hide_app_bar_summary"
app:defaultValue="true" />
+
+ <SwitchPreferenceCompat
+ app:key="@string/display_under_cutouts_key"
+ app:title="@string/display_under_cutouts"
+ app:summary="@string/display_under_cutouts_summary"
+ app:defaultValue="false" />
</PreferenceCategory>
<PreferenceCategory