<h3>Icons:</h3>
<p><img class="left" src="../shared_images/privacy_browser.svg"/> <img class="left" src="../shared_images/warning.svg"/> <img class="left" src="../shared_images/javascript_enabled.svg"/>
- are derived from <code>security</code> and <code>language</code>, which are part of the <a href="https://material.io/icons/">Android Material icon set</a> and are released under the
+ are derived from <code>security</code> and <code>language</code>, which are part of the <a href="https://fonts.google.com/icons">Android Material icon set</a> and are released under the
<a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
The full text of the license is below. Modifications copyright 2016 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting images are released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><svg class="left"><use href="../shared_images/move_to_folder.svg#icon"/></svg> is derived from elements of <code>folder</code> and <code>exit_to_app</code>,
- which are part of the <a href="https://material.io/icons/">Android Material icon set</a>
+ which are part of the <a href="https://fonts.google.com/icons">Android Material icon set</a>
and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><svg class="left"><use href="../shared_images/create_bookmark.svg#icon"/></svg> is derived from elements of <code>bookmark</code> and <code>create_new_folder</code>, which are part of the
- <a href="https://material.io/icons/">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ <a href="https://fonts.google.com/icons">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><svg class="left"><use href="../shared_images/create_folder.svg#icon"/></svg> ist abgeleitet von <code>create_new_folder</code>,
- das Teil des <a href="https://material.io/icons/">Android Material icon set</a> unter der <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache Lizenz 2.0</a> veröffentlicht wird.
+ das Teil des <a href="https://fonts.google.com/icons">Android Material icon set</a> unter der <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache Lizenz 2.0</a> veröffentlicht wird.
Änderungen Copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Die resultierende Grafik wird unter der <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ Lizenz</a> veröffentlicht.</p>
<p><svg class="left"><use href="../shared_images/clear_and_exit.svg#icon"/></svg> ist abgeleitet von <code>exit_to_app</code>,
- das Teil des <a href="https://material.io/icons/">Android Material icon set</a> unter der <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache Lizenz 2.0</a> veröffentlicht wird.
+ das Teil des <a href="https://fonts.google.com/icons">Android Material icon set</a> unter der <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache Lizenz 2.0</a> veröffentlicht wird.
Änderungen Copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Die resultierende Grafik wird unter der <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ Lizenz</a> veröffentlicht.</p>
<p><svg class="left"><use href="../shared_images/night_mode.svg#icon"/></svg> ist abgeleitet von <code>compare</code>,
- das Teil des <a href="https://material.io/icons/">Android Material icon set</a> unter der <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache Lizenz 2.0</a> veröffentlicht wird.
+ das Teil des <a href="https://fonts.google.com/icons">Android Material icon set</a> unter der <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache Lizenz 2.0</a> veröffentlicht wird.
Änderungen Copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Die resultierende Grafik wird unter der <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ Lizenz</a> veröffentlicht.</p>
- <p><img class="left" src="../shared_images/sort_selected.svg"/> ist abgeleitet von <code>sort</code>, das Teil des <a href="https://material.io/icons/">Android Material icon set</a>
+ <p><img class="left" src="../shared_images/sort_selected.svg"/> ist abgeleitet von <code>sort</code>, das Teil des <a href="https://fonts.google.com/icons">Android Material icon set</a>
unter der <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache Lizenz 2.0</a> veröffentlicht wird. Änderungen Copyright 2019, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Die resultierende Grafik wird unter der <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ Lizenz</a> veröffentlicht.</p>
<p><img class="left" src="../shared_images/push_pin_filled_selected.svg"> ist abgeleitet von <code>push_pin_selected</code>,
- das Teil des <a href="https://material.io/icons/">Android Material icon set</a> unter der <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache Lizenz 2.0</a> veröffentlicht wird.
+ das Teil des <a href="https://fonts.google.com/icons">Android Material icon set</a> unter der <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache Lizenz 2.0</a> veröffentlicht wird.
Änderungen Copyright 2019-2020, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Die resultierende Grafik wird unter der <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ Lizenz</a> veröffentlicht.</p>
<p><svg class="left"><use href="../shared_images/cookie.svg#icon"/></svg> <code>cookie</code> was created by Google.
welches unter der <a href="https://www.gnu.org/licenses/agpl-3.0.en.html">AGPLv3+ Lizenz</a> veröffentlicht wird. Den gesamte Text dieser Lizenz finden Sie unterhalb.
Das Bild ist ein unverändertes Exzerpt zur Darstellung von Layout-Informationen wie Farbe, Größe und Rahmen.
Es ist in Privacy Browser unter Beachtung der Bestimmungen von Sektion 13 der Lizenz enthalten.</p>
- <p>The following icons come from the <a href="https://material.io/icons/">Android Material icon set</a>,
+ <p>The following icons come from the <a href="https://fonts.google.com/icons">Android Material icon set</a>,
which is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
They are unchanged except for layout information like color and size. Some of them have been renamed to match their use in the code. The original icons and names are shown below.</p>
<p><svg class="icon"><use href="../shared_images/add.svg#icon"/></svg> add.</p>
<h3>Icons</h3>
<p><img class="left" src="../shared_images/privacy_browser.svg"/> <img class="left" src="../shared_images/warning.svg"/> <img class="left" src="../shared_images/javascript_enabled.svg"/>
- are derived from <code>security</code> and <code>language</code>, which are part of the <a href="https://material.io/icons/">Android Material icon set</a> and are released under the
+ are derived from <code>security</code> and <code>language</code>, which are part of the <a href="https://fonts.google.com/icons">Android Material icon set</a> and are released under the
<a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
The full text of the license is below. Modifications copyright 2016 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting images are released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><svg class="left"><use href="../shared_images/move_to_folder.svg#icon"/></svg> is derived from elements of <code>folder</code> and <code>exit_to_app</code>,
- which are part of the <a href="https://material.io/icons/">Android Material icon set</a>
+ which are part of the <a href="https://fonts.google.com/icons">Android Material icon set</a>
and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><svg class="left"><use href="../shared_images/create_bookmark.svg#icon"/></svg> is derived from elements of <code>bookmark</code> and <code>create_new_folder</code>, which are part of the
- <a href="https://material.io/icons/">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ <a href="https://fonts.google.com/icons">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><svg class="left"><use href="../shared_images/create_folder.svg#icon"/></svg> is derived from <code>create_new_folder</code>,
- which is part of the <a href="https://material.io/icons/">Android Material icon set</a> and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ which is part of the <a href="https://fonts.google.com/icons">Android Material icon set</a> and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><svg class="left"><use href="../shared_images/clear_and_exit.svg#icon"/></svg> is derived from <code>exit_to_app</code>,
- which is part of the <a href="https://material.io/icons/">Android Material icon set</a> and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ which is part of the <a href="https://fonts.google.com/icons">Android Material icon set</a> and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><svg class="left"><use href="../shared_images/night_mode.svg#icon"/></svg> is derived from <code>compare</code>,
- which is part of the <a href="https://material.io/icons/">Android Material icon set</a> and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ which is part of the <a href="https://fonts.google.com/icons">Android Material icon set</a> and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
- <p><img class="left" src="../shared_images/sort_selected.svg"> is derived from <code>sort</code>, which is part of the <a href="https://material.io/icons/">Android Material icon set</a>
+ <p><img class="left" src="../shared_images/sort_selected.svg"> is derived from <code>sort</code>, which is part of the <a href="https://fonts.google.com/icons">Android Material icon set</a>
and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>. Modifications copyright 2019, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><img class="left" src="../shared_images/push_pin_filled_selected.svg"> is derived from <code>push_pin_selected</code>,
- which is part of the <a href="https://material.io/icons/">Android Material icon set</a> and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ which is part of the <a href="https://fonts.google.com/icons">Android Material icon set</a> and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Modifications copyright 2019-2020, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><svg class="left"><use href="../shared_images/cookie.svg#icon"/></svg> <code>cookie</code> was created by Google.
<a href="https://github.com/tootsuite/mastodon/blob/master/app/javascript/images/logo_transparent_black.svg">Mastodon project</a>,
which is released under the <a href="https://www.gnu.org/licenses/agpl-3.0.en.html">AGPLv3+ license</a>. The full text of the license is below.
The image is unchanged except for layout information like color, size, and margin. It is included in Privacy Browser under the provisions in section 13 of the license.</p>
- <p>The following icons come from the <a href="https://material.io/icons/">Android Material icon set</a>,
+ <p>The following icons come from the <a href="https://fonts.google.com/icons">Android Material icon set</a>,
which is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
They are unchanged except for layout information like color and size. Some of them have been renamed to match their use in the code. The original icons and names are shown below.</p>
<p><svg class="icon"><use href="../shared_images/add.svg#icon"/></svg> add.</p>
<h3>Iconos</h3>
<p><img class="left" src="../shared_images/privacy_browser.svg"/> <img class="left" src="../shared_images/warning.svg"/> <img class="left" src="../shared_images/javascript_enabled.svg"/>
- derivan de <code>security</code> y de <code>language</code>, que son parte del <a href="https://material.io/icons/">conjunto de iconos Android Material</a> y son liberados bajo la
+ derivan de <code>security</code> y de <code>language</code>, que son parte del <a href="https://fonts.google.com/icons">conjunto de iconos Android Material</a> y son liberados bajo la
<a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
El texto completo de la licencia se encuentra debajo. Copyright de modificaciones 2016 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Las imágenes resultantes se liberan bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/move_to_folder.svg#icon"/></svg> deriva de elementos de <code>folder</code> y <code>exit_to_app</code>, que son parte del
- <a href="https://material.io/icons/">conjunto de iconos Android Material</a> y son liberados bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
+ <a href="https://fonts.google.com/icons">conjunto de iconos Android Material</a> y son liberados bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
Copyright de modificaciones 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
La imagen resultante se libera bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/create_bookmark.svg#icon"/></svg> deriva de elementos de <code>bookmark</code> y <code>create_new_folder</code>, que son parte del
- <a href="https://material.io/icons/">conjunto de iconos Android Material</a> y son liberados bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
+ <a href="https://fonts.google.com/icons">conjunto de iconos Android Material</a> y son liberados bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
Copyright de modificaciones 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
La imagen resultante se libera bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/create_folder.svg#icon"/></svg> deriva de <code>create_new_folder</code>,
- que es parte del <a href="https://material.io/icons/">conjunto de iconos Android Material</a> y es liberado bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
+ que es parte del <a href="https://fonts.google.com/icons">conjunto de iconos Android Material</a> y es liberado bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
Copyright de modificaciones 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
La imagen resultante se libera bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/clear_and_exit.svg#icon"/></svg> deriva de <code>exit_to_app</code>,
- que es parte del <a href="https://material.io/icons/">conjunto de iconos Android Material</a> y es liberado bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
+ que es parte del <a href="https://fonts.google.com/icons">conjunto de iconos Android Material</a> y es liberado bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
Copyright de modificaciones 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
La imagen resultante se libera bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/night_mode.svg#icon"/></svg> deriva de <code>compare</code>,
- que es parte del <a href="https://material.io/icons/">conjunto de iconos Android Material</a> y es liberado bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
+ que es parte del <a href="https://fonts.google.com/icons">conjunto de iconos Android Material</a> y es liberado bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
Copyright de modificaciones 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
La imagen resultante se libera bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>.</p>
- <p><img class="left" src="../shared_images/sort_selected.svg"/> deriva de <code>sort</code>, que es parte del <a href="https://material.io/icons/">conjunto de iconos Android Material</a>
+ <p><img class="left" src="../shared_images/sort_selected.svg"/> deriva de <code>sort</code>, que es parte del <a href="https://fonts.google.com/icons">conjunto de iconos Android Material</a>
y es liberado bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>. Copyright de modificaciones 2019, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
La imagen resultante se libera bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>.</p>
<p><img class="left" src="../shared_images/push_pin_filled_selected.svg"/> deriva de <code>push_pin_selected</code>,
- que es parte del <a href="https://material.io/icons/">conjunto de iconos Android Material</a> y es liberado bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
+ que es parte del <a href="https://fonts.google.com/icons">conjunto de iconos Android Material</a> y es liberado bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
Copyright de modificaciones 2019-2020, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
La imagen resultante se libera bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/cookie.svg#icon"/></svg> <code>cookie</code> fue creado por Google.
que se libera bajo la <a href="https://www.gnu.org/licenses/agpl-3.0.en.html">licencia AGPLv3+</a>. El texto completo de la licencia está abajo.
La imagen no ha cambiado excepto por la información de diseño como el color, el tamaño y el margen.
Está incluida en el Navegador de Privacidad bajo las disposiciones de la sección 13 de la licencia.</p>
- <p>Los siguientes iconos proceden de <a href="https://material.io/icons/">conjunto de iconos Android Material</a>,
+ <p>Los siguientes iconos proceden de <a href="https://fonts.google.com/icons">conjunto de iconos Android Material</a>,
el cual es liberado bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">licencia Apache 2.0</a>.
Están sin cambios, excepto por la información de diseño como el color y el tamaño. Algunos de ellos se han renombrado para que coincida con su uso en el código.
Los iconos y los nombres originales se muestran a continuación.</p>
<h3>Icônes</h3>
<p><img class="left" src="../shared_images/privacy_browser.svg"> <img class="left" src="../shared_images/warning.svg"> <img class="left" src="../shared_images/javascript_enabled.svg"> sont dérivés de
- <code>security</code> et de <code>language</code>, qui font partie de <a href="https://material.io/icons/">l'ensemble d'icônes Matériel Android</a> et sont publiés sous la
+ <code>security</code> et de <code>language</code>, qui font partie de <a href="https://fonts.google.com/icons">l'ensemble d'icônes Matériel Android</a> et sont publiés sous la
<a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
Le texte complet de la licence est ci-dessous. Modifications copyright 2016 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Les images résultantes sont publiées sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/move_to_folder.svg#icon"/></svg> est dérivé des éléments <code>folder</code> et <code>exit_to_app</code>,
- qui font partie de <a href="https://material.io/icons/">l'ensemble d'icônes Matériel Android</a>
+ qui font partie de <a href="https://fonts.google.com/icons">l'ensemble d'icônes Matériel Android</a>
et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'image résultante est publiée sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/create_bookmark.svg#icon"/></svg> est dérivé des éléments <code>bookmark</code> et <code>create_new_folder</code>, qui font partie de
- <a href="https://material.io/icons/">l'ensemble d'icônes Matériel Android</a> et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
+ <a href="https://fonts.google.com/icons">l'ensemble d'icônes Matériel Android</a> et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'image résultante est publiée sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/create_folder.svg#icon"/></svg> est dérivée de l'élément <code>create_new_folder</code>,
- qui fait partie de <a href="https://material.io/icons/">l'ensemble d'icônes Matériel Android</a> et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
+ qui fait partie de <a href="https://fonts.google.com/icons">l'ensemble d'icônes Matériel Android</a> et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'image résultante est publiée sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/clear_and_exit.svg#icon"/></svg> est dérivée de l'élément <code>exit_to_app</code>, qui fait partie de
- <a href="https://material.io/icons/">l'ensemble d'icônes Matériel Android</a> et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
+ <a href="https://fonts.google.com/icons">l'ensemble d'icônes Matériel Android</a> et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'image résultante est publiée sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/night_mode.svg#icon"/></svg> est dérivée de l'élément <code>compare</code>,
- qui fait partie de <a href="https://material.io/icons/">l'ensemble d'icônes Matériel Android</a> et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
+ qui fait partie de <a href="https://fonts.google.com/icons">l'ensemble d'icônes Matériel Android</a> et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'image résultante est publiée sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>.</p>
<p><img class="left" src="../shared_images/sort_selected.svg"/> est dérivée de l'élément <code>sort</code>,
- qui fait partie de <a href="https://material.io/icons/">l'ensemble d'icônes Matériel Android</a> et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
+ qui fait partie de <a href="https://fonts.google.com/icons">l'ensemble d'icônes Matériel Android</a> et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
Modifications copyright 2019, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'image résultante est publiée sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>.</p>
<p><img class="left" src="../shared_images/push_pin_filled_selected.svg"/> est dérivée de l'élément <code>push_pin_selected</code>,
- qui fait partie de <a href="https://material.io/icons/">l'ensemble d'icônes Matériel Android</a> et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
+ qui fait partie de <a href="https://fonts.google.com/icons">l'ensemble d'icônes Matériel Android</a> et sont publiés sous <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
Modifications copyright 2019-2020, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'image résultante est publiée sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/cookie.svg#icon"/></svg> <code>cookie</code> a été créé par Google.
qui est publié sous <a href="https://www.gnu.org/licenses/agpl-3.0.en.html">la licence AGPLv3+</a>. Le texte complet de la licence est ci-dessous.
L'image reste inchangée à l'exception des informations de mise en page telles que la couleur, la taille et la marge.
Il est inclus dans Privacy Browser conformément aux dispositions de la section 13 de la licence.</p>
- <p>Les icônes suivantes proviennent de <a href="https://material.io/icons/">l'ensemble d'icônes Matériel Android</a>,
+ <p>Les icônes suivantes proviennent de <a href="https://fonts.google.com/icons">l'ensemble d'icônes Matériel Android</a>,
qui est publié sous la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
Ils sont inchangés sauf pour les informations de mise en page comme la couleur et la taille. Certains d'entre eux ont été renommés pour correspondre à leur utilisation dans le code.
Les icônes et les noms d'origine sont indiqués ci-dessous.</p>
<h3>Icone</h3>
<p><img class="left" src="../shared_images/privacy_browser.svg"/> <img class="left" src="../shared_images/warning.svg"/> <img class="left" src="../shared_images/javascript_enabled.svg"/>
- sono state derivate da <code>security</code> e <code>language</code>, che fanno parte dell'<a href="https://material.io/icons/">Android Material icon set</a> e sono state rilasciate sotto
+ sono state derivate da <code>security</code> e <code>language</code>, che fanno parte dell'<a href="https://fonts.google.com/icons">Android Material icon set</a> e sono state rilasciate sotto
<a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
Il testo completo della Licenza è riportato di seguito. Copyright delle modifiche 2016 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Le immagini risultanti sono rilasciate sotto <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/move_to_folder.svg#icon"/></svg> è stata derivata da elementi di <code>folder</code> e di <code>exit_to_app</code>, che fanno parte
- dell'<a href="https://material.io/icons/">Android Material icon set</a> e sono state rilasciate sotto <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
+ dell'<a href="https://fonts.google.com/icons">Android Material icon set</a> e sono state rilasciate sotto <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
Copyright delle modifiche 2017, 2020 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'immagine risultante è rilasciata sotto <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/create_bookmark.svg#icon"/></svg> è stata derivata da elementi di <code>bookmark</code> e di <code>create_new_folder</code>, che fanno parte
- dell'<a href="https://material.io/icons/">Android Material icon set</a> e sono state rilasciate sotto <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
+ dell'<a href="https://fonts.google.com/icons">Android Material icon set</a> e sono state rilasciate sotto <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
Copyright delle modifiche 2017, 2020 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'immagine risultante è rilasciata sotto <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/create_folder.svg#icon"/></svg> è stata derivata da <code>create_new_folder</code>,
- che fa parte dell'<a href="https://material.io/icons/">Android Material icon set</a> ed è stata rilasciata sotto <a href="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
+ che fa parte dell'<a href="https://fonts.google.com/icons">Android Material icon set</a> ed è stata rilasciata sotto <a href="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
Copyright delle modifiche 2017, 2020 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'immagine risultante è rilasciata sotto <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/clear_and_exit.svg#icon"/></svg> è stata derivata da <code>exit_to_app</code>,
- che fa parte dell'<a href="https://material.io/icons/">Android Material icon set</a> ed è stata rilasciata sotto <a href="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
+ che fa parte dell'<a href="https://fonts.google.com/icons">Android Material icon set</a> ed è stata rilasciata sotto <a href="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
Copyright delle modifiche 2017, 2020 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'immagine risultante è rilasciata sotto <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/night_mode.svg#icon"/></svg> è stata derivata da <code>compare</code>,
- che fa parte dell'<a href="https://material.io/icons/">Android Material icon set</a> ed è stata rilasciata sotto <a href="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
+ che fa parte dell'<a href="https://fonts.google.com/icons">Android Material icon set</a> ed è stata rilasciata sotto <a href="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
Copyright delle modifiche 2017, 2020 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'immagine risultante è rilasciata sotto <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>.</p>
<p><img class="left" src="../shared_images/sort_selected.svg"/> è stata derivata da <code>sort</code>,
- che fa parte dell'<a href="https://material.io/icons/">Android Material icon set</a> ed è stata rilasciata sotto <a href="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
+ che fa parte dell'<a href="https://fonts.google.com/icons">Android Material icon set</a> ed è stata rilasciata sotto <a href="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
Copyright delle modifiche 2019, 2020 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'immagine risultante è rilasciata sotto <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>.</p>
<p><img class="left" src="../shared_images/push_pin_filled_selected.svg"/> è stata derivata da <code>push_pin_selected</code>,
- che fa parte dell'<a href="https://material.io/icons/">Android Material icon set</a> ed è stata rilasciata sotto <a href="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
+ che fa parte dell'<a href="https://fonts.google.com/icons">Android Material icon set</a> ed è stata rilasciata sotto <a href="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
Copyright delle modifiche 2019-2020, 2020 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'immagine risultante è rilasciata sotto <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/cookie.svg#icon"/></svg> <code>cookie</code> è stata creata da Google.
<a href="https://github.com/tootsuite/mastodon/blob/master/app/javascript/images/logo_transparent_black.svg">progetto Mastodon</a>,
che è rilasciato sotto <a href="https://www.gnu.org/licenses/agpl-3.0.en.html">licenza AGPLv3+</a>. Il testo completo della licenza è riportato qui sotto.
L'immagine non è stata modificata ad eccezione del layout come il colore, le dimensioni, i bordi. E' inclusa in Privacy Browser in accordo con quanto indicato nella sezione 13 della licenza.</p>
- <p>Le seguenti icone derivano dall'<a href="https://material.io/icons/">Android Material icon set</a>,
+ <p>Le seguenti icone derivano dall'<a href="https://fonts.google.com/icons">Android Material icon set</a>,
che è rilasciato sotto <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
Non sono state modificatae ad eccezione del colore e della dimensione. Alcune sono state rinominate per coerenza con il tipo di utilizzo all'interno del codice.
Le icone con i loro nomi originali sono riportate di seguito.</p>
<h3>Icons</h3>
<p><img class="left" src="../shared_images/privacy_browser.svg"/> <img class="left" src="../shared_images/warning.svg"/> <img class="left" src="../shared_images/javascript_enabled.svg"/>
- are derived from <code>security</code> and <code>language</code>, which are part of the <a href="https://material.io/icons/">Android Material icon set</a> and are released under the
+ are derived from <code>security</code> and <code>language</code>, which are part of the <a href="https://fonts.google.com/icons">Android Material icon set</a> and are released under the
<a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
The full text of the license is below. Modifications copyright 2016 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting images are released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><svg class="left"><use href="../shared_images/move_to_folder.svg#icon"/></svg> is derived from elements of <code>folder</code> and <code>exit_to_app</code>,
- which are part of the <a href="https://material.io/icons/">Android Material icon set</a>
+ which are part of the <a href="https://fonts.google.com/icons">Android Material icon set</a>
and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><svg class="left"><use href="../shared_images/create_bookmark.svg#icon"/></svg> is derived from elements of <code>bookmark</code> and <code>create_new_folder</code>, which are part of the
- <a href="https://material.io/icons/">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ <a href="https://fonts.google.com/icons">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
- <p><svg class="left"><use href="../shared_images/create_folder.svg#icon"/></svg> is derived from <code>create_new_folder</code>,
- which is part of the <a href="https://material.io/icons/">Android Material icon set</a> and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
- Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
- The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
- <p><svg class="left"><use href="../shared_images/clear_and_exit.svg#icon"/></svg> is derived from <code>exit_to_app</code>,
- which is part of the <a href="https://material.io/icons/">Android Material icon set</a> and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
- Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
- The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
- <p><svg class="left"><use href="../shared_images/night_mode.svg#icon"/></svg> is derived from <code>compare</code>,
- which is part of the <a href="https://material.io/icons/">Android Material icon set</a> and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
- Modifications copyright 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
- The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
- <p><img class="left" src="../shared_images/sort_selected.svg"> is derived from <code>sort</code>, which is part of the <a href="https://material.io/icons/">Android Material icon set</a>
- and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>. Modifications copyright 2019, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
- The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
- <p><img class="left" src="../shared_images/push_pin_filled_selected.svg"> is derived from <code>push_pin_selected</code>,
- which is part of the <a href="https://material.io/icons/">Android Material icon set</a> and is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
- Modifications copyright 2019-2020, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
- The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
+ <p><svg class="left"><use href="../shared_images/create_folder.svg#icon"/></svg> é deridado de <code>create_new_folder</code>,
+ que faz parte do <a href="https://fonts.google.com/icons">conjunto de ícones do Android Material</a> é lançado sob a <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licença Apache 2.0</a>.
+ Direitos autorais das modificações 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ A imagem resultante é liberada sob a <a href="https://www.gnu.org/licenses/gpl-3.0.html">licença GPLv3+</a>.</p>
+ <p><svg class="left"><use href="../shared_images/clear_and_exit.svg#icon"/></svg> é deridado de <code>exit_to_app</code>,
+ que faz parte do <a href="https://fonts.google.com/icons">conjunto de ícones do Android Material</a> é lançado sob a <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licença Apache 2.0</a>.
+ Direitos autorais das modificações 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ A imagem resultante é liberada sob a <a href="https://www.gnu.org/licenses/gpl-3.0.html">licença GPLv3+</a>.</p>
+ <p><svg class="left"><use href="../shared_images/night_mode.svg#icon"/></svg> é deridado de <code>compare</code>,
+ que faz parte do <a href="https://fonts.google.com/icons">conjunto de ícones do Android Material</a> é lançado sob a <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licença Apache 2.0</a>.
+ Direitos autorais das modificações 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ A imagem resultante é liberada sob a <a href="https://www.gnu.org/licenses/gpl-3.0.html">licença GPLv3+</a>.</p>
+ <p><img class="left" src="../shared_images/sort_selected.svg"> é deridado de <code>sort</code>, que faz parte do <a href="https://fonts.google.com/icons">conjunto de ícones do Android Material</a>
+ é lançado sob a <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licença Apache 2.0</a>. Direitos autorais das modificações 2019, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ A imagem resultante é liberada sob a <a href="https://www.gnu.org/licenses/gpl-3.0.html">licença GPLv3+</a>.</p>
+ <p><img class="left" src="../shared_images/push_pin_filled_selected.svg"> é deridado de <code>push_pin_selected</code>,
+ que faz parte do <a href="https://fonts.google.com/icons">conjunto de ícones do Android Material</a> é lançado sob a <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licença Apache 2.0</a>.
+ Direitos autorais das modificações 2019-2020, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ A imagem resultante é liberada sob a <a href="https://www.gnu.org/licenses/gpl-3.0.html">licença GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/cookie.svg#icon"/></svg> <code>cookie</code> was created by Google.
It is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
and can be downloaded from <a href="https://materialdesignicons.com/icon/cookie">Material Design Icons</a>. It is unchanged except for layout information like color and size.</p>
<a href="https://github.com/tootsuite/mastodon/blob/master/app/javascript/images/logo_transparent_black.svg">Mastodon project</a>,
which is released under the <a href="https://www.gnu.org/licenses/agpl-3.0.en.html">AGPLv3+ license</a>. The full text of the license is below.
The image is unchanged except for layout information like color, size, and margin. It is included in Privacy Browser under the provisions in section 13 of the license.</p>
- <p>The following icons come from the <a href="https://material.io/icons/">Android Material icon set</a>,
+ <p>The following icons come from the <a href="https://fonts.google.com/icons">Android Material icon set</a>,
which is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
They are unchanged except for layout information like color and size. Some of them have been renamed to match their use in the code. The original icons and names are shown below.</p>
<p><svg class="icon"><use href="../shared_images/add.svg#icon"/></svg> add.</p>
<h3><a href="https://developer.android.com/about/versions/13/features#runtime-receivers">
com.stoutner.privacybrowser.<wbr>standard.<wbr>DYNAMIC_<wbr>RECEIVER_<wbr>NOT_<wbr>EXPORTED_<wbr>PERMISSION</a></h3>
- <p>Automatically added to all apps targeting API >= 33 (Android 13) to prevent other apps from connecting to dynamic receivers without explicit permission.</p>
+ <p>Adicionado automaticamente a todos os aplicativos direcionados à API >= 33 (Android 13) para impedir que outros aplicativos se conectem a receptores dinâmicos sem permissão explícita.</p>
</body>
</html>
the drawer may be opened by long-pressing on the edge of the screen <a href="https://redmine.stoutner.com/boards/1/topics/243">until the drawer peaks out</a> and then swiping it open.
Sometimes it can be difficult to get the bookmarks drawer to reliably peak on devices with curved edges, so it is also possible to open the bookmarks drawer from the options menu.</p>
- <p>Tapping on a bookmark opens it in the current tab. Long-pressing on a bookmark opens it in a new tab and long-pressing on a folder opens all the bookmarks it directly contains in new tabs.
+ <p>Tocar em um marcador o abre na guia atual.
+ Pressionar longamente um marcador abre-o em uma nova guia e pressionar longamente uma pasta abre todos os favoritos que ela contém diretamente em novas guias.
Tapping the top floating action button in the bookmarks drawer opens the bookmarks activity, where bookmarks can be edited and reorganized.</p>
</body>
</html>
<h3>Иконки</h3>
<p><img class="left" src="../shared_images/privacy_browser.svg"/> <img class="left" src="../shared_images/warning.svg"/> <img class="left" src="../shared_images/javascript_enabled.svg"/>
- являются производными от <code>security</code> и <code>language</code>, которые являются частью <a href="https://material.io/icons/">Android Material icon set</a> и выпущены под
+ являются производными от <code>security</code> и <code>language</code>, которые являются частью <a href="https://fonts.google.com/icons">Android Material icon set</a> и выпущены под
<a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>. Полный текст лицензии приведен ниже.
Модификации авторских прав 2016 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Полученные изображения выпущены под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/move_to_folder.svg#icon"/></svg> являются производными от <code>folder</code> и <code>exit_to_app</code>, которые являются частью
- <a href="https://material.io/icons/">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ <a href="https://fonts.google.com/icons">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Модификации авторских прав 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Полученные изображения выпущены под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/create_bookmark.svg#icon"/></svg> являются производными от <code>bookmark</code> и <code>create_new_folder</code>, которые являются частью
- <a href="https://material.io/icons/">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ <a href="https://fonts.google.com/icons">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Модификации авторских прав 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Полученные изображения выпущены под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/create_folder.svg#icon"/></svg> являются производными от <code>create_new_folder</code>, которые являются частью
- <a href="https://material.io/icons/">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ <a href="https://fonts.google.com/icons">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Модификации авторских прав 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Полученные изображения выпущены под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/clear_and_exit.svg#icon"/></svg> являются производными от <code>exit_to_app</code>,
- которые являются частью <a href="https://material.io/icons/">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ которые являются частью <a href="https://fonts.google.com/icons">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Модификации авторских прав 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Полученные изображения выпущены под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/night_mode.svg#icon"/></svg> являются производными от <code>compare</code>,
- которые являются частью <a href="https://material.io/icons/">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ которые являются частью <a href="https://fonts.google.com/icons">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Модификации авторских прав 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Полученные изображения выпущены под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>.</p>
<p><img class="left" src="../shared_images/sort_selected.svg"/> являются производными от <code>sort</code>,
- которые являются частью <a href="https://material.io/icons/">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ которые являются частью <a href="https://fonts.google.com/icons">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Модификации авторских прав 2019, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Полученные изображения выпущены под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>.</p>
<p><img class="left" src="../shared_images/push_pin_filled_selected.svg"/> являются производными от <code>push_pin_selected</code>,
- которые являются частью <a href="https://material.io/icons/">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ которые являются частью <a href="https://fonts.google.com/icons">Android Material icon set</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Модификации авторских прав 2019-2020, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Полученные изображения выпущены под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>.</p>
<p><svg class="left"><use href="../shared_images/cookie.svg#icon"/></svg> <code>cookie</code> были созданы Google.
<a href="https://github.com/tootsuite/mastodon/blob/master/app/javascript/images/logo_transparent_black.svg">проекта Mastodon</a>,
который выпускается под <a href="https://www.gnu.org/licenses/agpl-3.0.en.html">лицензией AGPLv3+</a>. Полный текст лицензии приведен ниже.
Изображение не было изменено, за исключением информации о верстке, в том числе цвет, размеры и отступы. В соответствии с положениями раздела 13 лицензии оно включено в Privacy Browser.</p>
- <p>Следующие значки взяты из<a href="https://material.io/icons/">Android Material icon set</a>,
+ <p>Следующие значки взяты из<a href="https://fonts.google.com/icons">Android Material icon set</a>,
которые выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
Они неизменны, за исключением такой информации, как цвет и размер. Некоторые из них были переименованы в соответствии с их использованием в коде. Оригинальные значки и имена показаны ниже.</p>
<p><svg class="icon"><use href="../shared_images/add.svg#icon"/></svg> add.</p>
<h3>Simgeler</h3>
<p><img class="left" src="../shared_images/privacy_browser.svg"/> <img class="left" src="../shared_images/warning.svg"/> <img class="left" src="../shared_images/javascript_enabled.svg"/>
<a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a> altında yayınlanan ve
- <a href="https://material.io/icons/">Android Material</a> simge setinin bir parçası olan <code>security</code> ve <code>language</code>'den elde edilmiştir.
+ <a href="https://fonts.google.com/icons">Android Material</a> simge setinin bir parçası olan <code>security</code> ve <code>language</code>'den elde edilmiştir.
Lisansın tüm metni aşağıdadır. Değişikliklerin telif hakkı 2016 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Ortaya çıkan görüntüler <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+</a> lisansı altında yayınlandı.</p>
<p><svg class="left"><use href="../shared_images/move_to_folder.svg#icon"/></svg> <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a> altında yayınlanan ve
- <a href="https://material.io/icons/">Android Material</a> simge setinin bir parçası olan <code>folder</code> ve <code>exit_to_app</code> elementlerinden elde edilmiştir.
+ <a href="https://fonts.google.com/icons">Android Material</a> simge setinin bir parçası olan <code>folder</code> ve <code>exit_to_app</code> elementlerinden elde edilmiştir.
Değişikliklerin telif hakkı 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Ortaya çıkan görüntü <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+</a> lisansı altında yayınlandı.</p>
<p><svg class="left"><use href="../shared_images/create_bookmark.svg#icon"/></svg> <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a> altında yayınlanan ve
- <a href="https://material.io/icons/">Android Material</a> simge setinin bir parçası olan <code>bookmarks</code> ve <code>create_new_folder</code> elementlerinden elde edilmiştir.
+ <a href="https://fonts.google.com/icons">Android Material</a> simge setinin bir parçası olan <code>bookmarks</code> ve <code>create_new_folder</code> elementlerinden elde edilmiştir.
Değişikliklerin telif hakkı 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Ortaya çıkan görüntü <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+</a> lisansı altında yayınlandı.</p>
<p><svg class="left"><use href="../shared_images/create_folder.svg#icon"/></svg> <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a> altında yayınlanan ve
- <a href="https://material.io/icons/">Android Material</a> simge setinin bir parçası olan <code>create_new_folder</code>'dan elde edilmiştir.
+ <a href="https://fonts.google.com/icons">Android Material</a> simge setinin bir parçası olan <code>create_new_folder</code>'dan elde edilmiştir.
Değişikliklerin telif hakkı 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Ortaya çıkan görüntü <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+</a> lisansı altında yayınlandı.</p>
<p><svg class="left"><use href="../shared_images/clear_and_exit.svg#icon"/></svg> <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a> altında yayınlanan ve
- <a href="https://material.io/icons/">Android Material</a> simge setinin bir parçası olan <code>exit_to_app</code>'ten elde edilmiştir.
+ <a href="https://fonts.google.com/icons">Android Material</a> simge setinin bir parçası olan <code>exit_to_app</code>'ten elde edilmiştir.
Değişikliklerin telif hakkı 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Ortaya çıkan görüntü <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+</a> lisansı altında yayınlandı.</p>
<p><svg class="left"><use href="../shared_images/night_mode.svg#icon"/></svg> <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a> altında yayınlanan ve
- <a href="https://material.io/icons/">Android Material</a> simge setinin bir parçası olan <code>compare</code>'den elde edilmiştir.
+ <a href="https://fonts.google.com/icons">Android Material</a> simge setinin bir parçası olan <code>compare</code>'den elde edilmiştir.
Değişikliklerin telif hakkı 2017, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Ortaya çıkan görüntü <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+</a> lisansı altında yayınlandı.</p>
<p><img class="left" src="../shared_images/sort_selected.svg"/> <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a> altında yayınlanan ve
- <a href="https://material.io/icons/">Android Material</a> simge setinin bir parçası olan <code>sort</code>'dan elde edilmiştir.
+ <a href="https://fonts.google.com/icons">Android Material</a> simge setinin bir parçası olan <code>sort</code>'dan elde edilmiştir.
Değişikliklerin telif hakkı 2019, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Ortaya çıkan görüntü <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+</a> lisansı altında yayınlandı.</p>
<p><img class="left" src="../shared_images/push_pin_filled_selected.svg"/> <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a> altında yayınlanan ve
- <a href="https://material.io/icons/">Android Material</a> simge setinin bir parçası olan <code>push_pin_selected</code>'dan elde edilmiştir.
+ <a href="https://fonts.google.com/icons">Android Material</a> simge setinin bir parçası olan <code>push_pin_selected</code>'dan elde edilmiştir.
Değişikliklerin telif hakkı 2019-2020, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Ortaya çıkan görüntü <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+</a> lisansı altında yayınlandı.</p>
<p><svg class="left"><use href="../shared_images/cookie.svg#icon"/></svg> <code>cookie</code> Google tarafından oluşturuldu.
<a href="https://github.com/tootsuite/mastodon/blob/master/app/javascript/images/logo_transparent_black.svg">Mastodon project</a>,
which is released under the <a href="https://www.gnu.org/licenses/agpl-3.0.en.html">AGPLv3+ license</a>. The full text of the license is below.
The image is unchanged except for layout information like color, size, and margin. It is included in Privacy Browser under the provisions in section 13 of the license.</p>
- <p>Aşağıdaki simgeler <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a> altında yayınlanan <a href="https://material.io/icons/">Android Material</a>
+ <p>Aşağıdaki simgeler <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a> altında yayınlanan <a href="https://fonts.google.com/icons">Android Material</a>
simge setinden gelmektedir. Renk ve ebat gibi düzen bilgileri dışında herhangi bir değişiklik yapılmamıştır. Bazıları koddaki kullanımlarıyla uygun olacak şekilde yeniden adlandırıldı.
Orijinal simgeler ve adlar aşağıda gösterilmiştir.</p>
<p><svg class="icon"><use href="../shared_images/add.svg#icon"/></svg> add.</p>
import com.stoutner.privacybrowser.helpers.DomainsDatabaseHelper;
import com.stoutner.privacybrowser.helpers.ProxyHelper;
import com.stoutner.privacybrowser.helpers.SanitizeUrlHelper;
+import com.stoutner.privacybrowser.helpers.UrlHelper;
import com.stoutner.privacybrowser.views.NestedScrollWebView;
import java.io.ByteArrayInputStream;
private BookmarksDatabaseHelper bookmarksDatabaseHelper;
private DomainsDatabaseHelper domainsDatabaseHelper;
private ProxyHelper proxyHelper;
- private SanitizeUrlHelper sanitizeUrlHelper;
// Declare the class variables
private boolean bookmarksDrawerPinned;
bookmarksDatabaseHelper = new BookmarksDatabaseHelper(this);
domainsDatabaseHelper = new DomainsDatabaseHelper(this);
proxyHelper = new ProxyHelper();
- sanitizeUrlHelper = new SanitizeUrlHelper();
// Update the bookmarks drawer pinned image view.
updateBookmarksDrawerPinnedImageView();
private String sanitizeUrl(String url) {
// Sanitize tracking queries.
if (sanitizeTrackingQueries)
- url = sanitizeUrlHelper.sanitizeTrackingQueries(url);
+ url = SanitizeUrlHelper.sanitizeTrackingQueries(url);
// Sanitize AMP redirects.
if (sanitizeAmpRedirects)
- url = sanitizeUrlHelper.sanitizeAmpRedirects(url);
+ url = SanitizeUrlHelper.sanitizeAmpRedirects(url);
// Return the sanitized URL.
return url;
}
// Get the file name from the content disposition.
- String fileNameString = PrepareSaveDialogCoroutine.getFileNameFromHeaders(this, contentDisposition, mimetype, downloadUrl);
+ String fileNameString = UrlHelper.getFileName(this, contentDisposition, mimetype, downloadUrl);
// Instantiate the save dialog.
- DialogFragment saveDialogFragment = SaveDialog.saveUrl(downloadUrl, formattedFileSizeString, fileNameString, userAgent,
+ DialogFragment saveDialogFragment = SaveDialog.saveUrl(downloadUrl, fileNameString, formattedFileSizeString, userAgent,
nestedScrollWebView.getAcceptCookies());
// Try to show the dialog. The download listener continues to function even when the WebView is paused. Attempting to display a dialog in that state leads to a crash.
package com.stoutner.privacybrowser.coroutines
import android.content.Context
-import android.net.Uri
-import android.webkit.CookieManager
-import android.webkit.MimeTypeMap
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import com.stoutner.privacybrowser.activities.MainWebViewActivity
import com.stoutner.privacybrowser.dataclasses.PendingDialogDataClass
import com.stoutner.privacybrowser.dialogs.SaveDialog
-import com.stoutner.privacybrowser.helpers.ProxyHelper
+import com.stoutner.privacybrowser.helpers.UrlHelper
+
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.lang.Exception
-import java.net.HttpURLConnection
-import java.net.URL
-import java.text.NumberFormat
object PrepareSaveDialogCoroutine {
@JvmStatic
CoroutineScope(Dispatchers.Main).launch {
// Make the network requests on the IO thread.
withContext(Dispatchers.IO) {
- // Define the strings.
- var formattedFileSize: String
- var fileNameString: String
-
- // Populate the file size and name strings.
- if (urlString.startsWith("data:")) { // The URL contains the entire data of an image.
- // Remove `data:` from the beginning of the URL.
- val urlWithoutData = urlString.substring(5)
-
- // Get the URL MIME type, which ends with a `;`.
- val urlMimeType = urlWithoutData.substring(0, urlWithoutData.indexOf(";"))
-
- // Get the Base64 data, which begins after a `,`.
- val base64DataString = urlWithoutData.substring(urlWithoutData.indexOf(",") + 1)
-
- // Calculate the file size of the data URL. Each Base64 character represents 6 bits.
- formattedFileSize = NumberFormat.getInstance().format(base64DataString.length * 3L / 4) + " " + context.getString(R.string.bytes)
-
- // Set the file name according to the MIME type.
- fileNameString = context.getString(R.string.file) + "." + MimeTypeMap.getSingleton().getExtensionFromMimeType(urlMimeType)
- } else { // The URL refers to the location of the data.
- // Initialize the formatted file size string.
- formattedFileSize = context.getString(R.string.unknown_size)
-
- // Because everything relating to requesting data from a webserver can throw errors, the entire section must catch exceptions.
- try {
- // Convert the URL string to a URL.
- val url = URL(urlString)
-
- // Instantiate the proxy helper.
- val proxyHelper = ProxyHelper()
-
- // Get the current proxy.
- val proxy = proxyHelper.getCurrentProxy(context)
-
- // Open a connection to the URL. No data is actually sent at this point.
- val httpUrlConnection = url.openConnection(proxy) as HttpURLConnection
-
- // Add the user agent to the header property.
- httpUrlConnection.setRequestProperty("User-Agent", userAgent)
-
- // Add the cookies if they are enabled.
- if (cookiesEnabled) {
- // Get the cookies for the current domain.
- val cookiesString = CookieManager.getInstance().getCookie(url.toString())
-
- // Add the cookies if they are not null.
- if (cookiesString != null)
- httpUrlConnection.setRequestProperty("Cookie", cookiesString)
- }
-
- // The actual network request is in a `try` bracket so that `disconnect()` is run in the `finally` section even if an error is encountered in the main block.
- try {
- // Get the status code. This initiates a network connection.
- val responseCode = httpUrlConnection.responseCode
-
- // Check the response code.
- if (responseCode >= 400) { // The response code is an error message.
- // Set the formatted file size to indicate a bad URL.
- formattedFileSize = context.getString(R.string.invalid_url)
-
- // Set the file name according to the URL.
- fileNameString = getFileNameFromUrl(context, urlString, null)
- } else { // The response code is not an error message.
- // Get the headers.
- val contentLengthString = httpUrlConnection.getHeaderField("Content-Length")
- val contentDispositionString = httpUrlConnection.getHeaderField("Content-Disposition")
- var contentTypeString = httpUrlConnection.contentType
-
- // Remove anything after the MIME type in the content type string.
- if (contentTypeString.contains(";"))
- contentTypeString = contentTypeString.substring(0, contentTypeString.indexOf(";"))
-
- // Only process the content length string if it isn't null.
- if (contentLengthString != null) {
- // Convert the content length string to a long.
- val fileSize = contentLengthString.toLong()
-
- // Format the file size.
- formattedFileSize = NumberFormat.getInstance().format(fileSize) + " " + context.getString(R.string.bytes)
- }
-
- // Get the file name string from the content disposition.
- fileNameString = getFileNameFromHeaders(context, contentDispositionString, contentTypeString, urlString)
- }
- } finally {
- // Disconnect the HTTP URL connection.
- httpUrlConnection.disconnect()
- }
- } catch (exception: Exception) {
- // Set the formatted file size to indicate a bad URL.
- formattedFileSize = context.getString(R.string.invalid_url)
-
- // Set the file name according to the URL.
- fileNameString = getFileNameFromUrl(context, urlString, null)
- }
- }
+ // Get the file name and size.
+ val fileNameAndSize = UrlHelper.getNameAndSize(context, urlString, userAgent, cookiesEnabled)
// Display the dialog on the main thread.
withContext(Dispatchers.Main) {
// Instantiate the save dialog.
- val saveDialogFragment: DialogFragment = SaveDialog.saveUrl(urlString, formattedFileSize, fileNameString, userAgent, cookiesEnabled)
+ val saveDialogFragment: DialogFragment = SaveDialog.saveUrl(urlString, fileNameAndSize.first, fileNameAndSize.second, userAgent, cookiesEnabled)
// Try to show the dialog. Sometimes the window is not active.
try {
}
}
}
-
- // Content dispositions can contain other text besides the file name, and they can be in any order.
- // Elements are separated by semicolons. Sometimes the file names are contained in quotes.
- @JvmStatic
- fun getFileNameFromHeaders(context: Context, contentDispositionString: String?, contentTypeString: String?, urlString: String): String {
- // Define a file name string.
- var fileNameString: String
-
- // Only process the content disposition string if it isn't null.
- if (contentDispositionString != null) { // The content disposition is not null.
- // Check to see if the content disposition contains a file name.
- if (contentDispositionString.contains("filename=")) { // The content disposition contains a filename.
- // Get the part of the content disposition after `filename=`.
- fileNameString = contentDispositionString.substring(contentDispositionString.indexOf("filename=") + 9)
-
- // Remove any `;` and anything after it. This removes any entries after the filename.
- if (fileNameString.contains(";"))
- fileNameString = fileNameString.substring(0, fileNameString.indexOf(";") - 1)
-
- // Remove any `"` at the beginning of the string.
- if (fileNameString.startsWith("\""))
- fileNameString = fileNameString.substring(1)
-
- // Remove any `"` at the end of the string.
- if (fileNameString.endsWith("\""))
- fileNameString = fileNameString.substring(0, fileNameString.length - 1)
- } else { // The headers contain no useful information.
- // Get the file name string from the URL.
- fileNameString = getFileNameFromUrl(context, urlString, contentTypeString)
- }
- } else { // The content disposition is null.
- // Get the file name string from the URL.
- fileNameString = getFileNameFromUrl(context, urlString, contentTypeString)
- }
-
- // Return the file name string.
- return fileNameString
- }
-
- private fun getFileNameFromUrl(context: Context, urlString: String, contentTypeString: String?): String {
- // Convert the URL string to a URI.
- val uri = Uri.parse(urlString)
-
- // Get the last path segment.
- var lastPathSegment = uri.lastPathSegment
-
- // Use a default file name if the last path segment is null.
- if (lastPathSegment == null) {
- // Set the last path segment to be the generic file name.
- lastPathSegment = context.getString(R.string.file)
-
- // Add a file extension if it can be detected.
- if (MimeTypeMap.getSingleton().hasMimeType(contentTypeString))
- lastPathSegment = lastPathSegment + "." + MimeTypeMap.getSingleton().getExtensionFromMimeType(contentTypeString)
- }
-
- // Return the last path segment as the file name.
- return lastPathSegment
- }
}
import androidx.preference.PreferenceManager
import com.stoutner.privacybrowser.R
-import com.stoutner.privacybrowser.helpers.GetUrlSizeHelper
+import com.stoutner.privacybrowser.helpers.UrlHelper
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-import java.net.URL
-
// Define the class constants.
private const val URL_STRING = "url_string"
private const val FILE_SIZE_STRING = "file_size_string"
companion object {
// `@JvmStatic` will no longer be required once all the code has transitioned to Kotlin.
@JvmStatic
- fun saveUrl(urlString: String, fileSizeString: String, fileNameString: String, userAgentString: String, cookiesEnabled: Boolean): SaveDialog {
+ fun saveUrl(urlString: String, fileNameString: String, fileSizeString: String, userAgentString: String, cookiesEnabled: Boolean): SaveDialog {
// Create an arguments bundle.
val argumentsBundle = Bundle()
// Store the arguments in the bundle.
argumentsBundle.putString(URL_STRING, urlString)
- argumentsBundle.putString(FILE_SIZE_STRING, fileSizeString)
argumentsBundle.putString(FILE_NAME_STRING, fileNameString)
+ argumentsBundle.putString(FILE_SIZE_STRING, fileSizeString)
argumentsBundle.putString(USER_AGENT_STRING, userAgentString)
argumentsBundle.putBoolean(COOKIES_ENABLED, cookiesEnabled)
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
// Get the arguments from the bundle.
val originalUrlString = requireArguments().getString(URL_STRING)!!
+ var fileNameString = requireArguments().getString(FILE_NAME_STRING)!!
val fileSizeString = requireArguments().getString(FILE_SIZE_STRING)!!
- val fileNameString = requireArguments().getString(FILE_NAME_STRING)!!
val userAgentString = requireArguments().getString(USER_AGENT_STRING)!!
val cookiesEnabled = requireArguments().getBoolean(COOKIES_ENABLED)
CoroutineScope(Dispatchers.Main).launch {
// Create a URL size string.
- var urlSize: String
+ var fileNameAndSize: Pair<String, String>
// Get the URL size on the IO thread.
withContext(Dispatchers.IO) {
- // Get the URL size.
- urlSize = GetUrlSizeHelper.getUrl(requireContext(), URL(urlToSave), userAgentString, cookiesEnabled)
+ // Get the updated file name and size.
+ fileNameAndSize = UrlHelper.getNameAndSize(requireContext(), urlToSave, userAgentString, cookiesEnabled)
+
+ // Save the updated file name.
+ fileNameString = fileNameAndSize.first
}
// Display the updated URL.
- fileSizeTextView.text = urlSize
+ fileSizeTextView.text = fileNameAndSize.second
}
}
})
+++ /dev/null
-/*
- * Copyright 2020-2022 Soren Stoutner <soren@stoutner.com>.
- *
- * This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
- *
- * 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/>.
- */
-
-package com.stoutner.privacybrowser.helpers
-
-import android.content.Context
-import android.webkit.CookieManager
-
-import com.stoutner.privacybrowser.R
-
-import java.lang.Exception
-import java.net.HttpURLConnection
-import java.net.URL
-import java.text.NumberFormat
-
-object GetUrlSizeHelper {
- fun getUrl(context: Context, url: URL, userAgent: String, cookiesEnabled: Boolean): String {
- // Initialize the formatted file size string.
- var formattedFileSize = context.getString(R.string.unknown_size)
-
- // Because everything relating to requesting data from a webserver can throw errors, the entire section must catch exceptions.
- try {
- // Instantiate the proxy helper.
- val proxyHelper = ProxyHelper()
-
- // Get the current proxy.
- val proxy = proxyHelper.getCurrentProxy(context)
-
- // Open a connection to the URL. No data is actually sent at this point.
- val httpUrlConnection = url.openConnection(proxy) as HttpURLConnection
-
- // Add the user agent to the header property.
- httpUrlConnection.setRequestProperty("User-Agent", userAgent)
-
- // Add the cookies if they are enabled.
- if (cookiesEnabled) {
- // Get the cookies for the current domain.
- val cookiesString = CookieManager.getInstance().getCookie(url.toString())
-
- // Only add the cookies if they are not null.
- if (cookiesString != null) {
- // Add the cookies to the header property.
- httpUrlConnection.setRequestProperty("Cookie", cookiesString)
- }
- }
-
- // The actual network request is in a `try` bracket so that `disconnect()` is run in the `finally` section even if an error is encountered in the main block.
- try {
- // Get the status code. This initiates a network connection.
- val responseCode = httpUrlConnection.responseCode
-
- // Check the response code.
- if (responseCode >= 400) { // The response code is an error message.
- // Set the formatted file size to indicate a bad URL.
- formattedFileSize = context.getString(R.string.invalid_url)
- } else { // The response code is not an error message.
- // Get the content length header.
- val contentLengthString = httpUrlConnection.getHeaderField("Content-Length")
-
- // Only process the content length string if it isn't null.
- if (contentLengthString != null) {
- // Convert the content length string to a long.
- val fileSize = contentLengthString.toLong()
-
- // Format the file size.
- formattedFileSize = NumberFormat.getInstance().format(fileSize) + " " + context.getString(R.string.bytes)
- }
- }
- } finally {
- // Disconnect the HTTP URL connection.
- httpUrlConnection.disconnect()
- }
- } catch (exception: Exception) {
- // Set the formatted file size to indicate a bad URL.
- formattedFileSize = context.getString(R.string.invalid_url)
- }
-
- // Return the formatted file size.
- return formattedFileSize
- }
-}
/*
- * Copyright ©2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2022 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
*
"yclid=" // Yandex Click ID.
)
-class SanitizeUrlHelper {
+object SanitizeUrlHelper {
+ @JvmStatic
fun sanitizeTrackingQueries(inputUrl: String): String {
// Make a copy of the input URL so that it can be modified.
var url = inputUrl
return url
}
+ @JvmStatic
fun sanitizeAmpRedirects(inputUrl: String): String {
// Make a copy of the input URL so that it can be modified.
var url = inputUrl
// Return the sanitized URL.
return url
}
-}
\ No newline at end of file
+}
--- /dev/null
+/*
+ * Copyright 2020-2022 Soren Stoutner <soren@stoutner.com>.
+ *
+ * This file is part of Privacy Browser Android <https://www.stoutner.com/privacy-browser-android>.
+ *
+ * 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/>.
+ */
+
+package com.stoutner.privacybrowser.helpers
+
+import android.content.Context
+import android.net.Uri
+import android.webkit.CookieManager
+import android.webkit.MimeTypeMap
+
+import com.stoutner.privacybrowser.R
+
+import java.lang.Exception
+import java.net.HttpURLConnection
+import java.net.URL
+import java.text.NumberFormat
+
+object UrlHelper {
+ // Content dispositions can contain other text besides the file name, and they can be in any order.
+ // Elements are separated by semicolons. Sometimes the file names are contained in quotes.
+ @JvmStatic
+ fun getFileName(context: Context, contentDispositionString: String?, contentTypeString: String?, urlString: String): String {
+ // Define a file name string.
+ var fileNameString: String
+
+ // Only process the content disposition string if it isn't null.
+ if (contentDispositionString != null) { // The content disposition is not null.
+ // Check to see if the content disposition contains a file name.
+ if (contentDispositionString.contains("filename=")) { // The content disposition contains a filename.
+ // Get the part of the content disposition after `filename=`.
+ fileNameString = contentDispositionString.substring(contentDispositionString.indexOf("filename=") + 9)
+
+ // Remove any `;` and anything after it. This removes any entries after the filename.
+ if (fileNameString.contains(";"))
+ fileNameString = fileNameString.substring(0, fileNameString.indexOf(";") - 1)
+
+ // Remove any `"` at the beginning of the string.
+ if (fileNameString.startsWith("\""))
+ fileNameString = fileNameString.substring(1)
+
+ // Remove any `"` at the end of the string.
+ if (fileNameString.endsWith("\""))
+ fileNameString = fileNameString.substring(0, fileNameString.length - 1)
+ } else { // The headers contain no useful information.
+ // Get the file name string from the URL.
+ fileNameString = getFileNameFromUrl(context, urlString, contentTypeString)
+ }
+ } else { // The content disposition is null.
+ // Get the file name string from the URL.
+ fileNameString = getFileNameFromUrl(context, urlString, contentTypeString)
+ }
+
+ // Return the file name string.
+ return fileNameString
+ }
+
+ private fun getFileNameFromUrl(context: Context, urlString: String, contentTypeString: String?): String {
+ // Convert the URL string to a URI.
+ val uri = Uri.parse(urlString)
+
+ // Get the last path segment.
+ var lastPathSegment = uri.lastPathSegment
+
+ // Use a default file name if the last path segment is null.
+ if (lastPathSegment == null) {
+ // Set the last path segment to be the generic file name.
+ lastPathSegment = context.getString(R.string.file)
+
+ // Add a file extension if it can be detected.
+ if (MimeTypeMap.getSingleton().hasMimeType(contentTypeString))
+ lastPathSegment = lastPathSegment + "." + MimeTypeMap.getSingleton().getExtensionFromMimeType(contentTypeString)
+ }
+
+ // Return the last path segment as the file name.
+ return lastPathSegment
+ }
+
+ fun getNameAndSize(context: Context, urlString: String, userAgent: String, cookiesEnabled: Boolean): Pair<String, String> {
+ // Define the strings.
+ var fileNameString: String
+ var formattedFileSize: String
+
+ // Populate the file size and name strings.
+ if (urlString.startsWith("data:")) { // The URL contains the entire data of an image.
+ // Remove `data:` from the beginning of the URL.
+ val urlWithoutData = urlString.substring(5)
+
+ // Get the URL MIME type, which ends with a `;`.
+ val urlMimeType = urlWithoutData.substring(0, urlWithoutData.indexOf(";"))
+
+ // Get the Base64 data, which begins after a `,`.
+ val base64DataString = urlWithoutData.substring(urlWithoutData.indexOf(",") + 1)
+
+ // Calculate the file size of the data URL. Each Base64 character represents 6 bits.
+ formattedFileSize = NumberFormat.getInstance().format(base64DataString.length * 3L / 4) + " " + context.getString(R.string.bytes)
+
+ // Set the file name according to the MIME type.
+ fileNameString = context.getString(R.string.file) + "." + MimeTypeMap.getSingleton().getExtensionFromMimeType(urlMimeType)
+ } else { // The URL refers to the location of the data.
+ // Initialize the formatted file size string.
+ formattedFileSize = context.getString(R.string.unknown_size)
+
+ // Because everything relating to requesting data from a webserver can throw errors, the entire section must catch exceptions.
+ try {
+ // Convert the URL string to a URL.
+ val url = URL(urlString)
+
+ // Instantiate the proxy helper.
+ val proxyHelper = ProxyHelper()
+
+ // Get the current proxy.
+ val proxy = proxyHelper.getCurrentProxy(context)
+
+ // Open a connection to the URL. No data is actually sent at this point.
+ val httpUrlConnection = url.openConnection(proxy) as HttpURLConnection
+
+ // Add the user agent to the header property.
+ httpUrlConnection.setRequestProperty("User-Agent", userAgent)
+
+ // Add the cookies if they are enabled.
+ if (cookiesEnabled) {
+ // Get the cookies for the current domain.
+ val cookiesString = CookieManager.getInstance().getCookie(url.toString())
+
+ // Add the cookies if they are not null.
+ if (cookiesString != null)
+ httpUrlConnection.setRequestProperty("Cookie", cookiesString)
+ }
+
+ // The actual network request is in a `try` bracket so that `disconnect()` is run in the `finally` section even if an error is encountered in the main block.
+ try {
+ // Get the status code. This initiates a network connection.
+ val responseCode = httpUrlConnection.responseCode
+
+ // Check the response code.
+ if (responseCode >= 400) { // The response code is an error message.
+ // Set the formatted file size to indicate a bad URL.
+ formattedFileSize = context.getString(R.string.invalid_url)
+
+ // Set the file name according to the URL.
+ fileNameString = getFileNameFromUrl(context, urlString, null)
+ } else { // The response code is not an error message.
+ // Get the headers.
+ val contentLengthString = httpUrlConnection.getHeaderField("Content-Length")
+ val contentDispositionString = httpUrlConnection.getHeaderField("Content-Disposition")
+ var contentTypeString = httpUrlConnection.contentType
+
+ // Remove anything after the MIME type in the content type string.
+ if (contentTypeString.contains(";"))
+ contentTypeString = contentTypeString.substring(0, contentTypeString.indexOf(";"))
+
+ // Only process the content length string if it isn't null.
+ if (contentLengthString != null) {
+ // Convert the content length string to a long.
+ val fileSize = contentLengthString.toLong()
+
+ // Format the file size.
+ formattedFileSize = NumberFormat.getInstance().format(fileSize) + " " + context.getString(R.string.bytes)
+ }
+
+ // Get the file name string from the content disposition.
+ fileNameString = getFileName(context, contentDispositionString, contentTypeString, urlString)
+ }
+ } finally {
+ // Disconnect the HTTP URL connection.
+ httpUrlConnection.disconnect()
+ }
+ } catch (exception: Exception) {
+ // Set the formatted file size to indicate a bad URL.
+ formattedFileSize = context.getString(R.string.invalid_url)
+
+ // Set the file name according to the URL.
+ fileNameString = getFileNameFromUrl(context, urlString, null)
+ }
+ }
+
+ // Return the file name and size.
+ return Pair(fileNameString, formattedFileSize)
+ }
+
+ fun getSize(context: Context, url: URL, userAgent: String, cookiesEnabled: Boolean): String {
+ // Initialize the formatted file size string.
+ var formattedFileSize = context.getString(R.string.unknown_size)
+
+ // Because everything relating to requesting data from a webserver can throw errors, the entire section must catch exceptions.
+ try {
+ // Instantiate the proxy helper.
+ val proxyHelper = ProxyHelper()
+
+ // Get the current proxy.
+ val proxy = proxyHelper.getCurrentProxy(context)
+
+ // Open a connection to the URL. No data is actually sent at this point.
+ val httpUrlConnection = url.openConnection(proxy) as HttpURLConnection
+
+ // Add the user agent to the header property.
+ httpUrlConnection.setRequestProperty("User-Agent", userAgent)
+
+ // Add the cookies if they are enabled.
+ if (cookiesEnabled) {
+ // Get the cookies for the current domain.
+ val cookiesString = CookieManager.getInstance().getCookie(url.toString())
+
+ // Only add the cookies if they are not null.
+ if (cookiesString != null) {
+ // Add the cookies to the header property.
+ httpUrlConnection.setRequestProperty("Cookie", cookiesString)
+ }
+ }
+
+ // The actual network request is in a `try` bracket so that `disconnect()` is run in the `finally` section even if an error is encountered in the main block.
+ try {
+ // Get the status code. This initiates a network connection.
+ val responseCode = httpUrlConnection.responseCode
+
+ // Check the response code.
+ if (responseCode >= 400) { // The response code is an error message.
+ // Set the formatted file size to indicate a bad URL.
+ formattedFileSize = context.getString(R.string.invalid_url)
+ } else { // The response code is not an error message.
+ // Get the content length header.
+ val contentLengthString = httpUrlConnection.getHeaderField("Content-Length")
+
+ // Only process the content length string if it isn't null.
+ if (contentLengthString != null) {
+ // Convert the content length string to a long.
+ val fileSize = contentLengthString.toLong()
+
+ // Format the file size.
+ formattedFileSize = NumberFormat.getInstance().format(fileSize) + " " + context.getString(R.string.bytes)
+ }
+ }
+ } finally {
+ // Disconnect the HTTP URL connection.
+ httpUrlConnection.disconnect()
+ }
+ } catch (exception: Exception) {
+ // Set the formatted file size to indicate a bad URL.
+ formattedFileSize = context.getString(R.string.invalid_url)
+ }
+
+ // Return the formatted file size.
+ return formattedFileSize
+ }
+}