tor-commits
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
April 2020
- 25 participants
- 2157 discussions
29 Apr '20
commit 673372c3849ed974485138dc960089010cdf497e
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Wed Sep 4 17:06:54 2019 -0400
set base orbotservice notification icon
---
.../src/main/res/drawable-hdpi/ic_stat_tor.png | Bin 606 -> 1136 bytes
.../src/main/res/drawable-mdpi/ic_stat_tor.png | Bin 389 -> 622 bytes
.../src/main/res/drawable-xhdpi/ic_stat_tor.png | Bin 773 -> 1774 bytes
.../src/main/res/drawable-xxhdpi/ic_stat_tor.png | Bin 1131 -> 3241 bytes
.../src/main/res/drawable-xxxhdpi/ic_stat_tor.png | Bin 1564 -> 3188 bytes
5 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/orbotservice/src/main/res/drawable-hdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-hdpi/ic_stat_tor.png
index 3091474e..af616fc9 100644
Binary files a/orbotservice/src/main/res/drawable-hdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-hdpi/ic_stat_tor.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-mdpi/ic_stat_tor.png
index a10c654d..a2da32e6 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-mdpi/ic_stat_tor.png differ
diff --git a/orbotservice/src/main/res/drawable-xhdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-xhdpi/ic_stat_tor.png
index 25bf4549..3f64c293 100644
Binary files a/orbotservice/src/main/res/drawable-xhdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-xhdpi/ic_stat_tor.png differ
diff --git a/orbotservice/src/main/res/drawable-xxhdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-xxhdpi/ic_stat_tor.png
index fb7bce8a..b006186a 100644
Binary files a/orbotservice/src/main/res/drawable-xxhdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-xxhdpi/ic_stat_tor.png differ
diff --git a/orbotservice/src/main/res/drawable-xxxhdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-xxxhdpi/ic_stat_tor.png
index 32595644..4127c36b 100644
Binary files a/orbotservice/src/main/res/drawable-xxxhdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-xxxhdpi/ic_stat_tor.png differ
1
0
[orbot/master] metadata: replace all goo.gl links with actual URLs
by n8fr8@torproject.org 29 Apr '20
by n8fr8@torproject.org 29 Apr '20
29 Apr '20
commit 8c4de5e900528366e8de700f21194d76e8753f3e
Author: Hans-Christoph Steiner <hans(a)eds.org>
Date: Fri Aug 23 15:54:46 2019 +0200
metadata: replace all goo.gl links with actual URLs
https://twitter.com/3albers/status/1105476763923238912
sed -i 's,http://goo.gl,https://goo.gl,g'
sed -i 's,https://goo.gl/2OA1y,https://guardianproject.info/apps/orbot/,g'
sed -i 's,https://goo.gl/6hni4,https://www.transifex.com/otf/orbot/,g'
sed -i 's,https://goo.gl/8U8BQG,https://play.google.com/store/apps/details?id=info.…'
sed -i 's,https://goo.gl/lgh1p,https://play.google.com/store/apps/details?id=com.du…'
sed -i 's,https://goo.gl/O3FfS,https://play.google.com/store/apps/details?id=info.g…'
sed -i 's,https://goo.gl/PH3T91,https://play.google.com/store/apps/details?id=info.…'
sed -i 's,https://goo.gl/s3mLa,https://play.google.com/store/apps/details?id=info.g…'
---
fastlane/metadata/android/af/full_description.txt | 4 ++--
fastlane/metadata/android/de-DE/full_description.txt | 8 ++++----
fastlane/metadata/android/es-ES/full_description.txt | 8 ++++----
fastlane/metadata/android/fr-FR/full_description.txt | 8 ++++----
fastlane/metadata/android/pt-BR/full_description.txt | 8 ++++----
fastlane/metadata/android/pt-PT/full_description.txt | 8 ++++----
fastlane/metadata/android/tr-TR/full_description.txt | 8 ++++----
fastlane/metadata/android/vi/full_description.txt | 8 ++++----
8 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/fastlane/metadata/android/af/full_description.txt b/fastlane/metadata/android/af/full_description.txt
index bdfb3703..7a657701 100644
--- a/fastlane/metadata/android/af/full_description.txt
+++ b/fastlane/metadata/android/af/full_description.txt
@@ -10,8 +10,8 @@ Orbot is the only app that creates a truly private internet connection. As the N
★ ACCEPT NO SUBSTITUTES: Orbot is the safest way to use the Internet on Android. Period. Orbot bounces your encrypted traffic several times through computers around the world, instead of connecting you directly like VPNs and proxies. This process takes a little longer, but the strongest privacy and identity protection available is worth the wait.
★ PRIVATE WEB SURFING: Use with Orfox, the most anonymous way to access any website, even if it’s normally blocked, monitored, or on the hidden web. Get Orfox: https://play.google.com/store/apps/details?id=info.guardianproject.orfox
-★ PRIVATE CHAT MESSAGING: Use ChatSecure with Orbot to chat confidentially with anyone, anywhere for free. Get ChatSecure: https://goo.gl/O3FfS
-★ PRIVACY FOR APPS: Any installed app can use Tor if it has a proxy feature, using the settings found here: https://goo.gl/2OA1y Use Orbot with Twitter, or try private web searching with DuckDuckGo: https://goo.gl/lgh1p
+★ PRIVATE CHAT MESSAGING: Use ChatSecure with Orbot to chat confidentially with anyone, anywhere for free. Get ChatSecure: https://play.google.com/store/apps/details?id=info.guardianproject.otr.app.…
+★ PRIVACY FOR APPS: Any installed app can use Tor if it has a proxy feature, using the settings found here: https://guardianproject.info/apps/orbot/ Use Orbot with Twitter, or try private web searching with DuckDuckGo: https://play.google.com/store/apps/details?id=com.duckduckgo.mobile.android
★ PRIVACY FOR EVERYONE: Tor can help you confidentially research a competitor, get around the Facebook block at school, or circumvent a firewall to watch sports at work.
★ PRIVACY MADE EASY: Check out our fun, interactive walkthrough: https://guardianproject.info/howto/browsefreely
★ IT’S OFFICIAL: This is the official version of the Tor onion routing service for Android.
diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt
index e0970d3c..3d52a746 100644
--- a/fastlane/metadata/android/de-DE/full_description.txt
+++ b/fastlane/metadata/android/de-DE/full_description.txt
@@ -5,9 +5,9 @@ Orbot ist eine freie Vermittlungsanwendung, welche es anderen Programmen ermögl
Orbot ist die einzige Anwendung, die eine wirklich vertrauliche Internetverbindung herstellt. Wie die New York Times schreibt, »wenn Verbindungen über Tor eintreffen, weiß man nie von wem oder woher sie kommt.« Tor bekam 2012 den Electronic Frontier Foundation (EFF) Pioneer Award.
AKZEPTIEREN SIE KEINE SCHNÜFFLER: Orbot ist der sicherste Weg, um das Internet mit Android zu nutzen. Orbot leitet den verschlüsselten Verkehr mehrmals durch Rechner auf der ganzen Welt, anstatt Sie direkt zu verbinden wie z.B. VPNs und Proxys. Dieser Vorgang dauert ein wenig länger, aber der stärkste Privatsphären- und Identitätsschutz ist das Warten wert.
-PRIVATES INTERNETSURFEN: Nutzen Sie es mit Orweb, der anonymsten Art, eine Webseite zu besuchen, egal ob sie normalerweise geblockt, überwacht, oder versteckt ist. Hier bekommen Sie Orweb: https://goo.gl/s3mLa
-PRIVATE SOFORTNACHRICHTEN: Gibberbot mit Orbot nutzen, um sich vertraulich mit jedem, überall und kostenlos zu unterhalten. Hier bekommen Sie Gibberbot: https://goo.gl/O3FfS
-PRIVATSPHÄRE FÜR ANWENDUNGEN: Jede installierte Anwendung kann Tor benutzen, wenn es eine Vermittlungsfunktion hat und folgende Einstellungen nutzt: https://goo.gl/2OA1y Orbot mit Twitter benutzen, oder die anonyme Internetsuche mit DuckDuckGo: https://goo.gl/lgh1p
+PRIVATES INTERNETSURFEN: Nutzen Sie es mit Orweb, der anonymsten Art, eine Webseite zu besuchen, egal ob sie normalerweise geblockt, überwacht, oder versteckt ist. Hier bekommen Sie Orweb: https://play.google.com/store/apps/details?id=info.guardianproject.browser
+PRIVATE SOFORTNACHRICHTEN: Gibberbot mit Orbot nutzen, um sich vertraulich mit jedem, überall und kostenlos zu unterhalten. Hier bekommen Sie Gibberbot: https://play.google.com/store/apps/details?id=info.guardianproject.otr.app.…
+PRIVATSPHÄRE FÜR ANWENDUNGEN: Jede installierte Anwendung kann Tor benutzen, wenn es eine Vermittlungsfunktion hat und folgende Einstellungen nutzt: https://guardianproject.info/apps/orbot/ Orbot mit Twitter benutzen, oder die anonyme Internetsuche mit DuckDuckGo: https://play.google.com/store/apps/details?id=com.duckduckgo.mobile.android
PRIVATSPHÄRE FÜR JEDEN: Tor kann dabei helfen einen vertraulich über einen Wettbewerber zu recherchieren, die Facebook-Blockade an der Schule oder die Firewall am Arbeitsplatz zu umgehen, um Sport zu gucken.
PRIVATSPHÄRE EINFACH GEMACHT: Unsere witzige und interaktive Führung ansehen: https://guardianproject.info/howto/browsefreely
ES IST OFFIZIELL: Das ist die offizielle Version des Tor-Onion-Routing-Dienstes für Android
@@ -23,4 +23,4 @@ QUELLOFFEN: Orbot ist freie Software. Werfen Sie einen blick auf den Quellcode,
ÜBER TOR: https://TorProject.org
UNS SCHREIBEN: Haben wir eine Funktion vergessen? Haben Sie einen Fehler gefunden? Wir würden uns freuen, von Ihnen zu hören! Senden Sie uns eine E-Mail an: root(a)guardianproject.info
HELFEN SIE UNS ORBOT IN IHR LAND ZU BRINGEN: Wir versuchen Orbot in so viele Sprachen wie möglich zu bringen. Derzeit gibt es folgende Sprachen: Arabic (العربية), Basque (Euskara), Bulgarian (български език), Chinese (中文简体), Czech (Čeština), Danish (Dansk), Dutch (Nederlands), English, Farsi (فارسی), French (Français), French (Français), German (Deutsch), Greek (Ελληνικά), Hebrew (עברית), Hungarian (Magyar Nyelv), Italian (Italiano), Japanese (日本語) Korean (조선말), Latvian (Latviešu), Malaysian (بهاس ملايو ), Polish (Polski), Portuguese (Português), Russian (Русский), Spanish (Español), Swedish (Svensk), and Vietnamese (Tiếng Việt).
-Falls Orbot derzeit nicht in ihrer Sprache verfügbar ist, freuen wir uns, wenn Sie sich unserer Übersetzergruppe anschließen: https://goo.gl/6hni4
+Falls Orbot derzeit nicht in ihrer Sprache verfügbar ist, freuen wir uns, wenn Sie sich unserer Übersetzergruppe anschließen: https://www.transifex.com/otf/orbot/
diff --git a/fastlane/metadata/android/es-ES/full_description.txt b/fastlane/metadata/android/es-ES/full_description.txt
index 845cee80..b07891ff 100644
--- a/fastlane/metadata/android/es-ES/full_description.txt
+++ b/fastlane/metadata/android/es-ES/full_description.txt
@@ -5,9 +5,9 @@ Orbot es una aplicación de proxy libre que da la posibilidad a otras aplicacion
Orbot es la única aplicación que crea una conexión verdaderamente privada a Internet. Como el New York Times escribe, "cuando una comunicación llega desde Tor, nunca puedes saber de dónde o de quién proviene". Tor ganó el Pioneer Award (Premio al Pionero) de 2012 de la Electronic Frontier Foundation (EEF, Fundación para las Fronteras Electrónicas).
NO ACEPTE SUSTITUTOS: Orbot es la manera más segura de usar Internet sobre Android. Punto. Orbot rebota su tráfico cifrado varias veces a través de ordenadores alrededor del mundo, en lugar de conectarlo a usted directamente, como hacen VPNs y proxys. Este proceso es un poco más largo, pero vale la pena la espera para obtener la privacidad y protección de identidad más fuertes disponibles.
-NAVEGACIÓN WEB PRIVADA: Úselo con Orweb, la forma más anónima de acceder a cualquier sitio web, incluso si normalmente está bloqueado, monitorizado, o en la web oculta. Consiga Orweb: http://goo.gl/PH3T91
-MENSAJERIA DE CHAT PRIVADO: Use Gibberbot con Orbot para chatear confidencialmente con cualquiera y en cualquier lugar, gratis. Consiga Gibberbot: http://goo.gl/8U8BQG
-PRIVACIDAD PARA APLICACIONES: Cualquier aplicación instalada puede usar Tor si tiene funciones de proxy, usando las opciones encontradas aquí: https://goo.gl/2OA1y Use Orbot con Twitter, o pruebe la búsqueda web privada con DuckDuckGo: https://goo.gl/lgh1p
+NAVEGACIÓN WEB PRIVADA: Úselo con Orweb, la forma más anónima de acceder a cualquier sitio web, incluso si normalmente está bloqueado, monitorizado, o en la web oculta. Consiga Orweb: https://play.google.com/store/apps/details?id=info.guardianproject.browser
+MENSAJERIA DE CHAT PRIVADO: Use Gibberbot con Orbot para chatear confidencialmente con cualquiera y en cualquier lugar, gratis. Consiga Gibberbot: https://play.google.com/store/apps/details?id=info.guardianproject.otr.app.…
+PRIVACIDAD PARA APLICACIONES: Cualquier aplicación instalada puede usar Tor si tiene funciones de proxy, usando las opciones encontradas aquí: https://guardianproject.info/apps/orbot/ Use Orbot con Twitter, o pruebe la búsqueda web privada con DuckDuckGo: https://play.google.com/store/apps/details?id=com.duckduckgo.mobile.android
PRIVACIDAD PARA TODOS: Tor puede ayudarle a investigar confidencialmente a un competidor, eludir el bloqueo de Facebook en la escuela, o evitar un cortafuegos (`firewall`) para ver deportes en el trabajo.
PRIVACIDAD HECHA FÁCIL: Pruébelo por diversión, paseo interactivo: https://guardianproject.info/howto/browsefreely
@@ -24,4 +24,4 @@ CÓDIGO ABIERTO: Orweb es software libre. Puedes mirar el código fuente o ser p
ACERCA DE TOR: https://TorProject.org
CONTÁCTENOS: ¿Cree que deberíamos añadir una nueva función? ¿Encontró un error? ¡Por favor contáctenos! Envíenos un e-mail a support(a)guardianproject.info
AYÚDENOS A LLEVAR ORBOT A SU PAÍS: Estamos tratando de conseguir Orbot en tantos idiomas como sea posible. En este momento está en: Árabe (العربية), Vasco (Euskara), Búlgaro (български език), Chino (中文简体), Checo (Čeština), Danés (Dansk), Holandés (Nederlands), Inglés (English), Persa (فارسی), Francés (Français), Alemán (Deutsch), Griego (Ελληνικά), Hebreo (עברית), Húngaro (Magyar Nyelv), Italiano, Japonés (日本語) Koreano (조선말), Letón (Latviešu), Malayo (بهاس ملايو ), Polaco (Polski), Portugués (Português), Ruso (Русский), Español, Sueco (Svensk), y Vietnamita (Tiếng Việt).
-Si Orbot no está aún en su idioma, nos encantaría que usted se uniera a nuestro equipo de traducción: https://goo.gl/6hni4
+Si Orbot no está aún en su idioma, nos encantaría que usted se uniera a nuestro equipo de traducción: https://www.transifex.com/otf/orbot/
diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt
index 27ee92da..fddd74e7 100644
--- a/fastlane/metadata/android/fr-FR/full_description.txt
+++ b/fastlane/metadata/android/fr-FR/full_description.txt
@@ -5,9 +5,9 @@ Orbot est un proxy libre et gratuit qui permet à d'autres applications d'accéd
Orbot est la seule application qui crée une connexion à Internet réellement privée. Pour citer le New York Times : « quand une communication arrive par Tor, on ne peut jamais savoir d'où, ou de qui elle vient. ». Tor a gagné le Pioneer Award 2012 de l'Electronic Frontier Foundation (EFF).
REFUSEZ LES PÂLES COPIES : Orbot est la manière la plus sûre d'utiliser Internet sur Android, point à la ligne. Orbot fait rebondir votre trafic chiffré plusieurs fois au travers de différents ordinateurs répartis de par le monde, au lieu de vous connecter directement comme le font les VPN et proxies. Le processus est un peu plus long, mais attendre un peu pour la meilleure protection possible de la vie privée et de votre identité en valent la peine.
-NAVIGATION INTERNET PRIVÉE : Utilisé avec Orweb, Orbot est la manière la plus anonyme d'accéder à n'importe quel site web, même si celui-ci est habituellement bloqué, surveillé ou fait partie du web caché. Téléchargez Orweb : https://goo.gl/s3mLa
-MESSAGERIE INSTANTANÉE PRIVÉE : Utilisez Gibberbot avec Orbot pour discuter en toute confidentialité avec qui que ce soit, où que ce soit, librement et gratuitement. Téléchargez Gibberbot : https://goo.gl/O3FfS
-RENDEZ VOS APPLICATIONS PRIVÉES : Toute application installée peut utiliser Tor si elle est capable d'utiliser un proxy, en utilisant les réglages fournis ici : https://goo.gl/2OA1y Utilisez Orbot avec Twitter ou essayez un moteur de recherche privé comme DuckDuckGo : https://goo.gl/lgh1p
+NAVIGATION INTERNET PRIVÉE : Utilisé avec Orweb, Orbot est la manière la plus anonyme d'accéder à n'importe quel site web, même si celui-ci est habituellement bloqué, surveillé ou fait partie du web caché. Téléchargez Orweb : https://play.google.com/store/apps/details?id=info.guardianproject.browser
+MESSAGERIE INSTANTANÉE PRIVÉE : Utilisez Gibberbot avec Orbot pour discuter en toute confidentialité avec qui que ce soit, où que ce soit, librement et gratuitement. Téléchargez Gibberbot : https://play.google.com/store/apps/details?id=info.guardianproject.otr.app.…
+RENDEZ VOS APPLICATIONS PRIVÉES : Toute application installée peut utiliser Tor si elle est capable d'utiliser un proxy, en utilisant les réglages fournis ici : https://guardianproject.info/apps/orbot/ Utilisez Orbot avec Twitter ou essayez un moteur de recherche privé comme DuckDuckGo : https://play.google.com/store/apps/details?id=com.duckduckgo.mobile.android
LA VIE PRIVÉE POUR TOUS : Tor peut vous aider à vous renseigner confidentiellement sur un concurrent, contourner le blocage de Facebook à l'école ou éviter un parre-feu en entreprise pour regarder les diffusions sportives.
LA VIE PRIVÉE FACILE : Besoin d'aide ? Regardez notre sympathique tutoriel interactif : https://guardianproject.info/howto/browsefreely
OFFICIEL : Orbot est la version officielle du réseau Tor pour Android.
@@ -23,4 +23,4 @@ OPEN-SOURCE : Orbot est un logiciel libre. Jeter un œil à notre code source o
À PROPOS DE TOR: https://TorProject.org
NOUS JOINDRE : Il manque votre fonction préférée ? Vous avez trouvé un bug énervant ? Nous serions ravi d'entendre ce que vous avez à dire ! Envoyez-nous un mail : root(a)guardianproject.info
AIDEZ-NOUS À TRADUIRE ORBOT DANS VOTRE LANGUE : Nous voulons rendre Orbot accessible à autant de pays que possibles.
-Si Orbot n'existe pas encore dans votre langue nous serions ravi de vous voir rejoindre notre équipe de traduction : https://goo.gl/6hni4
+Si Orbot n'existe pas encore dans votre langue nous serions ravi de vous voir rejoindre notre équipe de traduction : https://www.transifex.com/otf/orbot/
diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt
index 81a66df9..7f161446 100644
--- a/fastlane/metadata/android/pt-BR/full_description.txt
+++ b/fastlane/metadata/android/pt-BR/full_description.txt
@@ -5,9 +5,9 @@ Orbot é um aplicativo de proxy livre que permite outras aplicações usarem a i
Orbot é o único aplicativo que cria uma conexão verdadeiramente privada com a internet. Como o New York Times descreveu: "Quando uma comunicação chega a partir da rede Tor, você pode nunca saber de onde ou de quem veio." Tor ganhou em 2012 o prêmio Electronic Frontier Foundation (EFF) Pioneer Award.
NÃO ACEITE NENHUM SUBSTITUTO: Orbot é a forma mais segura de usar a Internet em dispositivos com o sistema operacional Android (Tvs, tablets, celulares e etc ). Anonimato. Orbot permuta seu tráfego criptografado várias vezes entre computadores espalhados geográfica em todo o mundo, em vez de conectá-lo diretamente ao seu destino, assim como fazem as VPNs e proxies. Esse processo demora um pouco mais, mas para ter privacidade e proteção de identidade vale a pena esperar.
-NAVEGAÇÃO WEB PRIVADA: Utilize o Orweb, a maneira mais anônima para acessar qualquer site, mesmo que seja normalmente bloqueado, monitorado, ou um serviço oculto na rede tor. Obtenha o Orweb na seguinte URL: https://goo.gl/s3mLa
-CHAT COM MENSAGENS PRIVADAS: Use o Gibberbot com Orbot para conversar confidencialmente com qualquer um, em qualquer lugar gratuitamente. Obter Gibberbot: https://goo.gl/O3FfS
-PRIVACIDADE PARA APLICATIVOS: Qualquer aplicativo instalado pode usar o Tor se ele tiver a possibilidade de sair por um proxy, usando as configurações encontradas aqui: https://goo.gl/2OA1y Use o Orbot com o Twitter, ou tente pesquisas privadas com DuckDuckGo: https://goo.gl/lgh1p
+NAVEGAÇÃO WEB PRIVADA: Utilize o Orweb, a maneira mais anônima para acessar qualquer site, mesmo que seja normalmente bloqueado, monitorado, ou um serviço oculto na rede tor. Obtenha o Orweb na seguinte URL: https://play.google.com/store/apps/details?id=info.guardianproject.browser
+CHAT COM MENSAGENS PRIVADAS: Use o Gibberbot com Orbot para conversar confidencialmente com qualquer um, em qualquer lugar gratuitamente. Obter Gibberbot: https://play.google.com/store/apps/details?id=info.guardianproject.otr.app.…
+PRIVACIDADE PARA APLICATIVOS: Qualquer aplicativo instalado pode usar o Tor se ele tiver a possibilidade de sair por um proxy, usando as configurações encontradas aqui: https://guardianproject.info/apps/orbot/ Use o Orbot com o Twitter, ou tente pesquisas privadas com DuckDuckGo: https://play.google.com/store/apps/details?id=com.duckduckgo.mobile.android
PRIVACIDADE PARA TODOS: Tor pode ajudá-lo a pesquisar confidencialmente um concorrente, contornar o bloqueio do Facebook na escola, ou contornar um firewall para assistir esportes no trabalho.
UMA FORMA FÁCIL DE TER PRIVACIDADE: Confira a nossa diversão, passo a passo de modo interativo: https://guardianproject.info/howto/browsefreely
É OFICIAL: Esta é uma versão oficial do serviço de roteamento cebola Tor para o Android.
@@ -23,4 +23,4 @@ CÓDIGO ABERTO: Orbot é software livre. Dê uma olhada em nosso código fonte,
SOBRE O PROJETO Tor: https://TorProject.org
MANDE-NOS UMA MENSAGEM: Será que estamos desprezando o seu recurso favorito? Encontrou algum bug chato? Gostaríamos muito de ouvir de você! Envie-nos um e-mail: root(a)guardianproject.info
AJUDE-NO
-Se Orbot ainda não está na sua língua, nós adoraríamos que você participasse da nossa equipe de tradução: https://goo.gl/6hni4
+Se Orbot ainda não está na sua língua, nós adoraríamos que você participasse da nossa equipe de tradução: https://www.transifex.com/otf/orbot/
diff --git a/fastlane/metadata/android/pt-PT/full_description.txt b/fastlane/metadata/android/pt-PT/full_description.txt
index 81a66df9..7f161446 100644
--- a/fastlane/metadata/android/pt-PT/full_description.txt
+++ b/fastlane/metadata/android/pt-PT/full_description.txt
@@ -5,9 +5,9 @@ Orbot é um aplicativo de proxy livre que permite outras aplicações usarem a i
Orbot é o único aplicativo que cria uma conexão verdadeiramente privada com a internet. Como o New York Times descreveu: "Quando uma comunicação chega a partir da rede Tor, você pode nunca saber de onde ou de quem veio." Tor ganhou em 2012 o prêmio Electronic Frontier Foundation (EFF) Pioneer Award.
NÃO ACEITE NENHUM SUBSTITUTO: Orbot é a forma mais segura de usar a Internet em dispositivos com o sistema operacional Android (Tvs, tablets, celulares e etc ). Anonimato. Orbot permuta seu tráfego criptografado várias vezes entre computadores espalhados geográfica em todo o mundo, em vez de conectá-lo diretamente ao seu destino, assim como fazem as VPNs e proxies. Esse processo demora um pouco mais, mas para ter privacidade e proteção de identidade vale a pena esperar.
-NAVEGAÇÃO WEB PRIVADA: Utilize o Orweb, a maneira mais anônima para acessar qualquer site, mesmo que seja normalmente bloqueado, monitorado, ou um serviço oculto na rede tor. Obtenha o Orweb na seguinte URL: https://goo.gl/s3mLa
-CHAT COM MENSAGENS PRIVADAS: Use o Gibberbot com Orbot para conversar confidencialmente com qualquer um, em qualquer lugar gratuitamente. Obter Gibberbot: https://goo.gl/O3FfS
-PRIVACIDADE PARA APLICATIVOS: Qualquer aplicativo instalado pode usar o Tor se ele tiver a possibilidade de sair por um proxy, usando as configurações encontradas aqui: https://goo.gl/2OA1y Use o Orbot com o Twitter, ou tente pesquisas privadas com DuckDuckGo: https://goo.gl/lgh1p
+NAVEGAÇÃO WEB PRIVADA: Utilize o Orweb, a maneira mais anônima para acessar qualquer site, mesmo que seja normalmente bloqueado, monitorado, ou um serviço oculto na rede tor. Obtenha o Orweb na seguinte URL: https://play.google.com/store/apps/details?id=info.guardianproject.browser
+CHAT COM MENSAGENS PRIVADAS: Use o Gibberbot com Orbot para conversar confidencialmente com qualquer um, em qualquer lugar gratuitamente. Obter Gibberbot: https://play.google.com/store/apps/details?id=info.guardianproject.otr.app.…
+PRIVACIDADE PARA APLICATIVOS: Qualquer aplicativo instalado pode usar o Tor se ele tiver a possibilidade de sair por um proxy, usando as configurações encontradas aqui: https://guardianproject.info/apps/orbot/ Use o Orbot com o Twitter, ou tente pesquisas privadas com DuckDuckGo: https://play.google.com/store/apps/details?id=com.duckduckgo.mobile.android
PRIVACIDADE PARA TODOS: Tor pode ajudá-lo a pesquisar confidencialmente um concorrente, contornar o bloqueio do Facebook na escola, ou contornar um firewall para assistir esportes no trabalho.
UMA FORMA FÁCIL DE TER PRIVACIDADE: Confira a nossa diversão, passo a passo de modo interativo: https://guardianproject.info/howto/browsefreely
É OFICIAL: Esta é uma versão oficial do serviço de roteamento cebola Tor para o Android.
@@ -23,4 +23,4 @@ CÓDIGO ABERTO: Orbot é software livre. Dê uma olhada em nosso código fonte,
SOBRE O PROJETO Tor: https://TorProject.org
MANDE-NOS UMA MENSAGEM: Será que estamos desprezando o seu recurso favorito? Encontrou algum bug chato? Gostaríamos muito de ouvir de você! Envie-nos um e-mail: root(a)guardianproject.info
AJUDE-NO
-Se Orbot ainda não está na sua língua, nós adoraríamos que você participasse da nossa equipe de tradução: https://goo.gl/6hni4
+Se Orbot ainda não está na sua língua, nós adoraríamos que você participasse da nossa equipe de tradução: https://www.transifex.com/otf/orbot/
diff --git a/fastlane/metadata/android/tr-TR/full_description.txt b/fastlane/metadata/android/tr-TR/full_description.txt
index c67400e0..d7d29bd7 100644
--- a/fastlane/metadata/android/tr-TR/full_description.txt
+++ b/fastlane/metadata/android/tr-TR/full_description.txt
@@ -5,9 +5,9 @@ Orbot başka uygulamaların interneti daha güvenli olarak kullanmasını sağla
Orbot gerçekten gizli internet bağlantısı kuran tek uygulamadır. New York Times'ın yazdığı gibi “eğer bir mesaj Tor Ağı üzerinden ulaşıyorsa kimden veya nereden geldiğini bilmek mümkün değil”. Tor 2012'de Electronic Frontier Foundation (EFF) Pioneer Award ile ödüllendirilmiştir.
ALTERNATİF KABUL ETMEYİN: Orbot Android sisteminde interneti kullanmanın en güvenli yoludur. Nokta. Orbot doğrudan VPN veya Proxy sunucularına bağlanmaktan farklı olarak şifrelenmiş internet trafiğinizi dünya üzerindeki pek çok başka bilgisayarlardan geçirerek izlenmenizi ve sansürü engeller. Bu yöntem biraz daha zaman alır, ancak en güçlü güvenlik ve gizliliğinizin korunması biraz beklemeye değer.
-İNTERNETTE GİZLİCE DOLAŞIN: Orweb ile birlikte kullanıldığında herhangi bir web sitesi sansürlenmiş, gözetim altında veya gizli internette olsa dahi ulaşmanızı sağlar. Orweb'i şuradan indirebilirsiniz: https://goo.gl/s3mLa
-GİZLİ MESAJLAŞIN: Gibberbot ile birlikte kullanıldığında istediğiniz kişiyle istediğiniz yerde ücretsiz mesajlaşın. Gibberbot'u şuradan indirebilirsiniz: https://goo.gl/O3FfS
-DİĞER UYGULAMAR İÇİN GİZLİLİK: Kullandığınız bütün uygulamalar proxy özellikleri varsa Tor ağını kullanabilir, şuradaki önerileri takip edin: https://goo.gl/2OA1y Orbot'u Twitter uygulaması ile kullanın, ya da gizli web araması yapmak için DuckDuckGo kullanın: https://goo.gl/lgh1p
+İNTERNETTE GİZLİCE DOLAŞIN: Orweb ile birlikte kullanıldığında herhangi bir web sitesi sansürlenmiş, gözetim altında veya gizli internette olsa dahi ulaşmanızı sağlar. Orweb'i şuradan indirebilirsiniz: https://play.google.com/store/apps/details?id=info.guardianproject.browser
+GİZLİ MESAJLAŞIN: Gibberbot ile birlikte kullanıldığında istediğiniz kişiyle istediğiniz yerde ücretsiz mesajlaşın. Gibberbot'u şuradan indirebilirsiniz: https://play.google.com/store/apps/details?id=info.guardianproject.otr.app.…
+DİĞER UYGULAMAR İÇİN GİZLİLİK: Kullandığınız bütün uygulamalar proxy özellikleri varsa Tor ağını kullanabilir, şuradaki önerileri takip edin: https://guardianproject.info/apps/orbot/ Orbot'u Twitter uygulaması ile kullanın, ya da gizli web araması yapmak için DuckDuckGo kullanın: https://play.google.com/store/apps/details?id=com.duckduckgo.mobile.android
HERKES İÇİN GİZLİLİK: Tor rakip şirket hakkında fark edilmeden araştırma yapmanıza, okuldaki Facebook engellemesini aşmanıza, ya da iş yerinizde spor maçlarını izlemek istediğinizde güvenlik duvarını aşmanıza yardımcı olur.
GİZLİLİK HİÇ BU KADAR KOLAY OLMAMIŞTI: Eğlenceli ve interaktif kullanım kılavuzumuza şu adresten ulaşabilirsiniz: https://guardianproject.info/howto/browsefreely
RESMİ UYGULAMA: Orbot Tor onion routing service'in Android'deki resmi uygulamasıdır.
@@ -23,4 +23,4 @@ AÇIK KAYNAK KODU: Orbot ücretsiz bir uygulamadır. Kaynak kodumuza bakabilir,
TOR HAKKINDA: https://TorProject.org
BİZE YAZIN: İstediğiniz bir özellik eksik mi? Uygulamada bir hata mı buldunuz? Lütfen bize bildirin! Sizden geri bildirim almak bizi çok mutlu eder. Bize e-posta gönderebilirsiniz: root(a)guardianproject.info
ORBOT'U SİZİN ÜLKENİZE ULAŞTIRMAMIZA YARDIM EDİN: Orbot uygulamasını mümkün olan tüm dillere çevirmeye çalışıyoruz. Şimdilik bu dillere çevrildi: Arabic (العربية), Basque (Euskara), Bulgarian (български език), Chinese (中文简体), Czech (Čeština), Danish (Dansk), Dutch (Nederlands), English, Farsi (فارسی), French (Français), French (Français), German (Deutsch), Greek (Ελληνικά), Hebrew (עברית), Hungarian (Magyar Nyelv), Italian (Italiano), Japanese (日本語) Korean (조선말), Latvian (Latviešu), Malaysian (بهاس ملايو ), Polish (Polski), Portuguese (Português), Turkish (Türkçe), Russian (Русский), Spanish (Español), Swedish (Svensk), and Vietnamese (Tiếng Việt).
-Eğer Orbot sizin dilinizde yoksa, çeviri ekibimize katılmanız bizi çok mutlu eder: https://goo.gl/6hni4
+Eğer Orbot sizin dilinizde yoksa, çeviri ekibimize katılmanız bizi çok mutlu eder: https://www.transifex.com/otf/orbot/
diff --git a/fastlane/metadata/android/vi/full_description.txt b/fastlane/metadata/android/vi/full_description.txt
index 3a809355..61d63817 100644
--- a/fastlane/metadata/android/vi/full_description.txt
+++ b/fastlane/metadata/android/vi/full_description.txt
@@ -5,9 +5,9 @@ Orbot là một ứng dụng proxy miễn phí nó trao quyền cho các ứng d
Orbot là ứng dụng duy nhất tạo ra một kết nối internet thực sự. Như tờ New York Times viết, "khi một thông tin liên lạc đến từ Tor, bạn có thể không bao giờ biết ở đâu hoặc ai đó từ đâu." Tor giành Electronic Frontier 2012 Foundation (EFF) giải Tiên phong.
CHẤP NHẬN KHÔNG THAY THẾ: Orbot là cách an toàn nhất để sử dụng Internet trên Android. Giai đoạn. Orbot bị trả lại mã hóa giao thông của bạn nhiều lần thông qua các máy tính trên toàn thế giới, thay vì kết nối bạn trực tiếp như VPN và proxy. Quá trình này mất lâu hơn một chút, nhưng sự riêng tư mạnh mẽ và bảo vệ danh tính có sẵn là đáng để chờ đợi.
-CÁ NHÂN LƯỚT WEB: Sử dụng với Orweb, cách vô danh nhất để truy cập bất kỳ trang web, ngay cả khi nó thường bị chặn, theo dõi, hoặc trên các trang web ẩn. Vào Orweb: https://goo.gl/s3mLa
-thông báo chat cá nhân: Sử dụng Gibberbot với Orbot để trò chuyện bí mật với bất cứ ai, bất cứ nơi nào miễn phí. vào Gibberbot: https://goo.gl/O3FfS
-BẢO MẬT cho các ứng dụng: Bất kỳ ứng dụng được cài đặt có thể sử dụng Tor nếu nó có một tính năng proxy, sử dụng các thiết lập tìm thấy ở đây: https://goo.gl/2OA1y Sử dụng Orbot với Twitter, hoặc cố gắng web tin tìm kiếm với DuckDuckGo: https://goo.gl/lgh1p
+CÁ NHÂN LƯỚT WEB: Sử dụng với Orweb, cách vô danh nhất để truy cập bất kỳ trang web, ngay cả khi nó thường bị chặn, theo dõi, hoặc trên các trang web ẩn. Vào Orweb: https://play.google.com/store/apps/details?id=info.guardianproject.browser
+thông báo chat cá nhân: Sử dụng Gibberbot với Orbot để trò chuyện bí mật với bất cứ ai, bất cứ nơi nào miễn phí. vào Gibberbot: https://play.google.com/store/apps/details?id=info.guardianproject.otr.app.…
+BẢO MẬT cho các ứng dụng: Bất kỳ ứng dụng được cài đặt có thể sử dụng Tor nếu nó có một tính năng proxy, sử dụng các thiết lập tìm thấy ở đây: https://guardianproject.info/apps/orbot/ Sử dụng Orbot với Twitter, hoặc cố gắng web tin tìm kiếm với DuckDuckGo: https://play.google.com/store/apps/details?id=com.duckduckgo.mobile.android
BẢO MẬT CHO MỌI NGƯỜI: Tor có thể giúp bạn bảo mật nghiên cứu đối thủ cạnh tranh, có được xung quanh khối Facebook tại trường học, hoặc phá vỡ một bức tường lửa để xem thể thao tại nơi làm việc.
BẢO MẬT MADE EASY: Kiểm tra niềm vui của chúng tôi, thông qua: https://guardianproject.info/howto/browsefreely
Đó là chính thức: Đây là phiên bản chính thức của dịch vụ định tuyến hành Tor cho Android.
@@ -23,4 +23,4 @@ Mở mã nguồn: Orbot là phần mềm miễn phí. Hãy xem mã nguồn của
VỀ DỰ ÁN TOR: https://TorProject.org
THÔNG ĐIỆP : Có phải chúng ta thiếu tính năng yêu thích của bạn? Tìm thấy một lỗi gây phiền nhiễu? Chúng tôi muốn nghe từ bạn! Gửi email cho chúng tôi: root(a)guardianproject.info
Trợ giúp của chúng tôi MANG ORBOT quốc gia của bạn: Chúng tôi đang cố gắng để có được Orbot thành nhiều ngôn ngữ càng tốt. Ngay bây giờ nó trong
-Nếu Orbot không có trong ngôn ngữ của bạn nhưng, chúng tôi rất muốn có bạn tham gia đội ngũ dịch thuật của chúng tôi: https://goo.gl/6hni4
+Nếu Orbot không có trong ngôn ngữ của bạn nhưng, chúng tôi rất muốn có bạn tham gia đội ngũ dịch thuật của chúng tôi: https://www.transifex.com/otf/orbot/
1
0
commit e6ff669828c95a1f645f06e20c88fadfec60ea44
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Wed Sep 4 08:24:02 2019 -0400
improve app-mini onboarding
---
app-mini/build.gradle | 1 +
app-mini/src/debug/AndroidManifest.xml | 4 +-
app-mini/src/main/AndroidManifest.xml | 2 +-
.../torproject/android/mini/MiniMainActivity.java | 356 +++++++++++----------
.../android/mini/ui/AppManagerActivity.java | 50 ++-
.../mini/ui/onboarding/OnboardingActivity.java | 39 +--
.../src/main/res/layout/custom_slide_big_text.xml | 32 +-
app-mini/src/main/res/layout/layout_apps_item.xml | 14 +-
.../src/main/res/layout/layout_apps_listing.xml | 56 ++++
app-mini/src/main/res/layout/layout_main.xml | 19 +-
app-mini/src/main/res/values/colors.xml | 1 +
11 files changed, 309 insertions(+), 265 deletions(-)
diff --git a/app-mini/build.gradle b/app-mini/build.gradle
index 8f071b98..0ffb405d 100644
--- a/app-mini/build.gradle
+++ b/app-mini/build.gradle
@@ -98,6 +98,7 @@ android {
dependencies {
implementation project(':orbotservice')
implementation 'com.github.apl-devs:appintro:v4.2.2'
+ implementation 'com.android.support:palette-v7:28.0.0'
implementation 'com.github.javiersantos:AppUpdater:2.7'
androidTestImplementation "tools.fastlane:screengrab:1.2.0"
}
diff --git a/app-mini/src/debug/AndroidManifest.xml b/app-mini/src/debug/AndroidManifest.xml
index cd6d8b66..b3444211 100644
--- a/app-mini/src/debug/AndroidManifest.xml
+++ b/app-mini/src/debug/AndroidManifest.xml
@@ -77,7 +77,9 @@
<activity
android:name=".ui.AppManagerActivity"
android:label="@string/app_name"
- android:theme="@style/Theme.AppCompat" />
+
+ android:theme="@style/Theme.AppCompat.Light"
+ />
<service
android:name="org.torproject.android.service.TorService"
diff --git a/app-mini/src/main/AndroidManifest.xml b/app-mini/src/main/AndroidManifest.xml
index 94f3f119..18b8a6f2 100644
--- a/app-mini/src/main/AndroidManifest.xml
+++ b/app-mini/src/main/AndroidManifest.xml
@@ -69,7 +69,7 @@
<activity
android:name=".ui.AppManagerActivity"
android:label="@string/app_name"
- android:theme="@style/Theme.AppCompat" />
+ android:theme="@style/Theme.AppCompat.Light" />
<service
android:name="org.torproject.android.service.TorService"
diff --git a/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java b/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java
index 4ab9939a..c495a6a5 100644
--- a/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java
+++ b/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java
@@ -3,6 +3,7 @@
package org.torproject.android.mini;
+import android.Manifest;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.app.AlertDialog;
@@ -13,8 +14,15 @@ import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.drawable.AdaptiveIconDrawable;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
@@ -22,6 +30,9 @@ import android.os.Message;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
+import android.support.v7.graphics.Palette;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SwitchCompat;
import android.support.v7.widget.Toolbar;
import android.text.Html;
@@ -34,6 +45,7 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnLongClickListener;
+import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.widget.Button;
import android.widget.CompoundButton;
@@ -57,6 +69,7 @@ import org.torproject.android.service.TorService;
import org.torproject.android.service.TorServiceConstants;
import org.torproject.android.service.util.Prefs;
import org.torproject.android.service.util.TorServiceUtils;
+import org.torproject.android.service.vpn.TorifiedApp;
import org.torproject.android.service.vpn.VpnConstants;
import org.torproject.android.service.vpn.VpnPrefs;
@@ -68,6 +81,9 @@ import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.NumberFormat;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.Locale;
import java.util.StringTokenizer;
@@ -111,11 +127,9 @@ public class MiniMainActivity extends AppCompatActivity
private static final int MESSAGE_PORTS = 3;
- public final static String INTENT_ACTION_REQUEST_HIDDEN_SERVICE = "org.torproject.android.REQUEST_HS_PORT";
- public final static String INTENT_ACTION_REQUEST_START_TOR = "org.torproject.android.START_TOR";
-
-
+ private RecyclerView rv;
+ ArrayList<String> pkgIds = new ArrayList<>();
/**
* Called when the activity is first created.
@@ -269,23 +283,6 @@ public class MiniMainActivity extends AppCompatActivity
uploadText.setText(formatTotal(0) + " \u2191");
- /**
- mBtnStart =(Button)findViewById(R.id.btnStart);
- mBtnStart.setOnClickListener(new View.OnClickListener()
- {
- @Override
- public void onClick(View v) {
-
- if (torStatus == TorServiceConstants.STATUS_OFF) {
-// lblStatus.setText(getString(R.string.status_starting_up));
- startTor();
- } else {
-// lblStatus.setText(getString(R.string.status_shutting_down));
- stopTor();
- }
- }
- });**/
-
mBtnVPN = (SwitchCompat)findViewById(R.id.btnVPN);
boolean useVPN = Prefs.useVpn();
@@ -304,76 +301,20 @@ public class MiniMainActivity extends AppCompatActivity
});
- }
-
- /**
- private void setCountrySpinner ()
- {
- String currentExit = Prefs.getExitNodes();
- if (currentExit.length() > 4)
- {
- //someone put a complex value in, so let's disable
- ArrayList<String> cList = new ArrayList<String>();
- cList.add(0, currentExit);
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, cList);
- spnCountries.setAdapter(adapter);
- spnCountries.setEnabled(false);
- }
- else {
- int selIdx = -1;
-
- ArrayList<String> cList = new ArrayList<String>();
- cList.add(0, getString(R.string.vpn_default_world));
-
- for (int i = 0; i < COUNTRY_CODES.length; i++) {
- Locale locale = new Locale("", COUNTRY_CODES[i]);
- cList.add(locale.getDisplayCountry());
+ rv = findViewById(R.id.rv);
+ LinearLayoutManager llm = new LinearLayoutManager(this);
+ llm.setOrientation(LinearLayoutManager.VERTICAL);
+ rv.setLayoutManager(llm);
- if (currentExit.contains(COUNTRY_CODES[i]))
- selIdx = i + 1;
+ /**
+ findViewById(R.id.btnAdd).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ startActivityForResult(new Intent(MiniMainActivity.this, AppManagerActivity.class), REQUEST_VPN_APPS_SELECT);
}
+ });**/
+ }
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, cList);
- spnCountries.setAdapter(adapter);
-
- if (selIdx > 0)
- spnCountries.setSelection(selIdx,true);
-
- spnCountries.setOnItemSelectedListener(new OnItemSelectedListener() {
-
- int mOldPosition = spnCountries.getSelectedItemPosition();
-
- @Override
- public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
- // your code here
-
- if (mOldPosition == position)
- return;
-
- mOldPosition = position; //new position!
-
- String country = null;
-
- if (position == 0)
- country = "";
- else
- country = '{' + COUNTRY_CODES[position - 1] + '}';
-
- Intent torService = new Intent(MiniMainActivity.this, TorService.class);
- torService.setAction(TorServiceConstants.CMD_SET_EXIT);
- torService.putExtra("exit", country);
- startService(torService);
-
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> parentView) {
- // your code here
- }
-
- });
- }
- }**/
@Override
protected void attachBaseContext(Context base) {
@@ -552,7 +493,6 @@ public class MiniMainActivity extends AppCompatActivity
} else
stopVpnService();
- addAppShortcuts();
}
@@ -688,9 +628,14 @@ public class MiniMainActivity extends AppCompatActivity
else if (request == REQUEST_VPN_APPS_SELECT)
{
if (response == RESULT_OK &&
- torStatus == TorServiceConstants.STATUS_ON)
+ torStatus == TorServiceConstants.STATUS_ON) {
refreshVPNApps();
+ String newPkgId = data.getStringExtra("package");
+ //add new entry
+
+ }
+
}
IntentResult scanResult = IntentIntegrator.parseActivityResult(request, response, data);
@@ -794,12 +739,19 @@ public class MiniMainActivity extends AppCompatActivity
else
updateStatus(null, torStatus);
- addAppShortcuts();
-
//now you can handle the intents properly
handleIntents();
- }
+ pkgIds.clear();
+ String tordAppString = mPrefs.getString(PREFS_KEY_TORIFIED, "");
+ StringTokenizer st = new StringTokenizer(tordAppString, "|");
+ while (st.hasMoreTokens())
+ pkgIds.add(st.nextToken());
+
+ RVAdapter adapter = new RVAdapter();
+ rv.setAdapter(adapter);
+
+ }
AlertDialog aDialog = null;
@@ -841,7 +793,7 @@ public class MiniMainActivity extends AppCompatActivity
* Update the layout_main UI based on the status of {@link TorService}.
* {@code torServiceMsg} must never be {@code null}
*/
- private synchronized void updateStatus(String torServiceMsg, String newTorStatus) {
+ private void updateStatus(String torServiceMsg, String newTorStatus) {
if (!TextUtils.isEmpty(torServiceMsg))
{
@@ -998,7 +950,6 @@ public class MiniMainActivity extends AppCompatActivity
if (torStatus == null && newTorStatus != null) //first time status
{
- findViewById(R.id.frameMain).setVisibility(View.VISIBLE);
updateStatus(log, newTorStatus);
}
@@ -1077,91 +1028,162 @@ public class MiniMainActivity extends AppCompatActivity
// lblStatus.setText(getString(R.string.newnym));
}
- private void addAppShortcuts() {
-
- LinearLayout llBoxShortcuts = findViewById(R.id.frameMain);
-
- PackageManager pMgr = getPackageManager();
-
- llBoxShortcuts.removeAllViews();
-
-
- if (Prefs.useVpn()) {
- ArrayList<String> pkgIds = new ArrayList<>();
- String tordAppString = mPrefs.getString(PREFS_KEY_TORIFIED, "");
-
- if (TextUtils.isEmpty(tordAppString)) {
- addFullDeviceVpnView(llBoxShortcuts);
- } else {
- StringTokenizer st = new StringTokenizer(tordAppString, "|");
- while (st.hasMoreTokens() && pkgIds.size() < 4)
- pkgIds.add(st.nextToken());
- int appsAdded = 0;
- for (final String pkgId : pkgIds) {
- try {
- ApplicationInfo aInfo = getPackageManager().getApplicationInfo(pkgId, 0);
- // skip disabled packages
- if (!aInfo.enabled) continue;
- ImageView iv = new ImageView(this);
- LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- params.setMargins(3, 3, 3, 3);
- iv.setLayoutParams(params);
- iv.setImageDrawable(pMgr.getApplicationIcon(pkgId));
-
- iv.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- openBrowser(URL_TOR_CHECK, false, pkgId);
- }
- });
-
- llBoxShortcuts.addView(iv);
- appsAdded++;
- } catch (Exception e) {
- //package not installed?
+
+ public class RVAdapter extends RecyclerView.Adapter<RVAdapter.AppViewHolder>{
+
+
+ public class AppViewHolder extends RecyclerView.ViewHolder {
+
+ ImageView iv;
+ TextView tv;
+ View parent;
+
+ AppViewHolder(View itemView) {
+ super(itemView);
+ parent = itemView;
+ iv = itemView.findViewById(R.id.itemicon);
+ tv = itemView.findViewById(R.id.itemtext);
+
+ }
+
+ }
+
+ @Override
+ public int getItemCount() {
+
+ return pkgIds.size()+1;
+ }
+
+ @Override
+ public AppViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
+
+ View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_apps_listing, viewGroup, false);
+ final AppViewHolder avh = new AppViewHolder(v);
+
+
+
+ return avh;
+ }
+
+ @Override
+ public void onBindViewHolder(final AppViewHolder avh, int i) {
+
+
+ if (i < getItemCount()-1) {
+ String pkgId = pkgIds.get(i);
+
+ ApplicationInfo aInfo = null;
+ try {
+ aInfo = getPackageManager().getApplicationInfo(pkgId, 0);
+ TorifiedApp app = getApp(aInfo);
+
+ avh.tv.setText(app.getName());
+ avh.iv.setImageDrawable(app.getIcon());
+
+ Palette.generateAsync(drawableToBitmap(app.getIcon()), new Palette.PaletteAsyncListener() {
+ public void onGenerated(Palette palette) {
+ // Do something with colors...
+
+ int color = palette.getVibrantColor(0x000000);
+ avh.parent.setBackgroundColor(color);
+
}
- }
- if (appsAdded == 0) {
+ });
- addFullDeviceVpnView(llBoxShortcuts);
- }
+ avh.iv.setVisibility(View.VISIBLE);
+
+ avh.parent.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+
+
+ }
+ });
+ } catch (NameNotFoundException e) {
+ e.printStackTrace();
}
}
else
{
- TextView tv = new TextView(this);
- LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- params.setMargins(12, 3, 3, 3);
- tv.setLayoutParams(params);
- tv.setText(R.string.vpn_disabled);
- llBoxShortcuts.addView(tv);
+ avh.iv.setVisibility(View.INVISIBLE);
+ avh.tv.setText("+ ADD APP");
+ avh.parent.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+
+ showAppPicker();
+
+ }
+ });
}
+ }
+
+ private TorifiedApp getApp (ApplicationInfo aInfo)
+ {
+ TorifiedApp app = new TorifiedApp();
- //now add app edit/add shortcut
- ImageView iv = new ImageView(this);
- LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- params.setMargins(3, 3, 3, 3);
- iv.setLayoutParams(params);
- iv.setImageDrawable(getResources().getDrawable(R.drawable.ic_settings_white_24dp));
- llBoxShortcuts.addView(iv);
- iv.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- startActivityForResult(new Intent(MiniMainActivity.this, AppManagerActivity.class), REQUEST_VPN_APPS_SELECT);
- }
- });
+ try
+ {
+ app.setName(getPackageManager().getApplicationLabel(aInfo).toString());
+ }
+ catch (Exception e)
+ {
+ return null;
+ }
+
+
+ app.setEnabled(aInfo.enabled);
+ app.setUid(aInfo.uid);
+ app.setUsername(getPackageManager().getNameForUid(app.getUid()));
+ app.setProcname(aInfo.processName);
+ app.setPackageName(aInfo.packageName);
+
+ app.setTorified(true);
+
+ try {
+ app.setIcon(getPackageManager().getApplicationIcon(app.getPackageName()));
+
+
+ } catch (NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ return app;
+ }
+
}
- private void addFullDeviceVpnView(LinearLayout llBoxShortcuts) {
- TextView tv = new TextView(this);
- LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- params.setMargins(12, 3, 3, 3);
- tv.setLayoutParams(params);
- tv.setText(R.string.full_device_vpn);
- llBoxShortcuts.addView(tv);
+ public void showAppPicker ()
+ {
+ startActivityForResult(new Intent(MiniMainActivity.this, AppManagerActivity.class), REQUEST_VPN_APPS_SELECT);
+
+ }
+
+
+
+ public static Bitmap drawableToBitmap (Drawable drawable) {
+ Bitmap bitmap = null;
+
+ if (drawable instanceof BitmapDrawable) {
+ BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
+ if(bitmapDrawable.getBitmap() != null) {
+ return bitmapDrawable.getBitmap();
+ }
+ }
+
+ if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
+ bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel
+ } else {
+ bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
+ }
+
+ Canvas canvas = new Canvas(bitmap);
+ drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+ drawable.draw(canvas);
+ return bitmap;
}
+
}
diff --git a/app-mini/src/main/java/org/torproject/android/mini/ui/AppManagerActivity.java b/app-mini/src/main/java/org/torproject/android/mini/ui/AppManagerActivity.java
index 5c61db99..30a43779 100644
--- a/app-mini/src/main/java/org/torproject/android/mini/ui/AppManagerActivity.java
+++ b/app-mini/src/main/java/org/torproject/android/mini/ui/AppManagerActivity.java
@@ -56,7 +56,7 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
pMgr = getPackageManager();
this.setContentView(R.layout.layout_apps);
- setTitle(R.string.apps_mode);
+ setTitle("");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
listApps = findViewById(R.id.applistview);
progressBar = findViewById(R.id.progressBar);
@@ -126,18 +126,15 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
if (mApps == null)
mApps = getApps(prefs);
+ /**
Collections.sort(mApps,new Comparator<TorifiedApp>() {
public int compare(TorifiedApp o1, TorifiedApp o2) {
- /* Some apps start with lowercase letters and without the sorting being case
- insensitive they'd appear at the end of the grid of apps, a position where users
- would likely not expect to find them.
- */
if (o1.isTorified() == o2.isTorified())
return o1.getName().compareToIgnoreCase(o2.getName());
if (o1.isTorified()) return -1;
return 1;
}
- });
+ });**/
final LayoutInflater inflater = getLayoutInflater();
@@ -157,7 +154,6 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
// Inflate a new view
entry = new ListEntry();
entry.icon = convertView.findViewById(R.id.itemicon);
- entry.box = convertView.findViewById(R.id.itemcheck);
entry.text = convertView.findViewById(R.id.itemtext);
convertView.setTag(entry);
}
@@ -169,7 +165,7 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
try {
entry.icon.setImageDrawable(pMgr.getApplicationIcon(app.getPackageName()));
entry.icon.setOnClickListener(AppManagerActivity.this);
- entry.icon.setTag(entry.box);
+ entry.icon.setTag(app);
}
catch (Exception e)
{
@@ -179,14 +175,17 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
if (entry.text != null) {
entry.text.setText(app.getName());
- entry.text.setOnClickListener(AppManagerActivity.this);
- entry.text.setTag(entry.box);
}
- if (entry.box != null) {
- entry.box.setOnClickListener(AppManagerActivity.this);
- entry.box.setChecked(app.isTorified());
- entry.box.setTag(app);
+ if (app.isTorified())
+ {
+ convertView.setBackgroundColor(getResources().getColor(R.color.dark_purple));
+
+ }
+ else
+ {
+ convertView.setBackgroundColor(getResources().getColor(android.R.color.transparent));
+
}
return convertView;
@@ -197,7 +196,6 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
}
private static class ListEntry {
- private CheckBox box;
private TextView text;
private ImageView icon;
}
@@ -323,21 +321,19 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
public void onClick(View v) {
- CheckBox cbox = null;
+ final TorifiedApp app = (TorifiedApp) v.getTag();
+ if (app != null) {
+ app.setTorified(!app.isTorified());
- if (v instanceof CheckBox)
- cbox = (CheckBox)v;
- else if (v.getTag() instanceof CheckBox)
- cbox = (CheckBox)v.getTag();
-
- if (cbox != null) {
- final TorifiedApp app = (TorifiedApp) cbox.getTag();
- if (app != null) {
- app.setTorified(!app.isTorified());
- cbox.setChecked(app.isTorified());
- }
+ Intent data = new Intent();
+ data.putExtra("package",app.getPackageName());
+ setResult(RESULT_OK,data);
saveAppSettings();
+
+ finish();
}
+
+
}
}
diff --git a/app-mini/src/main/java/org/torproject/android/mini/ui/onboarding/OnboardingActivity.java b/app-mini/src/main/java/org/torproject/android/mini/ui/onboarding/OnboardingActivity.java
index 7a2f6d25..1c1b9927 100644
--- a/app-mini/src/main/java/org/torproject/android/mini/ui/onboarding/OnboardingActivity.java
+++ b/app-mini/src/main/java/org/torproject/android/mini/ui/onboarding/OnboardingActivity.java
@@ -1,18 +1,14 @@
package org.torproject.android.mini.ui.onboarding;
import android.content.Context;
-import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
-import android.view.View;
import com.github.paolorotolo.appintro.AppIntro;
import org.torproject.android.mini.R;
import org.torproject.android.mini.settings.LocaleHelper;
-import org.torproject.android.mini.ui.AppManagerActivity;
-import org.torproject.android.mini.vpn.VPNEnableActivity;
public class OnboardingActivity extends AppIntro {
@@ -23,43 +19,18 @@ public class OnboardingActivity extends AppIntro {
// Instead of fragments, you can also use our default slide
// Just set a title, description, background and image. AppIntro will do the rest.
CustomSlideBigText welcome = CustomSlideBigText.newInstance(R.layout.custom_slide_big_text);
- welcome.setTitle(getString(R.string.hello));
- welcome.setSubTitle(getString(R.string.welcome));
+ welcome.setTitle("The power of tor made simple for your life");
+ welcome.setSubTitle("orbot mini");
addSlide(welcome);
CustomSlideBigText intro2 = CustomSlideBigText.newInstance(R.layout.custom_slide_big_text);
- intro2.setTitle(getString(R.string.browser_the_internet));
- intro2.setSubTitle(getString(R.string.no_tracking));
+ intro2.setTitle("unblock any app with a few taps");
+ intro2.setSubTitle("so easy");
addSlide(intro2);
- CustomSlideBigText cs2 = CustomSlideBigText.newInstance(R.layout.custom_slide_big_text);
- cs2.setTitle(getString(R.string.bridges_sometimes));
- cs2.showButton(getString(R.string.action_more), new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- startActivity(new Intent(OnboardingActivity.this,BridgeWizardActivity.class));
- }
- });
- addSlide(cs2);
-
- CustomSlideBigText cs3 = CustomSlideBigText.newInstance(R.layout.custom_slide_big_text);
- cs3.setTitle(getString(R.string.vpn_setup));
- cs3.setSubTitle(getString(R.string.vpn_setup_sub));
- cs3.showButton(getString(R.string.action_vpn_choose), new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- startActivity(new Intent(OnboardingActivity.this, VPNEnableActivity.class));
- startActivityForResult(new Intent(OnboardingActivity.this, AppManagerActivity.class), 9999);
-
- }
- });
- addSlide(cs3);
-
-
-
// OPTIONAL METHODS
// Override bar/separator color.
- setBarColor(getResources().getColor(R.color.dark_purple));
+ setBarColor(getResources().getColor(R.color.dark_green));
setSeparatorColor(getResources().getColor(R.color.panel_background_main));
// Hide Skip/Done button.
diff --git a/app-mini/src/main/res/layout/custom_slide_big_text.xml b/app-mini/src/main/res/layout/custom_slide_big_text.xml
index 100392e6..39f5486a 100644
--- a/app-mini/src/main/res/layout/custom_slide_big_text.xml
+++ b/app-mini/src/main/res/layout/custom_slide_big_text.xml
@@ -2,33 +2,34 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:gravity="center"
android:orientation="vertical"
- android:background="@color/dark_purple"
+ android:gravity="center_vertical"
+ android:background="@color/dark_green"
>
<TextView
- android:id="@+id/custom_slide_big_text"
+ android:id="@+id/custom_slide_big_text_sub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text=""
+ android:text="okay cool"
android:textColor="@color/panel_background_main"
- android:gravity="center"
- android:layout_margin="12dp"
+ android:layout_gravity="start"
+ android:layout_marginLeft="36dp"
android:textStyle="bold"
- android:textSize="28sp"/>
+ android:textSize="16sp"
+ android:visibility="gone"
+ />
<TextView
- android:id="@+id/custom_slide_big_text_sub"
+ android:id="@+id/custom_slide_big_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text=""
+ android:text="This is the big text"
android:textColor="@color/panel_background_main"
- android:gravity="center"
- android:layout_margin="12dp"
+ android:gravity="start"
+ android:layout_margin="36dp"
android:textStyle="bold"
- android:textSize="16sp"
- android:visibility="gone"
- />
+ android:textSize="52sp"/>
+
<Button
android:id="@+id/custom_slide_button"
@@ -37,7 +38,8 @@
android:layout_margin="10dp"
android:background="@drawable/round_drawable"
android:textColor="@color/panel_background_main"
+ android:text="button"
+ android:layout_gravity="end"
android:visibility="gone"
-
/>
</LinearLayout>
\ No newline at end of file
diff --git a/app-mini/src/main/res/layout/layout_apps_item.xml b/app-mini/src/main/res/layout/layout_apps_item.xml
index ef188b3e..b9fac8c4 100644
--- a/app-mini/src/main/res/layout/layout_apps_item.xml
+++ b/app-mini/src/main/res/layout/layout_apps_item.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="90dp"
- android:layout_height="90dp"
+ android:layout_width="80dp"
+ android:layout_height="70dp"
android:gravity="center_horizontal"
- android:orientation="vertical">
+ android:orientation="vertical"
+ android:layout_marginTop="10dp"
+ >
<ImageView
android:id="@+id/itemicon"
@@ -22,12 +24,8 @@
android:scrollHorizontally="false"
android:text="uid:packages"
android:textAlignment="center"
- android:textSize="12sp" />
+ android:textSize="10sp" />
- <CheckBox
- android:id="@+id/itemcheck"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
</LinearLayout>
diff --git a/app-mini/src/main/res/layout/layout_apps_listing.xml b/app-mini/src/main/res/layout/layout_apps_listing.xml
new file mode 100644
index 00000000..d47126b4
--- /dev/null
+++ b/app-mini/src/main/res/layout/layout_apps_listing.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="80dp"
+ android:orientation="horizontal"
+ android:layout_marginLeft="20dp"
+ android:layout_marginRight="20dp"
+
+ android:layout_marginTop="20dp"
+
+ android:background="@color/med_gray"
+ android:padding="10dp"
+ android:gravity="center_vertical"
+ >
+
+ <ImageView
+ android:id="@+id/itemicon"
+ android:layout_width="40dp"
+ android:layout_height="40dp"
+ android:src="@mipmap/ic_launcher"
+ />
+
+ <TextView
+ android:id="@+id/itemtext"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:gravity="center_horizontal|center_vertical"
+ android:maxLines="2"
+ android:minLines="2"
+ android:scrollHorizontally="false"
+ android:text="app name"
+ android:textAlignment="center"
+ android:layout_marginLeft="18dp"
+ android:textSize="18sp"
+ android:textColor="@color/light_gray"
+ android:textStyle="bold"
+ />
+
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:gravity="center_horizontal|center_vertical|right"
+ android:maxLines="2"
+ android:minLines="2"
+ android:scrollHorizontally="false"
+ android:text=">"
+ android:textAlignment="center"
+ android:layout_marginLeft="18dp"
+ android:textSize="24sp" />
+
+</LinearLayout>
+
diff --git a/app-mini/src/main/res/layout/layout_main.xml b/app-mini/src/main/res/layout/layout_main.xml
index d4422fa2..d8fbfce6 100644
--- a/app-mini/src/main/res/layout/layout_main.xml
+++ b/app-mini/src/main/res/layout/layout_main.xml
@@ -22,19 +22,13 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="250dp"
- android:id="@+id/frameMain"any
- android:visibility="visible"
- android:orientation="vertical"
- android:layout_alignParentLeft="true"
- android:layout_alignParentStart="true"
- android:layout_margin="3dp"
- android:weightSum="1">
-
- </LinearLayout>
+<android.support.v7.widget.RecyclerView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/rv"
+ android:layout_marginBottom="60dp"
+ />
@@ -46,6 +40,7 @@
android:orientation="vertical"
android:id="@+id/controls"
android:layout_alignParentBottom="true"
+ android:background="@color/light_gray"
>
diff --git a/app-mini/src/main/res/values/colors.xml b/app-mini/src/main/res/values/colors.xml
index dcbbcd60..4a7a1e37 100644
--- a/app-mini/src/main/res/values/colors.xml
+++ b/app-mini/src/main/res/values/colors.xml
@@ -7,5 +7,6 @@
<color name="light_purple">#E6CCFF</color>
<color name="light_green">#E1FFC0</color>
<color name="light_gray">#EFEFEF</color>
+ <color name="med_gray">#BCBCBC</color>
</resources>
1
0
commit 285d77e9e337e2ea5a53421411b5f989a3768fda
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Wed Sep 4 11:45:39 2019 -0400
implement app configuration screens
---
app-mini/build.gradle | 6 +-
app-mini/src/main/AndroidManifest.xml | 92 +++++++++--------
.../torproject/android/mini/MiniMainActivity.java | 64 +++++++-----
.../android/mini/ui/AppConfigActivity.java | 102 +++++++++++++++++++
.../android/mini/ui/AppManagerActivity.java | 21 +---
.../mini/ui/onboarding/OnboardingActivity.java | 8 +-
.../src/main/res/layout/activity_app_config.xml | 26 +++++
.../src/main/res/layout/content_app_config.xml | 111 +++++++++++++++++++++
app-mini/src/main/res/menu/app_config.xml | 32 ++++++
app-mini/src/main/res/values/strings.xml | 15 ++-
app-mini/src/main/res/values/styles.xml | 5 +
11 files changed, 380 insertions(+), 102 deletions(-)
diff --git a/app-mini/build.gradle b/app-mini/build.gradle
index 0ffb405d..ea8a8d22 100644
--- a/app-mini/build.gradle
+++ b/app-mini/build.gradle
@@ -11,7 +11,7 @@ def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
- signingConfigs {
+ signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
@@ -100,11 +100,12 @@ dependencies {
implementation 'com.github.apl-devs:appintro:v4.2.2'
implementation 'com.android.support:palette-v7:28.0.0'
implementation 'com.github.javiersantos:AppUpdater:2.7'
+ implementation 'com.android.support.constraint:constraint-layout:1.1.3'
androidTestImplementation "tools.fastlane:screengrab:1.2.0"
}
// Map for the version code that gives each ABI a value.
-ext.abiCodes = ['armeabi-v7a':'1', 'arm64-v8a':'2', 'mips':'3', 'x86':'4', 'x86_64':'5']
+ext.abiCodes = ['armeabi-v7a': '1', 'arm64-v8a': '2', 'mips': '3', 'x86': '4', 'x86_64': '5']
import com.android.build.OutputFile
@@ -119,4 +120,3 @@ android.applicationVariants.all { variant ->
}
}
}
-
diff --git a/app-mini/src/main/AndroidManifest.xml b/app-mini/src/main/AndroidManifest.xml
index 18b8a6f2..23db19d7 100644
--- a/app-mini/src/main/AndroidManifest.xml
+++ b/app-mini/src/main/AndroidManifest.xml
@@ -4,16 +4,6 @@
package="org.torproject.android.mini"
android:installLocation="internalOnly">
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
- <!-- Some Chromebooks don't support touch. Although not essential,
- it's a good idea to explicitly include this declaration. -->
- <uses-feature android:name="android.hardware.touchscreen"
- android:required="false" />
-
<application
android:name=".OrbotMiniApp"
android:allowBackup="false"
@@ -24,8 +14,10 @@
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/DefaultTheme"
- tools:replace="android:allowBackup"
- >
+ tools:replace="android:allowBackup">
+ <activity
+ android:name=".ui.AppConfigActivity"
+ android:label="@string/title_activity_app_config"></activity>
<activity
android:name=".MiniMainActivity"
android:excludeFromRecents="false"
@@ -43,11 +35,10 @@
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="bridge" />
- </intent-filter>-->
-
- </activity>
+ </intent-filter>
+ -->
- <!-- This is for ensuring the background service still runs when/if the app is swiped away -->
+ </activity> <!-- This is for ensuring the background service still runs when/if the app is swiped away -->
<activity
android:name="org.torproject.android.service.util.DummyActivity"
android:allowTaskReparenting="true"
@@ -71,20 +62,18 @@
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light" />
- <service
- android:name="org.torproject.android.service.TorService"
- android:enabled="true"
- android:permission="android.permission.BIND_VPN_SERVICE"
- android:stopWithTask="false"></service>
- <service
- android:name="org.torproject.android.service.vpn.TorVpnService"
- android:enabled="true"
- android:permission="android.permission.BIND_VPN_SERVICE">
- <intent-filter>
- <action android:name="android.net.VpnService" />
- </intent-filter>
- </service>
+ <activity android:name=".ui.onboarding.OnboardingActivity" />
+ <activity android:name=".ui.onboarding.BridgeWizardActivity" />
+ <provider
+ android:name="android.support.v4.content.FileProvider"
+ android:authorities="org.torproject.android.mini.ui.hiddenservices.storage"
+ android:exported="false"
+ android:grantUriPermissions="true">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/hidden_services_paths" />
+ </provider>
<receiver
android:name="org.torproject.android.service.StartTorReceiver"
android:exported="true">
@@ -92,6 +81,7 @@
<action android:name="org.torproject.android.intent.action.START" />
</intent-filter>
</receiver>
+
<receiver
android:name=".OnBootReceiver"
android:enabled="true"
@@ -113,25 +103,33 @@
</intent-filter>
</receiver>
+ <service
+ android:name="org.torproject.android.service.TorService"
+ android:enabled="true"
+ android:permission="android.permission.BIND_VPN_SERVICE"
+ android:stopWithTask="false" />
+ <service
+ android:name="org.torproject.android.service.vpn.TorVpnService"
+ android:enabled="true"
+ android:permission="android.permission.BIND_VPN_SERVICE">
+ <intent-filter>
+ <action android:name="android.net.VpnService" />
+ </intent-filter>
+ </service>
+ </application>
+ <uses-feature
+ android:name="android.hardware.touchscreen"
+ android:required="false" />
+ <!--
+ Some Chromebooks don't support touch. Although not essential,
+ it's a good idea to explicitly include this declaration.
+ -->
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+ <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+ <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
+ <uses-permission android:name="android.permission.INTERNET" />
-
- <provider
- android:name="android.support.v4.content.FileProvider"
- android:authorities="org.torproject.android.mini.ui.hiddenservices.storage"
- android:exported="false"
- android:grantUriPermissions="true">
- <meta-data
- android:name="android.support.FILE_PROVIDER_PATHS"
- android:resource="@xml/hidden_services_paths" />
- </provider>
-
-
-
- <activity android:name=".ui.onboarding.OnboardingActivity"/>
- <activity android:name=".ui.onboarding.BridgeWizardActivity"/>
-
-
- </application>
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
</manifest>
\ No newline at end of file
diff --git a/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java b/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java
index c495a6a5..e6f33ba0 100644
--- a/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java
+++ b/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java
@@ -60,6 +60,7 @@ import org.json.JSONArray;
import org.torproject.android.mini.settings.Languages;
import org.torproject.android.mini.settings.LocaleHelper;
import org.torproject.android.mini.settings.SettingsPreferences;
+import org.torproject.android.mini.ui.AppConfigActivity;
import org.torproject.android.mini.ui.AppManagerActivity;
import org.torproject.android.mini.ui.Rotate3dAnimation;
import org.torproject.android.mini.ui.onboarding.OnboardingActivity;
@@ -631,7 +632,7 @@ public class MiniMainActivity extends AppCompatActivity
torStatus == TorServiceConstants.STATUS_ON) {
refreshVPNApps();
- String newPkgId = data.getStringExtra("package");
+ String newPkgId = data.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
//add new entry
}
@@ -1070,12 +1071,12 @@ public class MiniMainActivity extends AppCompatActivity
if (i < getItemCount()-1) {
- String pkgId = pkgIds.get(i);
+ final String pkgId = pkgIds.get(i);
ApplicationInfo aInfo = null;
try {
aInfo = getPackageManager().getApplicationInfo(pkgId, 0);
- TorifiedApp app = getApp(aInfo);
+ TorifiedApp app = getApp(MiniMainActivity.this, aInfo);
avh.tv.setText(app.getName());
avh.iv.setImageDrawable(app.getIcon());
@@ -1096,6 +1097,7 @@ public class MiniMainActivity extends AppCompatActivity
@Override
public void onClick(View v) {
+ showAppConfig(pkgId);
}
});
@@ -1118,49 +1120,57 @@ public class MiniMainActivity extends AppCompatActivity
}
}
- private TorifiedApp getApp (ApplicationInfo aInfo)
- {
- TorifiedApp app = new TorifiedApp();
+ }
+ public static TorifiedApp getApp (Context context, ApplicationInfo aInfo)
+ {
+ TorifiedApp app = new TorifiedApp();
+ PackageManager pMgr = context.getPackageManager();
- try
- {
- app.setName(getPackageManager().getApplicationLabel(aInfo).toString());
- }
- catch (Exception e)
- {
- return null;
- }
+ try
+ {
+ app.setName(pMgr.getApplicationLabel(aInfo).toString());
+ }
+ catch (Exception e)
+ {
+ return null;
+ }
- app.setEnabled(aInfo.enabled);
- app.setUid(aInfo.uid);
- app.setUsername(getPackageManager().getNameForUid(app.getUid()));
- app.setProcname(aInfo.processName);
- app.setPackageName(aInfo.packageName);
- app.setTorified(true);
+ app.setEnabled(aInfo.enabled);
+ app.setUid(aInfo.uid);
+ app.setUsername(pMgr.getNameForUid(app.getUid()));
+ app.setProcname(aInfo.processName);
+ app.setPackageName(aInfo.packageName);
- try {
- app.setIcon(getPackageManager().getApplicationIcon(app.getPackageName()));
+ app.setTorified(true);
+ try {
+ app.setIcon(pMgr.getApplicationIcon(app.getPackageName()));
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- }
- return app;
- }
+ } catch (NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ return app;
}
+
public void showAppPicker ()
{
startActivityForResult(new Intent(MiniMainActivity.this, AppManagerActivity.class), REQUEST_VPN_APPS_SELECT);
}
+ public void showAppConfig (String pkgId)
+ {
+ Intent data = new Intent(this, AppConfigActivity.class);
+ data.putExtra(Intent.EXTRA_PACKAGE_NAME,pkgId);
+ startActivity(data);
+ }
public static Bitmap drawableToBitmap (Drawable drawable) {
diff --git a/app-mini/src/main/java/org/torproject/android/mini/ui/AppConfigActivity.java b/app-mini/src/main/java/org/torproject/android/mini/ui/AppConfigActivity.java
new file mode 100644
index 00000000..f4dcc6c6
--- /dev/null
+++ b/app-mini/src/main/java/org/torproject/android/mini/ui/AppConfigActivity.java
@@ -0,0 +1,102 @@
+package org.torproject.android.mini.ui;
+
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.ApplicationInfo;
+import android.os.Bundle;
+import android.support.design.widget.FloatingActionButton;
+import android.support.design.widget.Snackbar;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+
+import org.torproject.android.mini.MiniMainActivity;
+import org.torproject.android.mini.R;
+import org.torproject.android.service.util.TorServiceUtils;
+import org.torproject.android.service.vpn.TorifiedApp;
+
+import static org.torproject.android.mini.MiniMainActivity.getApp;
+import static org.torproject.android.service.vpn.VpnPrefs.PREFS_KEY_TORIFIED;
+
+public class AppConfigActivity extends AppCompatActivity {
+
+ TorifiedApp mApp;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_app_config);
+ Toolbar toolbar = findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+ String pkgId = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME);
+
+ ApplicationInfo aInfo = null;
+ try {
+ aInfo = getPackageManager().getApplicationInfo(pkgId, 0);
+ mApp = getApp(this, aInfo);
+
+ getSupportActionBar().setIcon(mApp.getIcon());
+
+ setTitle(mApp.getName());
+ }
+ catch (Exception e){}
+
+ }
+
+
+ private void removeApp ()
+ {
+ mApp.setTorified(false);
+
+ SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
+
+ String tordAppString = prefs.getString(PREFS_KEY_TORIFIED, "");
+
+ tordAppString = tordAppString.replace(mApp.getPackageName()+"|","");
+
+ SharedPreferences.Editor edit = prefs.edit();
+ edit.putString(PREFS_KEY_TORIFIED, tordAppString);
+ edit.commit();
+
+ Intent response = new Intent();
+ setResult(RESULT_OK,response);
+
+ finish();
+ }
+
+ /*
+ * Create the UI Options Menu (non-Javadoc)
+ * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
+ */
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.app_config, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+
+ if (item.getItemId() == android.R.id.home) {
+ finish();
+ return true;
+ }
+ else if (item.getItemId() == R.id.menu_remove_app) {
+ removeApp();
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+
+
+
+}
diff --git a/app-mini/src/main/java/org/torproject/android/mini/ui/AppManagerActivity.java b/app-mini/src/main/java/org/torproject/android/mini/ui/AppManagerActivity.java
index 30a43779..ea66d7f2 100644
--- a/app-mini/src/main/java/org/torproject/android/mini/ui/AppManagerActivity.java
+++ b/app-mini/src/main/java/org/torproject/android/mini/ui/AppManagerActivity.java
@@ -126,15 +126,6 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
if (mApps == null)
mApps = getApps(prefs);
- /**
- Collections.sort(mApps,new Comparator<TorifiedApp>() {
- public int compare(TorifiedApp o1, TorifiedApp o2) {
- if (o1.isTorified() == o2.isTorified())
- return o1.getName().compareToIgnoreCase(o2.getName());
- if (o1.isTorified()) return -1;
- return 1;
- }
- });**/
final LayoutInflater inflater = getLayoutInflater();
@@ -177,16 +168,6 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
entry.text.setText(app.getName());
}
- if (app.isTorified())
- {
- convertView.setBackgroundColor(getResources().getColor(R.color.dark_purple));
-
- }
- else
- {
- convertView.setBackgroundColor(getResources().getColor(android.R.color.transparent));
-
- }
return convertView;
}
@@ -327,7 +308,7 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
Intent data = new Intent();
- data.putExtra("package",app.getPackageName());
+ data.putExtra(Intent.EXTRA_PACKAGE_NAME,app.getPackageName());
setResult(RESULT_OK,data);
saveAppSettings();
diff --git a/app-mini/src/main/java/org/torproject/android/mini/ui/onboarding/OnboardingActivity.java b/app-mini/src/main/java/org/torproject/android/mini/ui/onboarding/OnboardingActivity.java
index 1c1b9927..f6531a7d 100644
--- a/app-mini/src/main/java/org/torproject/android/mini/ui/onboarding/OnboardingActivity.java
+++ b/app-mini/src/main/java/org/torproject/android/mini/ui/onboarding/OnboardingActivity.java
@@ -19,13 +19,13 @@ public class OnboardingActivity extends AppIntro {
// Instead of fragments, you can also use our default slide
// Just set a title, description, background and image. AppIntro will do the rest.
CustomSlideBigText welcome = CustomSlideBigText.newInstance(R.layout.custom_slide_big_text);
- welcome.setTitle("The power of tor made simple for your life");
- welcome.setSubTitle("orbot mini");
+ welcome.setTitle(getString(R.string.mini_onboarding_1));
+ welcome.setSubTitle(getString(R.string.app_name));
addSlide(welcome);
CustomSlideBigText intro2 = CustomSlideBigText.newInstance(R.layout.custom_slide_big_text);
- intro2.setTitle("unblock any app with a few taps");
- intro2.setSubTitle("so easy");
+ intro2.setTitle(getString(R.string.mini_onboarding_2));
+ intro2.setSubTitle(getString(R.string.mini_onboarding_2_title));
addSlide(intro2);
// OPTIONAL METHODS
diff --git a/app-mini/src/main/res/layout/activity_app_config.xml b/app-mini/src/main/res/layout/activity_app_config.xml
new file mode 100644
index 00000000..accb290b
--- /dev/null
+++ b/app-mini/src/main/res/layout/activity_app_config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".ui.AppConfigActivity">
+
+ <android.support.design.widget.AppBarLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:theme="@style/DefaultTheme.AppBarOverlay">
+
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:background="@color/dark_green"
+ app:popupTheme="@style/DefaultTheme.PopupOverlay" />
+
+ </android.support.design.widget.AppBarLayout>
+
+
+ <include layout="@layout/content_app_config" />
+
+</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/app-mini/src/main/res/layout/content_app_config.xml b/app-mini/src/main/res/layout/content_app_config.xml
new file mode 100644
index 00000000..8e7b727e
--- /dev/null
+++ b/app-mini/src/main/res/layout/content_app_config.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior"
+ tools:context=".ui.AppConfigActivity"
+ android:orientation="vertical"
+ tools:showIn="@layout/activity_app_config"
+ android:padding="20dp"
+ >
+
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/title_boost_your_privacy"
+ android:textStyle="bold"
+ android:textSize="20dp"
+ android:id="@+id/privacy_title"
+ />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/send_your_app_traffic_over_tor"
+ android:textSize="16dp"
+ android:layout_below="@+id/privacy_title"
+ />
+
+ <Switch
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentRight="true"
+
+ android:layout_toRightOf="@+id/privacy_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dp"
+ >
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/turn_off_apps"
+ android:textStyle="bold"
+ android:textSize="20dp"
+ android:id="@+id/off_apps_title"
+ />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/stop_apps_from_using_the_network"
+ android:textSize="16dp"
+ android:layout_below="@+id/off_apps_title"
+ />
+ <Switch
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentRight="true"
+
+ android:layout_toRightOf="@+id/off_apps_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dp"
+ >
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/wifi_only"
+ android:textStyle="bold"
+ android:textSize="20dp"
+ android:id="@+id/wifi_title"
+ />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/keep_your_apps_from_using_mobile_data"
+ android:textSize="16dp"
+ android:layout_below="@+id/wifi_title"
+ />
+
+ <Switch
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentRight="true"
+
+ android:layout_toRightOf="@+id/wifi_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
+
+ </RelativeLayout>
+
+
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app-mini/src/main/res/menu/app_config.xml b/app-mini/src/main/res/menu/app_config.xml
new file mode 100644
index 00000000..d0a75569
--- /dev/null
+++ b/app-mini/src/main/res/menu/app_config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 Esmertec AG.
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:yourapp="http://schemas.android.com/apk/res-auto"
+ >
+
+
+ <item android:id="@+id/menu_remove_app"
+ android:title="@string/remove"
+ yourapp:showAsAction="never"
+ />
+
+
+
+</menu>
diff --git a/app-mini/src/main/res/values/strings.xml b/app-mini/src/main/res/values/strings.xml
index 42bc1674..c7ae3edd 100644
--- a/app-mini/src/main/res/values/strings.xml
+++ b/app-mini/src/main/res/values/strings.xml
@@ -124,7 +124,7 @@
<string name="newnym">You\'ve switched to a new Tor identity!</string>
<string name="pref_open_proxy_on_all_interfaces_title">Open Proxy on All Interfaces</string>
- <string name="pref_open_proxy_on_all_interfaces_summary">Allow Wi-Fi peers, tethered devices and anyone else who can connect to your IP, to access Tor</string>
+ <string name="pref_open_proxy_on_all_interfaces_summary">Allow Wi-Fi peers, tethered devices and anyone else who can connect to your IP, to access Tor</string>
<string name="no_network_connectivity_putting_tor_to_sleep_">No network connectivity. Putting Tor to sleep…</string>
<string name="network_connectivity_is_good_waking_tor_up_">Network connectivity is good. Waking Tor up…</string>
@@ -255,4 +255,17 @@
<string name="app_services">App services</string>
<string name="default_socks_http">SOCKS: - HTTP: -</string>
<string name="refresh_apps">Refresh Apps</string>
+
+ <!-- Orbot Mini Strings -->
+ <string name="mini_onboarding_1">The power of tor made mini to fit your life</string>
+ <string name="mini_onboarding_2">unblock any app with a few taps</string>
+ <string name="mini_onboarding_2_title">so easy!</string>
+ <string name="title_activity_app_config">AppConfigActivity</string>
+ <string name="title_boost_your_privacy">Boost Your Privacy</string>
+ <string name="send_your_app_traffic_over_tor">Send app data over Tor</string>
+ <string name="turn_off_apps">Turn off app data</string>
+ <string name="stop_apps_from_using_the_network">Stop app from using the network</string>
+ <string name="wifi_only">Wifi only</string>
+ <string name="keep_your_apps_from_using_mobile_data">Only allow connection over wifi</string>
+ <string name="remove">Remove</string>
</resources>
diff --git a/app-mini/src/main/res/values/styles.xml b/app-mini/src/main/res/values/styles.xml
index b2e69a53..428c097c 100644
--- a/app-mini/src/main/res/values/styles.xml
+++ b/app-mini/src/main/res/values/styles.xml
@@ -4,4 +4,9 @@
<style name="DefaultTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="DefaultTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
+
+ <style name="DefaultTheme.NoActionBar">
+ <item name="windowActionBar">false</item>
+ <item name="windowNoTitle">true</item>
+ </style>
</resources>
1
0
[orbot/master] add new functionality to allow for checking connections against app blacklist
by n8fr8@torproject.org 29 Apr '20
by n8fr8@torproject.org 29 Apr '20
29 Apr '20
commit a266c65d772cffb3d42a803ebb1231bdbea467aa
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Thu Sep 5 12:01:36 2019 -0400
add new functionality to allow for checking connections against app blacklist
---
.../java/org/torproject/android/service/vpn/Tun2Socks.java | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/Tun2Socks.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/Tun2Socks.java
index e7f0591b..a0ded90e 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/vpn/Tun2Socks.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/Tun2Socks.java
@@ -134,6 +134,16 @@ public class Tun2Socks
private native static void terminateTun2Socks();
+ public static boolean checkIsAllowed (int protocol, String sourceAddr, int sourcePort, String destAddr, int destPort) {
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
+ {
+ return isAllowedQ(protocol, sourceAddr, sourcePort, destAddr, destPort);
+ }
+ else
+ return isAllowed(protocol, sourceAddr, sourcePort, destAddr, destPort);
+ }
+
public static boolean isAllowed (int protocol, String sourceAddr, int sourcePort, String destAddr, int destPort) {
TCPSourceApp.AppDescriptor aInfo = TCPSourceApp.getApplicationInfo(mContext, sourceAddr, sourcePort, destAddr, destPort);
1
0
[orbot/master] update changelog for 16.1.1-BETA-2-tor-0.4.0.4-rc-orbotservice
by n8fr8@torproject.org 29 Apr '20
by n8fr8@torproject.org 29 Apr '20
29 Apr '20
commit d98e5fbf4c9a6423373e1a85288f0de6ca036610
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Thu Sep 5 11:45:30 2019 -0400
update changelog for 16.1.1-BETA-2-tor-0.4.0.4-rc-orbotservice
---
CHANGELOG | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 3bc14676..bdfebb3a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,36 @@
NOTE: Specific #s below correspond to Trac tickets logged and maintained at https://trac.torproject.org/projects/tor/
+/** 16.1.1-BETA-2-tor-0.4.0.4-rc / Wed Aug 7 13:33:30 2019 -0400 / bbf5fcb3fb346e9bba712d12bf4934cf925cb2bd **/
+
+bbf5fcb3 (tag: 16.1.1-BETA-2-tor-0.4.0.4-rc) update service for VPN mode and startup fixes
+ea7f3f10 update gitignore
+cf19750d update fastlane and gradle to support split apks builds, CI and more
+cd80e850 (tag: 16.1.1-BETA-1-tor-0.4.0.4-rc) update to 16.1.1-BETA-1-tor-0.4.0.4-rc
+bfb5eab1 Merge branch 'master' of github.com:n8fr8/orbot
+d02fb582 instead of DisableNetwork, let's try NEWNYM when the network returns - we've had issues of losing connectivity setting DisableNetwork, so we are trying a new approach - now using DormantClientTimeout settings, to have client go to sleep when it is not used - when we receive a network connectivity notification, we call NEWNYM to refresh circuits
+d5e570a5 Merge pull request #247 from bitmold/low_dpi_launcher_icon
+767a8596 Launcher icon was out of date on low resolution devices.
+7d11984b (tag: 16.1.0-RC-3-tor-0.4.0.4-rc) update to 16.1.0-RC-3-tor-0.4.0.4-rc
+e146f703 make sure to kill existing pdnsd, and set the new ports properly
+c6bfc491 send ports on start request, even if tor is already running
+d3963516 keep apps around as static variable, enable user to refresh
+be5b8d88 make sure we don't have any orphaned pdnsd processes
+72ff7dd2 Merge branch 'ejo4041-mergeDebugJniLibFolders_issue'
+07e34239 (ejo4041-mergeDebugJniLibFolders_issue) Merge branch 'mergeDebugJniLibFolders_issue' of https://github.com/ejo4041/orbot into ejo4041-mergeDebugJniLibFolders_issue
+be6feea8 Merge branch 'master' of github.com:n8fr8/orbot
+d2005234 update gradle
+929cb6b6 pdnsd must be named with a .so extension to be included
+c0afffeb don't build plain armeabi anymore
+4321ae49 update native libs
+c7e9b01f Merge pull request #244 from bitmold/vpn_app_ui_glitch
+fc0b035a After following the BUILD file, could not build the apk because of a issue mentioned in #217: Execution failed for task :orbotservice:mergeDebugJniLibFolders. This change fixes that.
+7b832f19 Fixed VPN App UI for apps that were disabled or uninstalled
+d084aa6c (tag: 16.1.0-RC-2-tor-0.4.0.4-rc) update to 16.1.0-RC-2-tor-0.4.0.4-rc
+79afbe05 bind pdnsd to virtual address within VPN
+9ff0b00c fix VPN code to support dynamic DNS port for Tor
+f1e572e8 use standard string keys for intent values
+361ea26d ports can be set to "auto" so allow letters as well
+
/** 16.1.0-RC-1-tor-0.4.0.4-rc / 8 July 2019 / e60c07ed0ffc8360db4dfcdeffd8578945b38d0b **/
Thanks to @bitmold @sisbell @pgerber and @eighthave for all the great work, not to mention the core Tor dev team making all things mobile better every day!
1
0
[orbot/master] implement initial framework for blocking traffic per app
by n8fr8@torproject.org 29 Apr '20
by n8fr8@torproject.org 29 Apr '20
29 Apr '20
commit efb1c0686d0e7a80b7470020d748be4d0814d7e4
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Wed Sep 4 17:07:12 2019 -0400
implement initial framework for blocking traffic per app
- also add ability to disable tor routing as a per app preference
---
orbotservice/build.gradle | 4 +-
.../torproject/android/service/OrbotConstants.java | 6 +
.../android/service/util/TCPSourceApp.java | 316 +++++++++++++++++++++
.../android/service/vpn/OrbotVpnManager.java | 23 +-
.../torproject/android/service/vpn/Tun2Socks.java | 64 ++++-
5 files changed, 401 insertions(+), 12 deletions(-)
diff --git a/orbotservice/build.gradle b/orbotservice/build.gradle
index a62d4590..a5d07d76 100644
--- a/orbotservice/build.gradle
+++ b/orbotservice/build.gradle
@@ -1,7 +1,7 @@
apply plugin: 'com.android.library'
android {
- compileSdkVersion 28
+ compileSdkVersion 29
buildToolsVersion '28.0.3'
sourceSets {
@@ -12,7 +12,7 @@ android {
defaultConfig {
minSdkVersion 16
- targetSdkVersion 28
+ targetSdkVersion 29
versionCode 16111000
versionName '16.1.1-BETA-2-tor-0.4.0.4-rc-orbotservice'
archivesBaseName = "OrbotService-$versionName"
diff --git a/orbotservice/src/main/java/org/torproject/android/service/OrbotConstants.java b/orbotservice/src/main/java/org/torproject/android/service/OrbotConstants.java
index e452105e..a5dec36e 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/OrbotConstants.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/OrbotConstants.java
@@ -29,4 +29,10 @@ public interface OrbotConstants {
String PREF_PREFER_IPV6 = "pref_prefer_ipv6";
String PREF_DISABLE_IPV4 = "pref_disable_ipv4";
+
+ String APP_TOR_KEY = "_app_tor";
+ String APP_DATA_KEY = "_app_data";
+ String APP_WIFI_KEY = "_app_wifi";
+
+
}
diff --git a/orbotservice/src/main/java/org/torproject/android/service/util/TCPSourceApp.java b/orbotservice/src/main/java/org/torproject/android/service/util/TCPSourceApp.java
new file mode 100644
index 00000000..610e1ab4
--- /dev/null
+++ b/orbotservice/src/main/java/org/torproject/android/service/util/TCPSourceApp.java
@@ -0,0 +1,316 @@
+package org.torproject.android.service.util;
+
+/***********************************************************************
+ *
+ * Copyright (c) 2013, Sebastiano Gottardo
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the MegaDevs nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL SEBASTIANO GOTTARDO BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.Socket;
+import java.net.SocketException;
+import java.util.Collections;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+
+/**
+ * Main class for the TCPSourceApp library.
+ * @author Sebastiano Gottardo
+ *
+ */
+public class TCPSourceApp {
+
+ /*
+ * This class represents an Android application. Each application is
+ * uniquely identified by its package name (e.g. com.megadevs.tcpsourceapp)
+ * and its version (e.g. 1.0).
+ */
+ public static class AppDescriptor {
+
+ private String packageName;
+ private String version;
+ private int uid;
+
+ public AppDescriptor(int uid, String pName, String ver) {
+ this.uid = uid;
+ packageName = pName;
+ version = ver;
+ }
+
+ public int getUid () {
+ return uid;
+ }
+
+ public String getPackageName() {
+ return packageName;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ /*
+ * Override of the 'equals' method, in order to have a proper
+ * comparison between two AppDescriptor objects.
+ *
+ * (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object o) {
+
+ if (o instanceof AppDescriptor) {
+ boolean c1 = ((AppDescriptor) o).packageName.compareTo(this.packageName) == 0;
+ boolean c2 = ((AppDescriptor) o).version.compareTo(this.version) == 0;
+
+ return c1 && c2;
+ }
+
+ return false;
+ }
+
+ }
+
+ /*
+ * In a Linux-based OS, each active TCP socket is mapped in the following
+ * two files. A socket may be mapped in the '/proc/net/tcp' file in case
+ * of a simple IPv4 address, or in the '/proc/net/tcp6' if an IPv6 address
+ * is available.
+ */
+ private static final String TCP_4_FILE_PATH = "/proc/net/tcp";
+ private static final String TCP_6_FILE_PATH = "/proc/net/tcp6";
+
+ /*
+ * Two regular expressions that are able to extract valuable informations
+ * from the two /proc/net/tcp* files. More specifically, there are three
+ * fields that are extracted:
+ * - address
+ * - port
+ * - PID
+ */
+ private static final String TCP_6_PATTERN = "\\d+:\\s([0-9A-F]{32}):([0-9A-F]{4})\\s[0-9A-F]{32}:[0-9A-F]{4}\\s[0-9A-F]{2}\\s[0-9]{8}:[0-9]{8}\\s[0-9]{2}:[0-9]{8}\\s[0-9]{8}\\s+([0-9]+)";
+//sargo:/ $ cat /proc/net/tcp6
+// sl local_address remote_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
+// 0: 00000000000000000000000000000000:C36A 00000000000000000000000000000000:0000 8A 00000000:00000000 00:00000000 00000000 1001 0 35059 1 0000000000000000 99 0 0 10 0
+// 1: 00000000000000000000000000000000:A64B 00000000000000000000000000000000:0000 8A 00000000:00000000 00:00000000 00000000 1001 0 910009 1 0000000000000000 99 0 0 10 0
+
+
+ private static final String TCP_4_PATTERN = "\\d+:\\s([0-9A-F]{8}):([0-9A-F]{4})\\s[0-9A-F]{8}:[0-9A-F]{4}\\s[0-9A-F]{2}\\s[0-9A-F]{8}:[0-9A-F]{8}\\s[0-9]{2}:[0-9]{8}\\s[0-9A-F]{8}\\s+([0-9]+)";
+// sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
+// 0: 00000000:C368 00000000:0000 8A 00000000:00000000 00:00000000 00000000 1001 0 34999 1 0000000000000000 99 0 0 10 0
+
+ /*
+ * Optimises the socket lookup by checking if the connected network
+ * interface has a 'valid' IPv6 address (a global address, not a link-local
+ * one).
+ */
+ private static boolean checkConnectedIfaces = true;
+
+
+ /**
+ * The main method of the TCPSourceApp library. This method receives an
+ * Android Context instance, which is used to access the PackageManager.
+ * It parses the /proc/net/tcp* files, looking for a socket entry that
+ * matches the given port. If it finds an entry, this method extracts the
+ * PID value and it uses the PackageManager.getPackagesFromPid() method to
+ * find the originating application.
+ *
+ * @param context a valid Android Context instance
+ * @param daddr the (logical) address of the destination
+ * @param dport the (logical) port of the destination
+ * @return an AppDescriptor object, representing the found application; null
+ * if no application could be found
+ */
+ @SuppressWarnings("unused")
+ public static AppDescriptor getApplicationInfo(Context context, String saddr, int sport, String daddr, int dport) {
+
+ File tcp;
+ BufferedReader reader;
+ String line;
+ StringBuilder builder;
+ String content;
+
+ try {
+ boolean hasIPv6 = true;
+
+ // if true, checks for a connected network interface with a valid
+ // IPv4 / IPv6 address
+ if (checkConnectedIfaces) {
+ String ipv4Address = getIPAddress(true);
+ String ipv6Address = getIPAddress(false);
+
+ hasIPv6 = (ipv6Address.length() > 0);
+ }
+
+ tcp = new File(TCP_6_FILE_PATH);
+ reader = new BufferedReader(new FileReader(tcp));
+ line = "";
+ builder = new StringBuilder();
+
+ while ((line = reader.readLine()) != null) {
+ builder.append(line);
+ }
+
+ content = builder.toString();
+
+ Matcher m6 = Pattern.compile(TCP_6_PATTERN, Pattern.CASE_INSENSITIVE | Pattern.UNIX_LINES | Pattern.DOTALL).matcher(content);
+
+ if (hasIPv6)
+ while (m6.find()) {
+ String addressEntry = m6.group(1);
+ String portEntry = m6.group(2);
+ int pidEntry = Integer.valueOf(m6.group(3));
+
+ if (Integer.parseInt(portEntry, 16) == dport) {
+ PackageManager manager = context.getPackageManager();
+ String[] packagesForUid = manager.getPackagesForUid(pidEntry);
+
+ if (packagesForUid != null) {
+ String packageName = packagesForUid[0];
+ PackageInfo pInfo = manager.getPackageInfo(packageName, 0);
+ String version = pInfo.versionName;
+
+ return new AppDescriptor(pidEntry, packageName, version);
+ }
+ }
+ }
+
+ } catch (SocketException e) {
+ e.printStackTrace();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (NameNotFoundException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ // From here, no connection with the given port could be found in the tcp6 file
+ // So let's try the tcp (IPv4) one
+
+ try {
+ tcp = new File(TCP_4_FILE_PATH);
+ reader = new BufferedReader(new FileReader(tcp));
+ line = "";
+ builder = new StringBuilder();
+
+ while ((line = reader.readLine()) != null) {
+ builder.append(line);
+ }
+
+ content = builder.toString();
+
+ Matcher m4 = Pattern.compile(TCP_4_PATTERN, Pattern.CASE_INSENSITIVE | Pattern.UNIX_LINES | Pattern.DOTALL).matcher(content);
+
+ while (m4.find()) {
+ String addressEntry = m4.group(1);
+ String portEntry = m4.group(2);
+ int pidEntry = Integer.valueOf(m4.group(3));
+
+ if (Integer.parseInt(portEntry, 16) == dport) {
+ PackageManager manager = context.getPackageManager();
+ String[] packagesForUid = manager.getPackagesForUid(pidEntry);
+
+ if (packagesForUid != null) {
+ String packageName = packagesForUid[0];
+ PackageInfo pInfo = manager.getPackageInfo(packageName, 0);
+ String version = pInfo.versionName;
+
+ return new AppDescriptor(pidEntry, packageName, version);
+ }
+ }
+ }
+
+ } catch (SocketException e) {
+ e.printStackTrace();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (NameNotFoundException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+ @SuppressLint("DefaultLocale")
+ public static String getIPAddress(boolean useIPv4) throws SocketException {
+
+ List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
+
+ for (NetworkInterface intf : interfaces) {
+ List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
+
+ for (InetAddress addr : addrs) {
+ if (!addr.isLoopbackAddress()) {
+ String sAddr = addr.getHostAddress().toUpperCase();
+
+ boolean isIPv4 = addr instanceof Inet4Address;
+
+ if (useIPv4) {
+ if (isIPv4)
+ return sAddr;
+ } else {
+ if (!isIPv4) {
+ if (sAddr.startsWith("fe80") || sAddr.startsWith("FE80")) // skipping link-local addresses
+ continue;
+
+ int delim = sAddr.indexOf('%'); // drop ip6 port suffix
+ return delim < 0 ? sAddr : sAddr.substring(0, delim);
+ }
+ }
+ }
+ }
+ }
+
+ return "";
+ }
+
+ /*
+ * Sets the connected interfaces optimisation.
+ */
+ public static void setCheckConnectedIfaces(boolean value) {
+ checkConnectedIfaces = value;
+ }
+
+}
\ No newline at end of file
diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
index 9b099a24..03ad79c2 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
@@ -38,6 +38,7 @@ import android.widget.Toast;
import com.runjva.sourceforge.jsocks.protocol.ProxyServer;
import com.runjva.sourceforge.jsocks.server.ServerAuthenticatorNone;
+import org.torproject.android.service.OrbotConstants;
import org.torproject.android.service.R;
import org.torproject.android.service.TorService;
import org.torproject.android.service.TorServiceConstants;
@@ -315,7 +316,6 @@ public class OrbotVpnManager implements Handler.Callback {
builder.addDnsServer(dummyDNS);
builder.addRoute(dummyDNS,32);
-
//handle ipv6
//builder.addAddress("fdfe:dcba:9876::1", 126);
//builder.addRoute("::", 0);
@@ -344,7 +344,7 @@ public class OrbotVpnManager implements Handler.Callback {
startDNS(filePdnsd.getCanonicalPath(), localhost,mTorDns, virtualGateway, pdnsdPort);
final boolean localDnsTransparentProxy = true;
- Tun2Socks.Start(mInterface, VPN_MTU, virtualIP, virtualNetMask, localSocks , virtualGateway + ":" + pdnsdPort , localDnsTransparentProxy);
+ Tun2Socks.Start(mService, mInterface, VPN_MTU, virtualIP, virtualNetMask, localSocks , virtualGateway + ":" + pdnsdPort , localDnsTransparentProxy);
}
@@ -366,17 +366,24 @@ public class OrbotVpnManager implements Handler.Callback {
{
ArrayList<TorifiedApp> apps = TorifiedApp.getApps(mService, getSharedPrefs(mService.getApplicationContext()));
-
- boolean perAppEnabled = false;
+
+ SharedPreferences prefs = getSharedPrefs(mService.getApplicationContext());
+
+ boolean perAppEnabled = false;
for (TorifiedApp app : apps)
{
if (app.isTorified() && (!app.getPackageName().equals(mService.getPackageName())))
{
- builder.addAllowedApplication(app.getPackageName());
- perAppEnabled = true;
- }
-
+ if (prefs.getBoolean(app.getPackageName() + OrbotConstants.APP_TOR_KEY,true)) {
+
+ builder.addAllowedApplication(app.getPackageName());
+
+ }
+
+ perAppEnabled = true;
+
+ }
}
if (!perAppEnabled)
diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/Tun2Socks.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/Tun2Socks.java
index 958fb9ad..e7f0591b 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/vpn/Tun2Socks.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/Tun2Socks.java
@@ -19,11 +19,22 @@ package org.torproject.android.service.vpn;
*
*/
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.net.ConnectivityManager;
+import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.util.Log;
+import org.torproject.android.service.util.TCPSourceApp;
+
import java.net.DatagramSocket;
+import java.net.InetSocketAddress;
import java.net.Socket;
+import java.util.HashMap;
+
+import static android.content.Context.CONNECTIVITY_SERVICE;
public class Tun2Socks
{
@@ -49,7 +60,9 @@ public class Tun2Socks
private static String mSocksServerAddress;
private static String mUdpgwServerAddress;
private static boolean mUdpgwTransparentDNS;
-
+
+ private static HashMap<Integer,String> mAppUidBlacklist = new HashMap<>();
+ private static Context mContext;
// Note: this class isn't a singleton, but you can't run more
// than one instance due to the use of global state (the lwip
// module, etc.) in the native code.
@@ -57,6 +70,7 @@ public class Tun2Socks
public static void init () {}
public static void Start(
+ Context context,
ParcelFileDescriptor vpnInterfaceFileDescriptor,
int vpnInterfaceMTU,
String vpnIpAddress,
@@ -65,6 +79,7 @@ public class Tun2Socks
String udpgwServerAddress,
boolean udpgwTransparentDNS)
{
+ mContext = context;
mVpnInterfaceFileDescriptor = vpnInterfaceFileDescriptor;
mVpnInterfaceMTU = vpnInterfaceMTU;
@@ -118,5 +133,50 @@ public class Tun2Socks
int udpgwTransparentDNS);
private native static void terminateTun2Socks();
-
+
+ public static boolean isAllowed (int protocol, String sourceAddr, int sourcePort, String destAddr, int destPort) {
+
+ TCPSourceApp.AppDescriptor aInfo = TCPSourceApp.getApplicationInfo(mContext, sourceAddr, sourcePort, destAddr, destPort);
+
+ if (aInfo != null) {
+ int uid = aInfo.getUid();
+ return mAppUidBlacklist.containsKey(uid);
+ }
+ else
+ return true;
+ }
+
+ @TargetApi(Build.VERSION_CODES.Q)
+ public static boolean isAllowedQ (int protocol, String sourceAddr, int sourcePort, String destAddr, int destPort) {
+ ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(CONNECTIVITY_SERVICE);
+ if (cm == null)
+ return false;
+
+ InetSocketAddress local = new InetSocketAddress(sourceAddr, sourcePort);
+ InetSocketAddress remote = new InetSocketAddress(destAddr, destPort);
+
+ int uid = cm.getConnectionOwnerUid(protocol, local, remote);
+ return mAppUidBlacklist.containsKey(uid);
+ }
+
+ public static void setBlacklist(HashMap<Integer,String> appUidBlacklist)
+ {
+ mAppUidBlacklist = appUidBlacklist;
+ }
+
+ public static void clearBlacklist()
+ {
+ mAppUidBlacklist.clear();
+ }
+
+ public static void addToBlacklist (int uid, String pkgId)
+ {
+ mAppUidBlacklist.put(uid,pkgId);
+ }
+
+ public static void removeFromBlacklist (int uid)
+ {
+ mAppUidBlacklist.remove(uid);
+ }
+
}
\ No newline at end of file
1
0
29 Apr '20
commit 6304ffc8374258370e77e0aa4890b09e534b5dd7
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Wed Sep 4 08:24:14 2019 -0400
don't read the line twice and cause a NPE
---
.../main/java/org/torproject/android/service/vpn/OrbotVpnManager.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
index 0af6dcff..9b099a24 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
@@ -448,8 +448,7 @@ public class OrbotVpnManager implements Handler.Callback {
BufferedReader reader = new BufferedReader(new FileReader(filePid));
String line = reader.readLine();
if (line != null) {
- pid = reader.readLine().trim();
-
+ pid = line.trim();
VpnUtils.killProcess(pid, "-9");
filePid.delete();
return true;
1
0
[orbot/master] more work on app-mini user interface for configuration
by n8fr8@torproject.org 29 Apr '20
by n8fr8@torproject.org 29 Apr '20
29 Apr '20
commit e73d16c0982eecaa0d1ffe56d7f2f708a35a0458
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Wed Sep 4 17:07:53 2019 -0400
more work on app-mini user interface for configuration
---
app-mini/build.gradle | 6 +-
.../torproject/android/mini/MiniMainActivity.java | 21 ++++--
.../android/mini/ui/AppConfigActivity.java | 81 ++++++++++++++++++++--
.../src/main/res/layout/content_app_config.xml | 6 ++
app-mini/src/main/res/values/strings.xml | 4 +-
5 files changed, 101 insertions(+), 17 deletions(-)
diff --git a/app-mini/build.gradle b/app-mini/build.gradle
index ea8a8d22..678a70e6 100644
--- a/app-mini/build.gradle
+++ b/app-mini/build.gradle
@@ -20,12 +20,12 @@ android {
}
}
- compileSdkVersion 28
+ compileSdkVersion 29
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "org.torproject.android.mini"
minSdkVersion 16
- targetSdkVersion 28
+ targetSdkVersion 29
}
lintOptions {
checkReleaseBuilds false
@@ -55,7 +55,7 @@ android {
applicationId 'org.torproject.android.mini'
targetSdkVersion 28
versionCode 10010000
- versionName '1.0.0-BETA-1-tor-0.4.0.4-rc'
+ versionName 'mini-1.0.0-BETA-1-tor-0.4.0.4-rc'
archivesBaseName = "Orbot-mini-$versionName"
}
}
diff --git a/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java b/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java
index e6f33ba0..54cf23a9 100644
--- a/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java
+++ b/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java
@@ -487,13 +487,20 @@ public class MiniMainActivity extends AppCompatActivity
private void enableVPN (boolean enable)
{
- Prefs.putUseVpn(enable);
-
- if (enable) {
- startActivityForResult(new Intent(MiniMainActivity.this, VPNEnableActivity.class), REQUEST_VPN);
- } else
- stopVpnService();
+ if (enable && pkgIds.size() == 0)
+ {
+ showAppPicker();
+ }
+ else {
+ Prefs.putUseVpn(enable);
+ if (enable) {
+ startActivityForResult(new Intent(MiniMainActivity.this, VPNEnableActivity.class), REQUEST_VPN);
+ } else {
+ stopVpnService();
+ stopTor();
+ }
+ }
}
@@ -1169,7 +1176,7 @@ public class MiniMainActivity extends AppCompatActivity
{
Intent data = new Intent(this, AppConfigActivity.class);
data.putExtra(Intent.EXTRA_PACKAGE_NAME,pkgId);
- startActivity(data);
+ startActivityForResult(data,REQUEST_VPN_APPS_SELECT);
}
diff --git a/app-mini/src/main/java/org/torproject/android/mini/ui/AppConfigActivity.java b/app-mini/src/main/java/org/torproject/android/mini/ui/AppConfigActivity.java
index f4dcc6c6..d57674d3 100644
--- a/app-mini/src/main/java/org/torproject/android/mini/ui/AppConfigActivity.java
+++ b/app-mini/src/main/java/org/torproject/android/mini/ui/AppConfigActivity.java
@@ -12,9 +12,13 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.Switch;
+import org.torproject.android.mini.MainConstants;
import org.torproject.android.mini.MiniMainActivity;
import org.torproject.android.mini.R;
+import org.torproject.android.service.OrbotConstants;
import org.torproject.android.service.util.TorServiceUtils;
import org.torproject.android.service.vpn.TorifiedApp;
@@ -25,6 +29,12 @@ public class AppConfigActivity extends AppCompatActivity {
TorifiedApp mApp;
+ private boolean mAppTor = false;
+ private boolean mAppData = false;
+ private boolean mAppWifi = false;
+
+ private SharedPreferences mPrefs;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -34,7 +44,9 @@ public class AppConfigActivity extends AppCompatActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
- String pkgId = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME);
+ final String pkgId = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME);
+
+ mPrefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
ApplicationInfo aInfo = null;
try {
@@ -47,27 +59,85 @@ public class AppConfigActivity extends AppCompatActivity {
}
catch (Exception e){}
+ mAppTor = mPrefs.getBoolean(pkgId + OrbotConstants.APP_TOR_KEY,true);
+ mAppData = mPrefs.getBoolean(pkgId + OrbotConstants.APP_DATA_KEY,false);
+ mAppWifi = mPrefs.getBoolean(pkgId + OrbotConstants.APP_WIFI_KEY,false);
+
+ Switch switchAppTor = findViewById(R.id.switch_app_tor);
+ switchAppTor.setChecked(mAppTor);
+ switchAppTor.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mPrefs.edit().putBoolean(pkgId + OrbotConstants.APP_TOR_KEY,isChecked).commit();
+
+ Intent response = new Intent();
+ setResult(RESULT_OK,response);
+ }
+ });
+
+ Switch switchAppData = findViewById(R.id.switch_app_data);
+ switchAppData.setChecked(mAppData);
+ switchAppData.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mPrefs.edit().putBoolean(pkgId + OrbotConstants.APP_DATA_KEY,isChecked).commit();
+
+ Intent response = new Intent();
+ setResult(RESULT_OK,response);
+ }
+ });
+ switchAppData.setEnabled(false);
+
+ Switch switchAppWifi = findViewById(R.id.switch_app_wifi);
+ switchAppWifi.setChecked(mAppWifi);
+ switchAppWifi.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mPrefs.edit().putBoolean(pkgId + OrbotConstants.APP_WIFI_KEY,isChecked).commit();
+
+ Intent response = new Intent();
+ setResult(RESULT_OK,response);
+ }
+ });
+ switchAppWifi.setEnabled(false);
+
+
+
}
+ private void addApp ()
+ {
+ mApp.setTorified(true);
+
+ String tordAppString = mPrefs.getString(PREFS_KEY_TORIFIED, "");
+
+ tordAppString = tordAppString += mApp.getPackageName()+"|";
+
+ SharedPreferences.Editor edit = mPrefs.edit();
+ edit.putString(PREFS_KEY_TORIFIED, tordAppString);
+ edit.commit();
+
+ Intent response = new Intent();
+ setResult(RESULT_OK,response);
+
+ }
private void removeApp ()
{
mApp.setTorified(false);
- SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
- String tordAppString = prefs.getString(PREFS_KEY_TORIFIED, "");
+ String tordAppString = mPrefs.getString(PREFS_KEY_TORIFIED, "");
tordAppString = tordAppString.replace(mApp.getPackageName()+"|","");
- SharedPreferences.Editor edit = prefs.edit();
+ SharedPreferences.Editor edit = mPrefs.edit();
edit.putString(PREFS_KEY_TORIFIED, tordAppString);
edit.commit();
Intent response = new Intent();
setResult(RESULT_OK,response);
- finish();
}
/*
@@ -91,6 +161,7 @@ public class AppConfigActivity extends AppCompatActivity {
}
else if (item.getItemId() == R.id.menu_remove_app) {
removeApp();
+ finish();
}
return super.onOptionsItemSelected(item);
diff --git a/app-mini/src/main/res/layout/content_app_config.xml b/app-mini/src/main/res/layout/content_app_config.xml
index 8e7b727e..3a8c41a8 100644
--- a/app-mini/src/main/res/layout/content_app_config.xml
+++ b/app-mini/src/main/res/layout/content_app_config.xml
@@ -33,6 +33,7 @@
/>
<Switch
+ android:id="@+id/switch_app_tor"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
@@ -64,6 +65,8 @@
android:layout_below="@+id/off_apps_title"
/>
<Switch
+ android:id="@+id/switch_app_data"
+
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
@@ -96,6 +99,9 @@
/>
<Switch
+
+ android:id="@+id/switch_app_wifi"
+
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
diff --git a/app-mini/src/main/res/values/strings.xml b/app-mini/src/main/res/values/strings.xml
index c7ae3edd..810ced96 100644
--- a/app-mini/src/main/res/values/strings.xml
+++ b/app-mini/src/main/res/values/strings.xml
@@ -264,8 +264,8 @@
<string name="title_boost_your_privacy">Boost Your Privacy</string>
<string name="send_your_app_traffic_over_tor">Send app data over Tor</string>
<string name="turn_off_apps">Turn off app data</string>
- <string name="stop_apps_from_using_the_network">Stop app from using the network</string>
+ <string name="stop_apps_from_using_the_network">Stop app from using the network (coming soon!)</string>
<string name="wifi_only">Wifi only</string>
- <string name="keep_your_apps_from_using_mobile_data">Only allow connection over wifi</string>
+ <string name="keep_your_apps_from_using_mobile_data">Only allow connection over wifi (coming soon!)</string>
<string name="remove">Remove</string>
</resources>
1
0
[orbot/master] manually use `aapt singleCrunch` for reproducible builds
by n8fr8@torproject.org 29 Apr '20
by n8fr8@torproject.org 29 Apr '20
29 Apr '20
commit 30cdfa93f27d21f3d2a2b79ec6b5cbd93586a366
Author: Hans-Christoph Steiner <hans(a)eds.org>
Date: Thu Sep 5 16:14:51 2019 +0200
manually use `aapt singleCrunch` for reproducible builds
PNG crunching is not a deterministic process, especially the way aapt does
it. This makes the builds not reproducible. The easy solution to this is
to pre-crunch the PNGs and commit them to git. This also uses exiftool to
strip any metadata from the PNG. This then disables running the crunch as
part of the gradle build process.
https://medium.com/@duhroach/smaller-pngs-and-android-s-aapt-tool-4ce38a240…
---
app-mini/src/main/ic_launcher-web.png | Bin 18915 -> 20211 bytes
.../res/drawable-hdpi-v11/ic_stat_notifyerr.png | Bin 480 -> 359 bytes
.../main/res/drawable-hdpi-v11/ic_stat_tor_off.png | Bin 744 -> 944 bytes
.../res/drawable-hdpi-v9/ic_stat_notifyerr.png | Bin 616 -> 508 bytes
.../main/res/drawable-hdpi/ic_action_settings.png | Bin 553 -> 329 bytes
.../res/drawable-hdpi/ic_settings_white_24dp.png | Bin 460 -> 816 bytes
.../main/res/drawable-hdpi/ic_stat_notifyerr.png | Bin 1312 -> 901 bytes
.../src/main/res/drawable-hdpi/ic_stat_tor.png | Bin 606 -> 912 bytes
.../res/drawable-ldpi-v11/ic_stat_notifyerr.png | Bin 294 -> 262 bytes
.../res/drawable-ldpi-v9/ic_stat_notifyerr.png | Bin 342 -> 326 bytes
.../main/res/drawable-ldpi/ic_action_settings.png | Bin 319 -> 250 bytes
.../main/res/drawable-ldpi/ic_stat_notifyerr.png | Bin 647 -> 443 bytes
.../res/drawable-mdpi-v11/ic_stat_notifyerr.png | Bin 357 -> 317 bytes
.../res/drawable-mdpi-v9/ic_stat_notifyerr.png | Bin 458 -> 417 bytes
.../res/drawable-mdpi/ic_settings_white_24dp.png | Bin 326 -> 598 bytes
.../src/main/res/drawable-mdpi/ic_stat_tor.png | Bin 389 -> 576 bytes
.../res/drawable-xhdpi-v11/ic_stat_notifyerr.png | Bin 618 -> 406 bytes
.../res/drawable-xhdpi-v9/ic_stat_notifyerr.png | Bin 747 -> 580 bytes
.../res/drawable-xhdpi/ic_settings_white_24dp.png | Bin 562 -> 982 bytes
.../src/main/res/drawable-xhdpi/ic_stat_tor.png | Bin 773 -> 1115 bytes
.../res/drawable-xxhdpi/ic_settings_white_24dp.png | Bin 843 -> 1455 bytes
.../src/main/res/drawable-xxhdpi/ic_stat_tor.png | Bin 1131 -> 1496 bytes
.../drawable-xxxhdpi/ic_settings_white_24dp.png | Bin 1074 -> 1764 bytes
.../src/main/res/drawable-xxxhdpi/ic_stat_tor.png | Bin 1564 -> 1899 bytes
app-mini/src/main/res/drawable/ic_menu_about.png | Bin 1771 -> 1479 bytes
app-mini/src/main/res/drawable/ic_menu_exit.png | Bin 2693 -> 1031 bytes
app-mini/src/main/res/drawable/ic_stat_tor_off.png | Bin 744 -> 944 bytes
app-mini/src/main/res/drawable/onion32.png | Bin 1599 -> 1402 bytes
app-mini/src/main/res/drawable/toroff.png | Bin 19187 -> 19161 bytes
app-mini/src/main/res/drawable/toron.png | Bin 19057 -> 19035 bytes
app-mini/src/main/res/drawable/torstarting.png | Bin 18052 -> 18019 bytes
app-mini/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2019 -> 2579 bytes
.../res/mipmap-hdpi/ic_launcher_foreground.png | Bin 1815 -> 2048 bytes
.../src/main/res/mipmap-hdpi/ic_launcher_round.png | Bin 4055 -> 5226 bytes
app-mini/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1456 -> 1473 bytes
.../res/mipmap-mdpi/ic_launcher_foreground.png | Bin 1174 -> 1536 bytes
.../src/main/res/mipmap-mdpi/ic_launcher_round.png | Bin 2620 -> 3414 bytes
app-mini/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 2761 -> 3479 bytes
.../res/mipmap-xhdpi/ic_launcher_foreground.png | Bin 2495 -> 2543 bytes
.../main/res/mipmap-xhdpi/ic_launcher_round.png | Bin 5714 -> 7313 bytes
.../src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 4143 -> 5120 bytes
.../res/mipmap-xxhdpi/ic_launcher_foreground.png | Bin 3922 -> 3468 bytes
.../main/res/mipmap-xxhdpi/ic_launcher_round.png | Bin 8706 -> 10885 bytes
.../src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 5726 -> 6935 bytes
.../res/mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 5467 -> 4466 bytes
.../main/res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 12555 -> 15090 bytes
app/build.gradle | 3 +++
.../res/drawable-hdpi-v11/ic_stat_notifyerr.png | Bin 480 -> 359 bytes
app/src/main/res/drawable-hdpi-v11/ic_stat_tor.png | Bin 802 -> 660 bytes
.../main/res/drawable-hdpi-v11/ic_stat_tor_off.png | Bin 744 -> 944 bytes
.../res/drawable-hdpi-v11/ic_stat_tor_xfer.png | Bin 967 -> 1073 bytes
.../res/drawable-hdpi-v9/ic_stat_notifyerr.png | Bin 616 -> 508 bytes
app/src/main/res/drawable-hdpi-v9/ic_stat_tor.png | Bin 713 -> 640 bytes
.../main/res/drawable-hdpi/ic_action_settings.png | Bin 553 -> 329 bytes
app/src/main/res/drawable-hdpi/ic_launcher.png | Bin 4194 -> 3616 bytes
.../res/drawable-hdpi/ic_settings_white_24dp.png | Bin 460 -> 816 bytes
.../main/res/drawable-hdpi/ic_stat_notifyerr.png | Bin 1312 -> 901 bytes
app/src/main/res/drawable-hdpi/ic_stat_tor.png | Bin 852 -> 715 bytes
.../main/res/drawable-hdpi/ic_stat_tor_xfer.png | Bin 990 -> 969 bytes
.../res/drawable-ldpi-v11/ic_stat_notifyerr.png | Bin 294 -> 262 bytes
app/src/main/res/drawable-ldpi-v11/ic_stat_tor.png | Bin 390 -> 420 bytes
.../res/drawable-ldpi-v9/ic_stat_notifyerr.png | Bin 342 -> 326 bytes
app/src/main/res/drawable-ldpi-v9/ic_stat_tor.png | Bin 358 -> 365 bytes
.../main/res/drawable-ldpi/ic_action_settings.png | Bin 319 -> 250 bytes
app/src/main/res/drawable-ldpi/ic_launcher.png | Bin 2394 -> 2004 bytes
.../main/res/drawable-ldpi/ic_stat_notifyerr.png | Bin 647 -> 443 bytes
app/src/main/res/drawable-ldpi/ic_stat_tor.png | Bin 606 -> 494 bytes
.../res/drawable-mdpi-v11/ic_stat_notifyerr.png | Bin 357 -> 317 bytes
app/src/main/res/drawable-mdpi-v11/ic_stat_tor.png | Bin 517 -> 441 bytes
.../res/drawable-mdpi-v11/ic_stat_tor_xfer.png | Bin 607 -> 741 bytes
.../res/drawable-mdpi-v9/ic_stat_notifyerr.png | Bin 458 -> 417 bytes
app/src/main/res/drawable-mdpi-v9/ic_stat_tor.png | Bin 475 -> 464 bytes
.../res/drawable-mdpi/ic_settings_white_24dp.png | Bin 326 -> 598 bytes
.../res/drawable-xhdpi-v11/ic_stat_notifyerr.png | Bin 618 -> 406 bytes
.../main/res/drawable-xhdpi-v11/ic_stat_tor.png | Bin 1165 -> 887 bytes
.../res/drawable-xhdpi-v11/ic_stat_tor_xfer.png | Bin 1337 -> 1348 bytes
.../res/drawable-xhdpi-v9/ic_stat_notifyerr.png | Bin 747 -> 580 bytes
app/src/main/res/drawable-xhdpi-v9/ic_stat_tor.png | Bin 970 -> 864 bytes
.../res/drawable-xhdpi/ic_settings_white_24dp.png | Bin 562 -> 982 bytes
.../main/res/drawable-xxhdpi-v11/ic_stat_tor.png | Bin 1903 -> 1307 bytes
.../res/drawable-xxhdpi-v11/ic_stat_tor_xfer.png | Bin 2019 -> 1734 bytes
.../res/drawable-xxhdpi/ic_settings_white_24dp.png | Bin 843 -> 1455 bytes
.../main/res/drawable-xxxhdpi-v11/ic_stat_tor.png | Bin 2661 -> 1734 bytes
.../res/drawable-xxxhdpi-v11/ic_stat_tor_xfer.png | Bin 3156 -> 2424 bytes
.../drawable-xxxhdpi/ic_settings_white_24dp.png | Bin 1074 -> 1764 bytes
app/src/main/res/drawable/ic_launcher.png | Bin 6055 -> 5111 bytes
app/src/main/res/drawable/ic_menu_about.png | Bin 1771 -> 1479 bytes
app/src/main/res/drawable/ic_menu_exit.png | Bin 2693 -> 1031 bytes
app/src/main/res/drawable/ic_stat_tor_off.png | Bin 744 -> 944 bytes
app/src/main/res/drawable/ic_stat_tor_xfer.png | Bin 600 -> 628 bytes
app/src/main/res/drawable/onion32.png | Bin 1599 -> 1402 bytes
app/src/main/res/drawable/toroff.png | Bin 19187 -> 19161 bytes
app/src/main/res/drawable/toron.png | Bin 19057 -> 19035 bytes
app/src/main/res/drawable/torstarting.png | Bin 18052 -> 18019 bytes
.../android/en-US/images/featureGraphic.png | Bin 299999 -> 224893 bytes
fastlane/metadata/android/en-US/images/icon.png | Bin 46595 -> 31345 bytes
.../phoneScreenshots/device-2018-01-05-122015.png | Bin 337474 -> 254422 bytes
.../phoneScreenshots/device-2018-01-05-122035.png | Bin 119904 -> 96898 bytes
.../phoneScreenshots/device-2018-01-05-122111.png | Bin 472163 -> 358410 bytes
.../phoneScreenshots/device-2018-01-05-122301.png | Bin 65793 -> 52269 bytes
.../phoneScreenshots/device-2018-01-05-122310.png | Bin 65793 -> 52269 bytes
.../phoneScreenshots/device-2018-01-05-122314.png | Bin 65793 -> 52269 bytes
.../phoneScreenshots/device-2018-01-05-122344.png | Bin 236020 -> 193597 bytes
.../phoneScreenshots/device-2018-01-05-123814.png | Bin 282081 -> 222617 bytes
.../phoneScreenshots/device-2018-01-05-123828.png | Bin 148480 -> 120576 bytes
.../phoneScreenshots/device-2018-01-05-123836.png | Bin 161380 -> 130945 bytes
.../phoneScreenshots/device-2018-01-05-123908.png | Bin 344849 -> 259920 bytes
.../phoneScreenshots/device-2018-01-05-124039.png | Bin 49019 -> 39303 bytes
.../phoneScreenshots/device-2018-01-05-124045.png | Bin 73495 -> 58218 bytes
.../phoneScreenshots/device-2018-01-05-124052.png | Bin 80358 -> 64827 bytes
.../phoneScreenshots/device-2018-01-05-124059.png | Bin 120833 -> 96786 bytes
orbotservice/build.gradle | 4 ++++
.../res/drawable-hdpi-v11/ic_stat_notifyerr.png | Bin 480 -> 359 bytes
.../main/res/drawable-hdpi-v11/ic_stat_tor_off.png | Bin 744 -> 944 bytes
.../res/drawable-hdpi-v9/ic_stat_notifyerr.png | Bin 616 -> 508 bytes
.../res/drawable-hdpi/ic_refresh_white_24dp.png | Bin 387 -> 675 bytes
.../main/res/drawable-hdpi/ic_stat_notifyerr.png | Bin 1312 -> 901 bytes
.../src/main/res/drawable-hdpi/ic_stat_tor.png | Bin 1136 -> 1519 bytes
.../res/drawable-ldpi-v11/ic_stat_notifyerr.png | Bin 294 -> 262 bytes
.../res/drawable-ldpi-v9/ic_stat_notifyerr.png | Bin 342 -> 326 bytes
.../main/res/drawable-ldpi/ic_stat_notifyerr.png | Bin 647 -> 443 bytes
.../res/drawable-mdpi-v11/ic_stat_notifyerr.png | Bin 357 -> 317 bytes
.../res/drawable-mdpi-v9/ic_stat_notifyerr.png | Bin 458 -> 417 bytes
.../drawable-mdpi/ic_action_settings.png | Bin 364 -> 251 bytes
.../drawable-mdpi/ic_autorenew_black_36dp.png | Bin 369 -> 578 bytes
.../drawable-mdpi/ic_filter_none_black_36dp.png | Bin 198 -> 251 bytes
.../drawable-mdpi/drawable-mdpi/ic_launcher.png | Bin 2677 -> 2319 bytes
.../ic_playlist_add_check_black_36dp.png | Bin 163 -> 202 bytes
.../drawable-mdpi/ic_stat_notifyerr.png | Bin 883 -> 617 bytes
.../drawable-mdpi/drawable-mdpi/ic_stat_tor.png | Bin 535 -> 479 bytes
.../drawable-mdpi/ic_stat_tor_xfer.png | Bin 600 -> 628 bytes
.../res/drawable-mdpi/drawable-mdpi/inverse.png | Bin 1027 -> 1231 bytes
.../res/drawable-mdpi/ic_refresh_white_24dp.png | Bin 254 -> 426 bytes
.../main/res/drawable-mdpi/ic_stat_notifyerr.png | Bin 883 -> 617 bytes
.../src/main/res/drawable-mdpi/ic_stat_tor.png | Bin 622 -> 943 bytes
.../res/drawable-xhdpi-v11/ic_stat_notifyerr.png | Bin 618 -> 406 bytes
.../res/drawable-xhdpi-v9/ic_stat_notifyerr.png | Bin 747 -> 580 bytes
.../res/drawable-xhdpi/ic_refresh_white_24dp.png | Bin 509 -> 895 bytes
.../main/res/drawable-xhdpi/ic_stat_notifyerr.png | Bin 1796 -> 1370 bytes
.../src/main/res/drawable-xhdpi/ic_stat_tor.png | Bin 1774 -> 2148 bytes
.../drawable-xxhdpi/ic_autorenew_black_36dp.png | Bin 1000 -> 1440 bytes
.../drawable-xxhdpi/ic_filter_none_black_36dp.png | Bin 415 -> 518 bytes
.../drawable-xxhdpi/ic_launcher.png | Bin 9556 -> 7975 bytes
.../ic_playlist_add_check_black_36dp.png | Bin 325 -> 413 bytes
.../drawable-xxhdpi/ic_stat_tor.png | Bin 1872 -> 1430 bytes
.../drawable-xxhdpi/ic_stat_tor_xfer.png | Bin 2216 -> 1295 bytes
.../drawable-xxhdpi/drawable-xxhdpi/inverse.png | Bin 1027 -> 1231 bytes
.../res/drawable-xxhdpi/ic_refresh_white_24dp.png | Bin 734 -> 1231 bytes
.../src/main/res/drawable-xxhdpi/ic_stat_tor.png | Bin 3241 -> 3296 bytes
.../drawable-xxxhdpi/ic_autorenew_black_36dp.png | Bin 1362 -> 1953 bytes
.../drawable-xxxhdpi/ic_filter_none_black_36dp.png | Bin 505 -> 577 bytes
.../drawable-xxxhdpi/ic_launcher.png | Bin 13297 -> 11077 bytes
.../ic_playlist_add_check_black_36dp.png | Bin 379 -> 440 bytes
.../drawable-xxxhdpi/ic_stat_tor.png | Bin 2631 -> 1998 bytes
.../drawable-xxxhdpi/ic_stat_tor_xfer.png | Bin 2859 -> 1585 bytes
.../drawable-xxxhdpi/drawable-xxxhdpi/inverse.png | Bin 1027 -> 1231 bytes
.../res/drawable-xxxhdpi/ic_refresh_white_24dp.png | Bin 967 -> 1553 bytes
.../src/main/res/drawable-xxxhdpi/ic_stat_tor.png | Bin 3188 -> 3580 bytes
tools/png-pre-compress | 18 ++++++++++++++++++
159 files changed, 25 insertions(+)
diff --git a/app-mini/src/main/ic_launcher-web.png b/app-mini/src/main/ic_launcher-web.png
index fe170c1e..6903b7bd 100644
Binary files a/app-mini/src/main/ic_launcher-web.png and b/app-mini/src/main/ic_launcher-web.png differ
diff --git a/app-mini/src/main/res/drawable-hdpi-v11/ic_stat_notifyerr.png b/app-mini/src/main/res/drawable-hdpi-v11/ic_stat_notifyerr.png
index 1f97a9ed..782a52d9 100644
Binary files a/app-mini/src/main/res/drawable-hdpi-v11/ic_stat_notifyerr.png and b/app-mini/src/main/res/drawable-hdpi-v11/ic_stat_notifyerr.png differ
diff --git a/app-mini/src/main/res/drawable-hdpi-v11/ic_stat_tor_off.png b/app-mini/src/main/res/drawable-hdpi-v11/ic_stat_tor_off.png
index 6df646eb..a8cbe1de 100644
Binary files a/app-mini/src/main/res/drawable-hdpi-v11/ic_stat_tor_off.png and b/app-mini/src/main/res/drawable-hdpi-v11/ic_stat_tor_off.png differ
diff --git a/app-mini/src/main/res/drawable-hdpi-v9/ic_stat_notifyerr.png b/app-mini/src/main/res/drawable-hdpi-v9/ic_stat_notifyerr.png
index 58fc5ae8..75f8a863 100644
Binary files a/app-mini/src/main/res/drawable-hdpi-v9/ic_stat_notifyerr.png and b/app-mini/src/main/res/drawable-hdpi-v9/ic_stat_notifyerr.png differ
diff --git a/app-mini/src/main/res/drawable-hdpi/ic_action_settings.png b/app-mini/src/main/res/drawable-hdpi/ic_action_settings.png
index d57b2905..6bcf08a7 100644
Binary files a/app-mini/src/main/res/drawable-hdpi/ic_action_settings.png and b/app-mini/src/main/res/drawable-hdpi/ic_action_settings.png differ
diff --git a/app-mini/src/main/res/drawable-hdpi/ic_settings_white_24dp.png b/app-mini/src/main/res/drawable-hdpi/ic_settings_white_24dp.png
index 97ded33b..55d652f5 100644
Binary files a/app-mini/src/main/res/drawable-hdpi/ic_settings_white_24dp.png and b/app-mini/src/main/res/drawable-hdpi/ic_settings_white_24dp.png differ
diff --git a/app-mini/src/main/res/drawable-hdpi/ic_stat_notifyerr.png b/app-mini/src/main/res/drawable-hdpi/ic_stat_notifyerr.png
index b65fa648..abd8c126 100644
Binary files a/app-mini/src/main/res/drawable-hdpi/ic_stat_notifyerr.png and b/app-mini/src/main/res/drawable-hdpi/ic_stat_notifyerr.png differ
diff --git a/app-mini/src/main/res/drawable-hdpi/ic_stat_tor.png b/app-mini/src/main/res/drawable-hdpi/ic_stat_tor.png
index 3091474e..b50c7a3f 100644
Binary files a/app-mini/src/main/res/drawable-hdpi/ic_stat_tor.png and b/app-mini/src/main/res/drawable-hdpi/ic_stat_tor.png differ
diff --git a/app-mini/src/main/res/drawable-ldpi-v11/ic_stat_notifyerr.png b/app-mini/src/main/res/drawable-ldpi-v11/ic_stat_notifyerr.png
index b73292dd..43d71e2f 100644
Binary files a/app-mini/src/main/res/drawable-ldpi-v11/ic_stat_notifyerr.png and b/app-mini/src/main/res/drawable-ldpi-v11/ic_stat_notifyerr.png differ
diff --git a/app-mini/src/main/res/drawable-ldpi-v9/ic_stat_notifyerr.png b/app-mini/src/main/res/drawable-ldpi-v9/ic_stat_notifyerr.png
index 2787bbb5..eedf7faf 100644
Binary files a/app-mini/src/main/res/drawable-ldpi-v9/ic_stat_notifyerr.png and b/app-mini/src/main/res/drawable-ldpi-v9/ic_stat_notifyerr.png differ
diff --git a/app-mini/src/main/res/drawable-ldpi/ic_action_settings.png b/app-mini/src/main/res/drawable-ldpi/ic_action_settings.png
index c3927fd7..d179ccec 100644
Binary files a/app-mini/src/main/res/drawable-ldpi/ic_action_settings.png and b/app-mini/src/main/res/drawable-ldpi/ic_action_settings.png differ
diff --git a/app-mini/src/main/res/drawable-ldpi/ic_stat_notifyerr.png b/app-mini/src/main/res/drawable-ldpi/ic_stat_notifyerr.png
index 518e188e..645432c2 100644
Binary files a/app-mini/src/main/res/drawable-ldpi/ic_stat_notifyerr.png and b/app-mini/src/main/res/drawable-ldpi/ic_stat_notifyerr.png differ
diff --git a/app-mini/src/main/res/drawable-mdpi-v11/ic_stat_notifyerr.png b/app-mini/src/main/res/drawable-mdpi-v11/ic_stat_notifyerr.png
index 935e2093..e55893c3 100644
Binary files a/app-mini/src/main/res/drawable-mdpi-v11/ic_stat_notifyerr.png and b/app-mini/src/main/res/drawable-mdpi-v11/ic_stat_notifyerr.png differ
diff --git a/app-mini/src/main/res/drawable-mdpi-v9/ic_stat_notifyerr.png b/app-mini/src/main/res/drawable-mdpi-v9/ic_stat_notifyerr.png
index b1490315..b19d6b65 100644
Binary files a/app-mini/src/main/res/drawable-mdpi-v9/ic_stat_notifyerr.png and b/app-mini/src/main/res/drawable-mdpi-v9/ic_stat_notifyerr.png differ
diff --git a/app-mini/src/main/res/drawable-mdpi/ic_settings_white_24dp.png b/app-mini/src/main/res/drawable-mdpi/ic_settings_white_24dp.png
index 8909c355..74830332 100644
Binary files a/app-mini/src/main/res/drawable-mdpi/ic_settings_white_24dp.png and b/app-mini/src/main/res/drawable-mdpi/ic_settings_white_24dp.png differ
diff --git a/app-mini/src/main/res/drawable-mdpi/ic_stat_tor.png b/app-mini/src/main/res/drawable-mdpi/ic_stat_tor.png
index a10c654d..a4b2f3ec 100644
Binary files a/app-mini/src/main/res/drawable-mdpi/ic_stat_tor.png and b/app-mini/src/main/res/drawable-mdpi/ic_stat_tor.png differ
diff --git a/app-mini/src/main/res/drawable-xhdpi-v11/ic_stat_notifyerr.png b/app-mini/src/main/res/drawable-xhdpi-v11/ic_stat_notifyerr.png
index bed9e215..36f750a5 100644
Binary files a/app-mini/src/main/res/drawable-xhdpi-v11/ic_stat_notifyerr.png and b/app-mini/src/main/res/drawable-xhdpi-v11/ic_stat_notifyerr.png differ
diff --git a/app-mini/src/main/res/drawable-xhdpi-v9/ic_stat_notifyerr.png b/app-mini/src/main/res/drawable-xhdpi-v9/ic_stat_notifyerr.png
index 7d1139c9..7eaea7be 100644
Binary files a/app-mini/src/main/res/drawable-xhdpi-v9/ic_stat_notifyerr.png and b/app-mini/src/main/res/drawable-xhdpi-v9/ic_stat_notifyerr.png differ
diff --git a/app-mini/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png b/app-mini/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png
index 5caedc8e..24dc0e8c 100644
Binary files a/app-mini/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png and b/app-mini/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png differ
diff --git a/app-mini/src/main/res/drawable-xhdpi/ic_stat_tor.png b/app-mini/src/main/res/drawable-xhdpi/ic_stat_tor.png
index 25bf4549..0cec60a0 100644
Binary files a/app-mini/src/main/res/drawable-xhdpi/ic_stat_tor.png and b/app-mini/src/main/res/drawable-xhdpi/ic_stat_tor.png differ
diff --git a/app-mini/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png b/app-mini/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png
index eabb0a2b..3c1b30ad 100644
Binary files a/app-mini/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png and b/app-mini/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png differ
diff --git a/app-mini/src/main/res/drawable-xxhdpi/ic_stat_tor.png b/app-mini/src/main/res/drawable-xxhdpi/ic_stat_tor.png
index fb7bce8a..781d6a47 100644
Binary files a/app-mini/src/main/res/drawable-xxhdpi/ic_stat_tor.png and b/app-mini/src/main/res/drawable-xxhdpi/ic_stat_tor.png differ
diff --git a/app-mini/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png b/app-mini/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png
index 507c5edd..f27a68b7 100644
Binary files a/app-mini/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png and b/app-mini/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png differ
diff --git a/app-mini/src/main/res/drawable-xxxhdpi/ic_stat_tor.png b/app-mini/src/main/res/drawable-xxxhdpi/ic_stat_tor.png
index 32595644..1661fd13 100644
Binary files a/app-mini/src/main/res/drawable-xxxhdpi/ic_stat_tor.png and b/app-mini/src/main/res/drawable-xxxhdpi/ic_stat_tor.png differ
diff --git a/app-mini/src/main/res/drawable/ic_menu_about.png b/app-mini/src/main/res/drawable/ic_menu_about.png
index 866d4e0b..5734d4d3 100644
Binary files a/app-mini/src/main/res/drawable/ic_menu_about.png and b/app-mini/src/main/res/drawable/ic_menu_about.png differ
diff --git a/app-mini/src/main/res/drawable/ic_menu_exit.png b/app-mini/src/main/res/drawable/ic_menu_exit.png
index d301ea64..f6491824 100644
Binary files a/app-mini/src/main/res/drawable/ic_menu_exit.png and b/app-mini/src/main/res/drawable/ic_menu_exit.png differ
diff --git a/app-mini/src/main/res/drawable/ic_stat_tor_off.png b/app-mini/src/main/res/drawable/ic_stat_tor_off.png
index 6df646eb..a8cbe1de 100644
Binary files a/app-mini/src/main/res/drawable/ic_stat_tor_off.png and b/app-mini/src/main/res/drawable/ic_stat_tor_off.png differ
diff --git a/app-mini/src/main/res/drawable/onion32.png b/app-mini/src/main/res/drawable/onion32.png
index 78467601..5e002370 100644
Binary files a/app-mini/src/main/res/drawable/onion32.png and b/app-mini/src/main/res/drawable/onion32.png differ
diff --git a/app-mini/src/main/res/drawable/toroff.png b/app-mini/src/main/res/drawable/toroff.png
index 759400f2..d7367ea2 100644
Binary files a/app-mini/src/main/res/drawable/toroff.png and b/app-mini/src/main/res/drawable/toroff.png differ
diff --git a/app-mini/src/main/res/drawable/toron.png b/app-mini/src/main/res/drawable/toron.png
index 12f830a5..46a5e5af 100644
Binary files a/app-mini/src/main/res/drawable/toron.png and b/app-mini/src/main/res/drawable/toron.png differ
diff --git a/app-mini/src/main/res/drawable/torstarting.png b/app-mini/src/main/res/drawable/torstarting.png
index 3a08305f..b58490fb 100644
Binary files a/app-mini/src/main/res/drawable/torstarting.png and b/app-mini/src/main/res/drawable/torstarting.png differ
diff --git a/app-mini/src/main/res/mipmap-hdpi/ic_launcher.png b/app-mini/src/main/res/mipmap-hdpi/ic_launcher.png
index 42426c19..eef89435 100644
Binary files a/app-mini/src/main/res/mipmap-hdpi/ic_launcher.png and b/app-mini/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app-mini/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app-mini/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
index aa867fe2..01d70758 100644
Binary files a/app-mini/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/app-mini/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/app-mini/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app-mini/src/main/res/mipmap-hdpi/ic_launcher_round.png
index d8e76add..2508f71b 100644
Binary files a/app-mini/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/app-mini/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app-mini/src/main/res/mipmap-mdpi/ic_launcher.png b/app-mini/src/main/res/mipmap-mdpi/ic_launcher.png
index 6c8a8aac..5b616d96 100644
Binary files a/app-mini/src/main/res/mipmap-mdpi/ic_launcher.png and b/app-mini/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app-mini/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app-mini/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
index ea25e877..ada9b628 100644
Binary files a/app-mini/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/app-mini/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/app-mini/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app-mini/src/main/res/mipmap-mdpi/ic_launcher_round.png
index d056f3cf..50a61022 100644
Binary files a/app-mini/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/app-mini/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app-mini/src/main/res/mipmap-xhdpi/ic_launcher.png b/app-mini/src/main/res/mipmap-xhdpi/ic_launcher.png
index 09ca1b23..f7cf2a02 100644
Binary files a/app-mini/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app-mini/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app-mini/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app-mini/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
index 782034e0..18b8fad9 100644
Binary files a/app-mini/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/app-mini/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/app-mini/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app-mini/src/main/res/mipmap-xhdpi/ic_launcher_round.png
index 9197cb68..9613090b 100644
Binary files a/app-mini/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/app-mini/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app-mini/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app-mini/src/main/res/mipmap-xxhdpi/ic_launcher.png
index b45b0359..e6d96037 100644
Binary files a/app-mini/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app-mini/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app-mini/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app-mini/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
index a0b88e23..9e9c5835 100644
Binary files a/app-mini/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/app-mini/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/app-mini/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app-mini/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
index 51aac254..31f253ca 100644
Binary files a/app-mini/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app-mini/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app-mini/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app-mini/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index 7061de75..2cbd708a 100644
Binary files a/app-mini/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app-mini/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app-mini/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app-mini/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
index 829f12db..c7d8e5ee 100644
Binary files a/app-mini/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/app-mini/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/app-mini/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app-mini/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
index 1b155587..05f7e20c 100644
Binary files a/app-mini/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/app-mini/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/build.gradle b/app/build.gradle
index a6b56a43..b51afb13 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,6 +31,9 @@ android {
minSdkVersion 16
targetSdkVersion 29
}
+ aaptOptions {
+ cruncherEnabled = false
+ }
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
diff --git a/app/src/main/res/drawable-hdpi-v11/ic_stat_notifyerr.png b/app/src/main/res/drawable-hdpi-v11/ic_stat_notifyerr.png
index 1f97a9ed..782a52d9 100644
Binary files a/app/src/main/res/drawable-hdpi-v11/ic_stat_notifyerr.png and b/app/src/main/res/drawable-hdpi-v11/ic_stat_notifyerr.png differ
diff --git a/app/src/main/res/drawable-hdpi-v11/ic_stat_tor.png b/app/src/main/res/drawable-hdpi-v11/ic_stat_tor.png
index b4d2e333..543c788f 100644
Binary files a/app/src/main/res/drawable-hdpi-v11/ic_stat_tor.png and b/app/src/main/res/drawable-hdpi-v11/ic_stat_tor.png differ
diff --git a/app/src/main/res/drawable-hdpi-v11/ic_stat_tor_off.png b/app/src/main/res/drawable-hdpi-v11/ic_stat_tor_off.png
index 6df646eb..a8cbe1de 100644
Binary files a/app/src/main/res/drawable-hdpi-v11/ic_stat_tor_off.png and b/app/src/main/res/drawable-hdpi-v11/ic_stat_tor_off.png differ
diff --git a/app/src/main/res/drawable-hdpi-v11/ic_stat_tor_xfer.png b/app/src/main/res/drawable-hdpi-v11/ic_stat_tor_xfer.png
index 3d757218..781f061a 100644
Binary files a/app/src/main/res/drawable-hdpi-v11/ic_stat_tor_xfer.png and b/app/src/main/res/drawable-hdpi-v11/ic_stat_tor_xfer.png differ
diff --git a/app/src/main/res/drawable-hdpi-v9/ic_stat_notifyerr.png b/app/src/main/res/drawable-hdpi-v9/ic_stat_notifyerr.png
index 58fc5ae8..75f8a863 100644
Binary files a/app/src/main/res/drawable-hdpi-v9/ic_stat_notifyerr.png and b/app/src/main/res/drawable-hdpi-v9/ic_stat_notifyerr.png differ
diff --git a/app/src/main/res/drawable-hdpi-v9/ic_stat_tor.png b/app/src/main/res/drawable-hdpi-v9/ic_stat_tor.png
index 1dfdc09a..716e4981 100644
Binary files a/app/src/main/res/drawable-hdpi-v9/ic_stat_tor.png and b/app/src/main/res/drawable-hdpi-v9/ic_stat_tor.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_action_settings.png b/app/src/main/res/drawable-hdpi/ic_action_settings.png
index d57b2905..6bcf08a7 100644
Binary files a/app/src/main/res/drawable-hdpi/ic_action_settings.png and b/app/src/main/res/drawable-hdpi/ic_action_settings.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_launcher.png b/app/src/main/res/drawable-hdpi/ic_launcher.png
index e9954eb7..ce4331de 100644
Binary files a/app/src/main/res/drawable-hdpi/ic_launcher.png and b/app/src/main/res/drawable-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_settings_white_24dp.png
index 97ded33b..55d652f5 100644
Binary files a/app/src/main/res/drawable-hdpi/ic_settings_white_24dp.png and b/app/src/main/res/drawable-hdpi/ic_settings_white_24dp.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_stat_notifyerr.png b/app/src/main/res/drawable-hdpi/ic_stat_notifyerr.png
index b65fa648..abd8c126 100644
Binary files a/app/src/main/res/drawable-hdpi/ic_stat_notifyerr.png and b/app/src/main/res/drawable-hdpi/ic_stat_notifyerr.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_stat_tor.png b/app/src/main/res/drawable-hdpi/ic_stat_tor.png
index 0f3b147e..0f8f87d1 100644
Binary files a/app/src/main/res/drawable-hdpi/ic_stat_tor.png and b/app/src/main/res/drawable-hdpi/ic_stat_tor.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_stat_tor_xfer.png b/app/src/main/res/drawable-hdpi/ic_stat_tor_xfer.png
index d222fb67..44a2f772 100644
Binary files a/app/src/main/res/drawable-hdpi/ic_stat_tor_xfer.png and b/app/src/main/res/drawable-hdpi/ic_stat_tor_xfer.png differ
diff --git a/app/src/main/res/drawable-ldpi-v11/ic_stat_notifyerr.png b/app/src/main/res/drawable-ldpi-v11/ic_stat_notifyerr.png
index b73292dd..43d71e2f 100644
Binary files a/app/src/main/res/drawable-ldpi-v11/ic_stat_notifyerr.png and b/app/src/main/res/drawable-ldpi-v11/ic_stat_notifyerr.png differ
diff --git a/app/src/main/res/drawable-ldpi-v11/ic_stat_tor.png b/app/src/main/res/drawable-ldpi-v11/ic_stat_tor.png
index 0f24ee8a..e3d85b5b 100644
Binary files a/app/src/main/res/drawable-ldpi-v11/ic_stat_tor.png and b/app/src/main/res/drawable-ldpi-v11/ic_stat_tor.png differ
diff --git a/app/src/main/res/drawable-ldpi-v9/ic_stat_notifyerr.png b/app/src/main/res/drawable-ldpi-v9/ic_stat_notifyerr.png
index 2787bbb5..eedf7faf 100644
Binary files a/app/src/main/res/drawable-ldpi-v9/ic_stat_notifyerr.png and b/app/src/main/res/drawable-ldpi-v9/ic_stat_notifyerr.png differ
diff --git a/app/src/main/res/drawable-ldpi-v9/ic_stat_tor.png b/app/src/main/res/drawable-ldpi-v9/ic_stat_tor.png
index 82d54466..2f344690 100644
Binary files a/app/src/main/res/drawable-ldpi-v9/ic_stat_tor.png and b/app/src/main/res/drawable-ldpi-v9/ic_stat_tor.png differ
diff --git a/app/src/main/res/drawable-ldpi/ic_action_settings.png b/app/src/main/res/drawable-ldpi/ic_action_settings.png
index c3927fd7..d179ccec 100644
Binary files a/app/src/main/res/drawable-ldpi/ic_action_settings.png and b/app/src/main/res/drawable-ldpi/ic_action_settings.png differ
diff --git a/app/src/main/res/drawable-ldpi/ic_launcher.png b/app/src/main/res/drawable-ldpi/ic_launcher.png
index aed52cbc..089ac7e2 100644
Binary files a/app/src/main/res/drawable-ldpi/ic_launcher.png and b/app/src/main/res/drawable-ldpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-ldpi/ic_stat_notifyerr.png b/app/src/main/res/drawable-ldpi/ic_stat_notifyerr.png
index 518e188e..645432c2 100644
Binary files a/app/src/main/res/drawable-ldpi/ic_stat_notifyerr.png and b/app/src/main/res/drawable-ldpi/ic_stat_notifyerr.png differ
diff --git a/app/src/main/res/drawable-ldpi/ic_stat_tor.png b/app/src/main/res/drawable-ldpi/ic_stat_tor.png
index 3cd399db..1a18c2ab 100644
Binary files a/app/src/main/res/drawable-ldpi/ic_stat_tor.png and b/app/src/main/res/drawable-ldpi/ic_stat_tor.png differ
diff --git a/app/src/main/res/drawable-mdpi-v11/ic_stat_notifyerr.png b/app/src/main/res/drawable-mdpi-v11/ic_stat_notifyerr.png
index 935e2093..e55893c3 100644
Binary files a/app/src/main/res/drawable-mdpi-v11/ic_stat_notifyerr.png and b/app/src/main/res/drawable-mdpi-v11/ic_stat_notifyerr.png differ
diff --git a/app/src/main/res/drawable-mdpi-v11/ic_stat_tor.png b/app/src/main/res/drawable-mdpi-v11/ic_stat_tor.png
index a34840dc..be7dccf7 100644
Binary files a/app/src/main/res/drawable-mdpi-v11/ic_stat_tor.png and b/app/src/main/res/drawable-mdpi-v11/ic_stat_tor.png differ
diff --git a/app/src/main/res/drawable-mdpi-v11/ic_stat_tor_xfer.png b/app/src/main/res/drawable-mdpi-v11/ic_stat_tor_xfer.png
index fe291e76..04168ec8 100644
Binary files a/app/src/main/res/drawable-mdpi-v11/ic_stat_tor_xfer.png and b/app/src/main/res/drawable-mdpi-v11/ic_stat_tor_xfer.png differ
diff --git a/app/src/main/res/drawable-mdpi-v9/ic_stat_notifyerr.png b/app/src/main/res/drawable-mdpi-v9/ic_stat_notifyerr.png
index b1490315..b19d6b65 100644
Binary files a/app/src/main/res/drawable-mdpi-v9/ic_stat_notifyerr.png and b/app/src/main/res/drawable-mdpi-v9/ic_stat_notifyerr.png differ
diff --git a/app/src/main/res/drawable-mdpi-v9/ic_stat_tor.png b/app/src/main/res/drawable-mdpi-v9/ic_stat_tor.png
index c150cede..be212d07 100644
Binary files a/app/src/main/res/drawable-mdpi-v9/ic_stat_tor.png and b/app/src/main/res/drawable-mdpi-v9/ic_stat_tor.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_settings_white_24dp.png
index 8909c355..74830332 100644
Binary files a/app/src/main/res/drawable-mdpi/ic_settings_white_24dp.png and b/app/src/main/res/drawable-mdpi/ic_settings_white_24dp.png differ
diff --git a/app/src/main/res/drawable-xhdpi-v11/ic_stat_notifyerr.png b/app/src/main/res/drawable-xhdpi-v11/ic_stat_notifyerr.png
index bed9e215..36f750a5 100644
Binary files a/app/src/main/res/drawable-xhdpi-v11/ic_stat_notifyerr.png and b/app/src/main/res/drawable-xhdpi-v11/ic_stat_notifyerr.png differ
diff --git a/app/src/main/res/drawable-xhdpi-v11/ic_stat_tor.png b/app/src/main/res/drawable-xhdpi-v11/ic_stat_tor.png
index e742ae7b..2344022f 100644
Binary files a/app/src/main/res/drawable-xhdpi-v11/ic_stat_tor.png and b/app/src/main/res/drawable-xhdpi-v11/ic_stat_tor.png differ
diff --git a/app/src/main/res/drawable-xhdpi-v11/ic_stat_tor_xfer.png b/app/src/main/res/drawable-xhdpi-v11/ic_stat_tor_xfer.png
index 27e86725..270a4139 100644
Binary files a/app/src/main/res/drawable-xhdpi-v11/ic_stat_tor_xfer.png and b/app/src/main/res/drawable-xhdpi-v11/ic_stat_tor_xfer.png differ
diff --git a/app/src/main/res/drawable-xhdpi-v9/ic_stat_notifyerr.png b/app/src/main/res/drawable-xhdpi-v9/ic_stat_notifyerr.png
index 7d1139c9..7eaea7be 100644
Binary files a/app/src/main/res/drawable-xhdpi-v9/ic_stat_notifyerr.png and b/app/src/main/res/drawable-xhdpi-v9/ic_stat_notifyerr.png differ
diff --git a/app/src/main/res/drawable-xhdpi-v9/ic_stat_tor.png b/app/src/main/res/drawable-xhdpi-v9/ic_stat_tor.png
index 9e56f4fc..ce82130d 100644
Binary files a/app/src/main/res/drawable-xhdpi-v9/ic_stat_tor.png and b/app/src/main/res/drawable-xhdpi-v9/ic_stat_tor.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png
index 5caedc8e..24dc0e8c 100644
Binary files a/app/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png and b/app/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png differ
diff --git a/app/src/main/res/drawable-xxhdpi-v11/ic_stat_tor.png b/app/src/main/res/drawable-xxhdpi-v11/ic_stat_tor.png
index 1451c505..c162b7e0 100644
Binary files a/app/src/main/res/drawable-xxhdpi-v11/ic_stat_tor.png and b/app/src/main/res/drawable-xxhdpi-v11/ic_stat_tor.png differ
diff --git a/app/src/main/res/drawable-xxhdpi-v11/ic_stat_tor_xfer.png b/app/src/main/res/drawable-xxhdpi-v11/ic_stat_tor_xfer.png
index 59e63d4d..0d09348f 100644
Binary files a/app/src/main/res/drawable-xxhdpi-v11/ic_stat_tor_xfer.png and b/app/src/main/res/drawable-xxhdpi-v11/ic_stat_tor_xfer.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png
index eabb0a2b..3c1b30ad 100644
Binary files a/app/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png and b/app/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_tor.png b/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_tor.png
index a78d2907..5b6154a8 100644
Binary files a/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_tor.png and b/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_tor.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_tor_xfer.png b/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_tor_xfer.png
index 30fe5893..8e6eb04a 100644
Binary files a/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_tor_xfer.png and b/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_tor_xfer.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png
index 507c5edd..f27a68b7 100644
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png and b/app/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png differ
diff --git a/app/src/main/res/drawable/ic_launcher.png b/app/src/main/res/drawable/ic_launcher.png
index ea473739..5f418e7c 100644
Binary files a/app/src/main/res/drawable/ic_launcher.png and b/app/src/main/res/drawable/ic_launcher.png differ
diff --git a/app/src/main/res/drawable/ic_menu_about.png b/app/src/main/res/drawable/ic_menu_about.png
index 866d4e0b..5734d4d3 100644
Binary files a/app/src/main/res/drawable/ic_menu_about.png and b/app/src/main/res/drawable/ic_menu_about.png differ
diff --git a/app/src/main/res/drawable/ic_menu_exit.png b/app/src/main/res/drawable/ic_menu_exit.png
index d301ea64..f6491824 100644
Binary files a/app/src/main/res/drawable/ic_menu_exit.png and b/app/src/main/res/drawable/ic_menu_exit.png differ
diff --git a/app/src/main/res/drawable/ic_stat_tor_off.png b/app/src/main/res/drawable/ic_stat_tor_off.png
index 6df646eb..a8cbe1de 100644
Binary files a/app/src/main/res/drawable/ic_stat_tor_off.png and b/app/src/main/res/drawable/ic_stat_tor_off.png differ
diff --git a/app/src/main/res/drawable/ic_stat_tor_xfer.png b/app/src/main/res/drawable/ic_stat_tor_xfer.png
index 73ab2330..ec893235 100644
Binary files a/app/src/main/res/drawable/ic_stat_tor_xfer.png and b/app/src/main/res/drawable/ic_stat_tor_xfer.png differ
diff --git a/app/src/main/res/drawable/onion32.png b/app/src/main/res/drawable/onion32.png
index 78467601..5e002370 100644
Binary files a/app/src/main/res/drawable/onion32.png and b/app/src/main/res/drawable/onion32.png differ
diff --git a/app/src/main/res/drawable/toroff.png b/app/src/main/res/drawable/toroff.png
index 759400f2..d7367ea2 100644
Binary files a/app/src/main/res/drawable/toroff.png and b/app/src/main/res/drawable/toroff.png differ
diff --git a/app/src/main/res/drawable/toron.png b/app/src/main/res/drawable/toron.png
index 12f830a5..46a5e5af 100644
Binary files a/app/src/main/res/drawable/toron.png and b/app/src/main/res/drawable/toron.png differ
diff --git a/app/src/main/res/drawable/torstarting.png b/app/src/main/res/drawable/torstarting.png
index 3a08305f..b58490fb 100644
Binary files a/app/src/main/res/drawable/torstarting.png and b/app/src/main/res/drawable/torstarting.png differ
diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.png b/fastlane/metadata/android/en-US/images/featureGraphic.png
index f0c12d40..e34640ef 100644
Binary files a/fastlane/metadata/android/en-US/images/featureGraphic.png and b/fastlane/metadata/android/en-US/images/featureGraphic.png differ
diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png
index 2f8735c1..9813df31 100644
Binary files a/fastlane/metadata/android/en-US/images/icon.png and b/fastlane/metadata/android/en-US/images/icon.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122015.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122015.png
index c8e777b6..14307613 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122015.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122015.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122035.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122035.png
index add55f2e..c105aaab 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122035.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122035.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122111.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122111.png
index 593e9308..47e9d9f6 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122111.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122111.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122301.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122301.png
index 61e27eb4..256932bc 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122301.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122301.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122310.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122310.png
index 61e27eb4..256932bc 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122310.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122310.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122314.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122314.png
index 61e27eb4..256932bc 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122314.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122314.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122344.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122344.png
index 6f118d8c..96f8a24c 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122344.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/device-2018-01-05-122344.png differ
diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123814.png b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123814.png
index 356bc950..f11425d1 100644
Binary files a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123814.png and b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123814.png differ
diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123828.png b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123828.png
index a70c93ec..d6d6cb68 100644
Binary files a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123828.png and b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123828.png differ
diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123836.png b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123836.png
index 6896c0fd..0f94e5ac 100644
Binary files a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123836.png and b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123836.png differ
diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123908.png b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123908.png
index 47d3b5f5..a8ffda63 100644
Binary files a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123908.png and b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-123908.png differ
diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124039.png b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124039.png
index 10f76ee7..db835f9b 100644
Binary files a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124039.png and b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124039.png differ
diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124045.png b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124045.png
index 1b4f1dcc..6f7b0a8f 100644
Binary files a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124045.png and b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124045.png differ
diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124052.png b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124052.png
index 086a1b22..7500ca90 100644
Binary files a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124052.png and b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124052.png differ
diff --git a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124059.png b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124059.png
index 76c95c6e..4f51e829 100644
Binary files a/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124059.png and b/fastlane/metadata/android/fa/images/phoneScreenshots/device-2018-01-05-124059.png differ
diff --git a/orbotservice/build.gradle b/orbotservice/build.gradle
index a5d07d76..96861f1e 100644
--- a/orbotservice/build.gradle
+++ b/orbotservice/build.gradle
@@ -25,6 +25,10 @@ android {
}
}
+ aaptOptions {
+ cruncherEnabled = false
+ }
+
lintOptions {
abortOnError false
}
diff --git a/orbotservice/src/main/res/drawable-hdpi-v11/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-hdpi-v11/ic_stat_notifyerr.png
index 1f97a9ed..782a52d9 100644
Binary files a/orbotservice/src/main/res/drawable-hdpi-v11/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-hdpi-v11/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-hdpi-v11/ic_stat_tor_off.png b/orbotservice/src/main/res/drawable-hdpi-v11/ic_stat_tor_off.png
index 6df646eb..a8cbe1de 100644
Binary files a/orbotservice/src/main/res/drawable-hdpi-v11/ic_stat_tor_off.png and b/orbotservice/src/main/res/drawable-hdpi-v11/ic_stat_tor_off.png differ
diff --git a/orbotservice/src/main/res/drawable-hdpi-v9/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-hdpi-v9/ic_stat_notifyerr.png
index 58fc5ae8..75f8a863 100644
Binary files a/orbotservice/src/main/res/drawable-hdpi-v9/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-hdpi-v9/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png b/orbotservice/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png
index ffa7be93..19bea38e 100644
Binary files a/orbotservice/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png and b/orbotservice/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png differ
diff --git a/orbotservice/src/main/res/drawable-hdpi/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-hdpi/ic_stat_notifyerr.png
index b65fa648..abd8c126 100644
Binary files a/orbotservice/src/main/res/drawable-hdpi/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-hdpi/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-hdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-hdpi/ic_stat_tor.png
index af616fc9..1ccb6ec8 100644
Binary files a/orbotservice/src/main/res/drawable-hdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-hdpi/ic_stat_tor.png differ
diff --git a/orbotservice/src/main/res/drawable-ldpi-v11/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-ldpi-v11/ic_stat_notifyerr.png
index b73292dd..43d71e2f 100644
Binary files a/orbotservice/src/main/res/drawable-ldpi-v11/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-ldpi-v11/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-ldpi-v9/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-ldpi-v9/ic_stat_notifyerr.png
index 2787bbb5..eedf7faf 100644
Binary files a/orbotservice/src/main/res/drawable-ldpi-v9/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-ldpi-v9/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-ldpi/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-ldpi/ic_stat_notifyerr.png
index 518e188e..645432c2 100644
Binary files a/orbotservice/src/main/res/drawable-ldpi/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-ldpi/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi-v11/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-mdpi-v11/ic_stat_notifyerr.png
index 935e2093..e55893c3 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi-v11/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-mdpi-v11/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi-v9/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-mdpi-v9/ic_stat_notifyerr.png
index b1490315..b19d6b65 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi-v9/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-mdpi-v9/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_action_settings.png b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_action_settings.png
index d90f1255..4b965fa7 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_action_settings.png and b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_action_settings.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_autorenew_black_36dp.png b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_autorenew_black_36dp.png
index 39be19e4..32a688d8 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_autorenew_black_36dp.png and b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_autorenew_black_36dp.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_filter_none_black_36dp.png b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_filter_none_black_36dp.png
index ebe663df..c4a6d7d7 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_filter_none_black_36dp.png and b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_filter_none_black_36dp.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_launcher.png b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_launcher.png
index e45ce29a..d81f1159 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_launcher.png and b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_launcher.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_playlist_add_check_black_36dp.png b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_playlist_add_check_black_36dp.png
index 92448842..0a3f63b8 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_playlist_add_check_black_36dp.png and b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_playlist_add_check_black_36dp.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_stat_notifyerr.png
index c4b3178e..87684ad8 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_stat_tor.png
index 6649e14a..116cb16c 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_stat_tor.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_stat_tor_xfer.png b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_stat_tor_xfer.png
index 73ab2330..ec893235 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_stat_tor_xfer.png and b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/ic_stat_tor_xfer.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/inverse.png b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/inverse.png
index 65eff2c7..71e1adc5 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/inverse.png and b/orbotservice/src/main/res/drawable-mdpi/drawable-mdpi/inverse.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png b/orbotservice/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png
index 97e42b52..99233274 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png and b/orbotservice/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-mdpi/ic_stat_notifyerr.png
index c4b3178e..87684ad8 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-mdpi/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-mdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-mdpi/ic_stat_tor.png
index a2da32e6..dff3187f 100644
Binary files a/orbotservice/src/main/res/drawable-mdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-mdpi/ic_stat_tor.png differ
diff --git a/orbotservice/src/main/res/drawable-xhdpi-v11/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-xhdpi-v11/ic_stat_notifyerr.png
index bed9e215..36f750a5 100644
Binary files a/orbotservice/src/main/res/drawable-xhdpi-v11/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-xhdpi-v11/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-xhdpi-v9/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-xhdpi-v9/ic_stat_notifyerr.png
index 7d1139c9..7eaea7be 100644
Binary files a/orbotservice/src/main/res/drawable-xhdpi-v9/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-xhdpi-v9/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png b/orbotservice/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png
index 1989184b..91d695d2 100644
Binary files a/orbotservice/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png and b/orbotservice/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png differ
diff --git a/orbotservice/src/main/res/drawable-xhdpi/ic_stat_notifyerr.png b/orbotservice/src/main/res/drawable-xhdpi/ic_stat_notifyerr.png
index f48e8e83..44327e6c 100644
Binary files a/orbotservice/src/main/res/drawable-xhdpi/ic_stat_notifyerr.png and b/orbotservice/src/main/res/drawable-xhdpi/ic_stat_notifyerr.png differ
diff --git a/orbotservice/src/main/res/drawable-xhdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-xhdpi/ic_stat_tor.png
index 3f64c293..3e0d67ae 100644
Binary files a/orbotservice/src/main/res/drawable-xhdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-xhdpi/ic_stat_tor.png differ
diff --git a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_autorenew_black_36dp.png b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_autorenew_black_36dp.png
index 2b9fd98a..f5fcab1c 100644
Binary files a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_autorenew_black_36dp.png and b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_autorenew_black_36dp.png differ
diff --git a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_filter_none_black_36dp.png b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_filter_none_black_36dp.png
index d6e77c74..b7a72182 100644
Binary files a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_filter_none_black_36dp.png and b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_filter_none_black_36dp.png differ
diff --git a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_launcher.png b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_launcher.png
index c2f2f45d..448c032b 100644
Binary files a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_launcher.png and b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_launcher.png differ
diff --git a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_playlist_add_check_black_36dp.png b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_playlist_add_check_black_36dp.png
index 38b8b271..aae1fc8d 100644
Binary files a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_playlist_add_check_black_36dp.png and b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_playlist_add_check_black_36dp.png differ
diff --git a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_stat_tor.png
index 778cc1e2..5467c680 100644
Binary files a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_stat_tor.png differ
diff --git a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_stat_tor_xfer.png b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_stat_tor_xfer.png
index eb8809c4..b04b18e7 100644
Binary files a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_stat_tor_xfer.png and b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_stat_tor_xfer.png differ
diff --git a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/inverse.png b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/inverse.png
index 65eff2c7..71e1adc5 100644
Binary files a/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/inverse.png and b/orbotservice/src/main/res/drawable-xxhdpi/drawable-xxhdpi/inverse.png differ
diff --git a/orbotservice/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png b/orbotservice/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png
index 1692d8a2..535f3f01 100644
Binary files a/orbotservice/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png and b/orbotservice/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png differ
diff --git a/orbotservice/src/main/res/drawable-xxhdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-xxhdpi/ic_stat_tor.png
index b006186a..3f21c04f 100644
Binary files a/orbotservice/src/main/res/drawable-xxhdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-xxhdpi/ic_stat_tor.png differ
diff --git a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_autorenew_black_36dp.png b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_autorenew_black_36dp.png
index 5f614e44..9c9a1f66 100644
Binary files a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_autorenew_black_36dp.png and b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_autorenew_black_36dp.png differ
diff --git a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_filter_none_black_36dp.png b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_filter_none_black_36dp.png
index d88cd353..963e1951 100644
Binary files a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_filter_none_black_36dp.png and b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_filter_none_black_36dp.png differ
diff --git a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_launcher.png b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_launcher.png
index 74a31304..6ae04dbf 100644
Binary files a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_launcher.png and b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_launcher.png differ
diff --git a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_playlist_add_check_black_36dp.png b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_playlist_add_check_black_36dp.png
index 25426909..9a544026 100644
Binary files a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_playlist_add_check_black_36dp.png and b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_playlist_add_check_black_36dp.png differ
diff --git a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_stat_tor.png
index a2ff338a..94542bdc 100644
Binary files a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_stat_tor.png differ
diff --git a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_stat_tor_xfer.png b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_stat_tor_xfer.png
index 8f967793..82bb917c 100644
Binary files a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_stat_tor_xfer.png and b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/ic_stat_tor_xfer.png differ
diff --git a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/inverse.png b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/inverse.png
index 65eff2c7..71e1adc5 100644
Binary files a/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/inverse.png and b/orbotservice/src/main/res/drawable-xxxhdpi/drawable-xxxhdpi/inverse.png differ
diff --git a/orbotservice/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.png b/orbotservice/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.png
index f5beca25..a9db32db 100644
Binary files a/orbotservice/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.png and b/orbotservice/src/main/res/drawable-xxxhdpi/ic_refresh_white_24dp.png differ
diff --git a/orbotservice/src/main/res/drawable-xxxhdpi/ic_stat_tor.png b/orbotservice/src/main/res/drawable-xxxhdpi/ic_stat_tor.png
index 4127c36b..c3f54164 100644
Binary files a/orbotservice/src/main/res/drawable-xxxhdpi/ic_stat_tor.png and b/orbotservice/src/main/res/drawable-xxxhdpi/ic_stat_tor.png differ
diff --git a/tools/png-pre-compress b/tools/png-pre-compress
new file mode 100755
index 00000000..a52dbbd8
--- /dev/null
+++ b/tools/png-pre-compress
@@ -0,0 +1,18 @@
+#!/usr/bin/env sh
+
+set -e
+set -x
+
+for f in `find $(dirname $0)/../*/src/ -type f -name \*.png`; do
+ echo $f | grep -Eo '\.9\.png$' && continue # do not optimized 9-patch, it breaks them
+ tmpfile=$(mktemp)
+ aapt singleCrunch -v -i $f -o $tmpfile
+ exiftool -all= $tmpfile
+ mv $tmpfile $f
+done
+
+for f in `find $(dirname $0)/../fastlane/metadata/android/ -type f -name \*.png`; do
+ exiftool -all= $f
+ tmpfile=$(mktemp)
+ (zopflipng --filters=01234mepb --lossy_8bit --lossy_transparent -y $f $tmpfile && mv $tmpfile $f) &
+done
1
0