tor-commits
Threads by month
- ----- 2025 -----
- 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
August 2019
- 19 participants
- 2737 discussions

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 28329 - Part 1. Add new Tor resources
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 1bd14a093ba7b397fe737941b6e75f0940030535
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Tue Feb 19 22:45:46 2019 +0000
Bug 28329 - Part 1. Add new Tor resources
---
.../main/res/color/tor_bridges_enabled_colors.xml | 10 ++++++
.../main/res/color/tor_bridges_select_builtin.xml | 8 +++++
.../res/drawable-nodpi/tor_bootstrap_onion.gif | Bin 0 -> 137518 bytes
.../app/src/main/res/drawable/ic_settings_24px.xml | 36 +++++++++++++++++++++
.../res/drawable/list_section_divider_material.xml | 19 +++++++++++
.../drawable/list_section_divider_mtrl_alpha.9.png | Bin 0 -> 164 bytes
.../app/src/main/res/drawable/rounded_corners.xml | 11 +++++++
.../src/main/res/drawable/tor_spinning_onion.xml | 12 +++++++
mobile/android/app/src/main/res/values/colors.xml | 2 ++
mobile/android/app/src/main/res/xml/separator.xml | 13 ++++++++
.../base/locales/en-US/torbrowser_strings.dtd | 32 ++++++++++++++++++
mobile/android/base/strings.xml.in | 29 +++++++++++++++++
12 files changed, 172 insertions(+)
diff --git a/mobile/android/app/src/main/res/color/tor_bridges_enabled_colors.xml b/mobile/android/app/src/main/res/color/tor_bridges_enabled_colors.xml
new file mode 100644
index 000000000000..a51ffd547c04
--- /dev/null
+++ b/mobile/android/app/src/main/res/color/tor_bridges_enabled_colors.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!-- Used by the Bridges Enabled switch for correct coloring -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_checked="true"
+ android:color="@color/tor_bootstrap_background" />
+ <item android:color="#808080" />
+</selector>
diff --git a/mobile/android/app/src/main/res/color/tor_bridges_select_builtin.xml b/mobile/android/app/src/main/res/color/tor_bridges_select_builtin.xml
new file mode 100644
index 000000000000..948ed552d539
--- /dev/null
+++ b/mobile/android/app/src/main/res/color/tor_bridges_select_builtin.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!-- Used for changing the color of the radio button -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="#808080" />
+</selector>
diff --git a/mobile/android/app/src/main/res/drawable-nodpi/tor_bootstrap_onion.gif b/mobile/android/app/src/main/res/drawable-nodpi/tor_bootstrap_onion.gif
new file mode 100755
index 000000000000..b9478997b5d6
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable-nodpi/tor_bootstrap_onion.gif differ
diff --git a/mobile/android/app/src/main/res/drawable/ic_settings_24px.xml b/mobile/android/app/src/main/res/drawable/ic_settings_24px.xml
new file mode 100644
index 000000000000..c582193aa12d
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/ic_settings_24px.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2018 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
+
+ https://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.
+ -->
+
+<!--
+ Downloaded from:
+ https://raw.githubusercontent.com/material-components/material-components-a…
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="20"
+ android:viewportHeight="20"
+ tools:ignore="NewApi">
+
+ <path
+ android:pathData="M0,0 L20,0 L20,20 L0,20 L0,0 Z" />
+ <path
+ android:fillColor="?attr/colorControlNormal"
+ android:pathData="M15.95,10.78 C15.98,10.53,16,10.27,16,10 S15.98,9.47,15.94,9.22 L17.63,7.9 C17.78,7.78,17.82,7.56,17.73,7.39 L16.13,4.62 C16.03,4.44,15.82,4.38,15.64,4.44 L13.65,5.24 C13.23,4.92,12.79,4.66,12.3,4.46 L12,2.34 C11.97,2.14,11.8,2,11.6,2 L8.4,2 C8.2,2,8.04,2.14,8.01,2.34 L7.71,4.46 C7.22,4.66,6.77,4.93,6.36,5.24 L4.37,4.44 C4.19,4.37,3.98,4.44,3.88,4.62 L2.28,7.39 C2.18,7.57,2.22,7.78,2.38,7.9 L4.07,9.22 C4.03,9.47,4,9.74,4,10 S4.02,10.53,4.06,10.78 L2.37,12.1 C2.22,12.22,2.18,12.44,2.27,12.61 L3.87,15.38 C3.97,15.56,4.18,15.62,4.36,15.56 L6.35,14.76 C6.77,15.08,7.21,15.34,7.7,15.54 L8,17.66 C8.04,17.86,8.2,18,8.4,18 L11.6,18 C11.8,18,11.97,17.86,11.99,17.66 L12.29,15.54 C12.78,15.34,13.23,15.07,13.64,14.76 L15.63,15.56 C15.81,15.63,16.02,15.56,16.12,15.38 L17.72,12.61 C17.82,12.43,17.78,12.22,17.62,12.1 L15.95,10.78 Z M10,13 C8.35,13,7,11.65,7,10 S8.35,7,10,7 S13,8.35,13,10 S11.65,13,10,13 Z" />
+</vector>
diff --git a/mobile/android/app/src/main/res/drawable/list_section_divider_material.xml b/mobile/android/app/src/main/res/drawable/list_section_divider_material.xml
new file mode 100644
index 000000000000..dd66b88381fa
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/list_section_divider_material.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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.
+-->
+<!-- Based on:
+ https://android.googlesource.com/platform/frameworks/base/+/refs/heads/pie-…
+-->
+<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/list_section_divider_mtrl_alpha"
+ android:tint="#ff000000"
+ android:alpha="0.12" />
diff --git a/mobile/android/app/src/main/res/drawable/list_section_divider_mtrl_alpha.9.png b/mobile/android/app/src/main/res/drawable/list_section_divider_mtrl_alpha.9.png
new file mode 100644
index 000000000000..12d8b2f4aa00
Binary files /dev/null and b/mobile/android/app/src/main/res/drawable/list_section_divider_mtrl_alpha.9.png differ
diff --git a/mobile/android/app/src/main/res/drawable/rounded_corners.xml b/mobile/android/app/src/main/res/drawable/rounded_corners.xml
new file mode 100644
index 000000000000..670da2fed66e
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/rounded_corners.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!-- Used for rounding the corners of a button -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="#FFFFFF" />
+ <corners android:radius="5dp" />
+</shape>
diff --git a/mobile/android/app/src/main/res/drawable/tor_spinning_onion.xml b/mobile/android/app/src/main/res/drawable/tor_spinning_onion.xml
new file mode 100644
index 000000000000..e0909237886c
--- /dev/null
+++ b/mobile/android/app/src/main/res/drawable/tor_spinning_onion.xml
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<vector android:height="24dp" android:viewportHeight="289"
+ android:viewportWidth="249" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#FF000000" android:pathData="M100.02,44.97C96.2,31.15 83.92,21.59 69.91,21.51V0c16.52,0 32.07,7.97 41.98,21.51V0h20.99v21.51C142.78,7.97 158.33,0 174.85,0v21.51c-14.01,0.08 -26.29,9.63 -30.12,23.45C203.49,54.97 41.26,54.97 100.02,44.97z"/>
+ <path android:fillColor="#FF000000" android:pathData="M123.92,52.47c-62.22,0 -112.65,50.44 -112.65,112.65c0,62.22 50.44,112.65 112.65,112.65V52.47z"/>
+ <path android:fillColor="#FF000000" android:pathData="M123.92,266.51c56,0 101.39,-45.39 101.39,-101.39c0,-56 -45.39,-101.39 -101.39,-101.39S22.53,109.13 22.53,165.12C22.53,221.12 67.92,266.51 123.92,266.51zM123.92,289.04C55.48,289.04 0,233.56 0,165.12S55.48,41.2 123.92,41.2s123.92,55.48 123.92,123.92S192.36,289.04 123.92,289.04z"/>
+ <path android:fillColor="#FF000000" android:pathData="M124.92,78.78v22.53c34.79,0.54 62.84,28.89 62.84,63.81c0,34.92 -28.04,63.28 -62.84,63.81v22.53c47.24,-0.54 85.37,-38.98 85.37,-86.34C210.29,117.76 172.16,79.32 124.92,78.78z"/>
+ <path android:fillColor="#FF000000" android:pathData="M123.92,116.31v22.53c14.52,0 26.29,11.77 26.29,26.29s-11.77,26.29 -26.29,26.29v22.53c26.96,0 48.82,-21.86 48.82,-48.82C172.74,138.16 150.88,116.31 123.92,116.31z"/>
+</vector>
diff --git a/mobile/android/app/src/main/res/values/colors.xml b/mobile/android/app/src/main/res/values/colors.xml
index f31f0e73198f..a013a5d50afc 100644
--- a/mobile/android/app/src/main/res/values/colors.xml
+++ b/mobile/android/app/src/main/res/values/colors.xml
@@ -154,6 +154,8 @@
<color name="tor_tab_inactive_text">#484848</color>
<color name="tor_tab_active_text">#7D4698</color>
<color name="tor_description_background_text">#FAFAFA</color>
+
+ <color name="tor_bootstrap_background">#420C5D</color>
<!-- Restricted profiles palette -->
<color name="restricted_profile_background_gold">#ffffcb51</color>
diff --git a/mobile/android/app/src/main/res/xml/separator.xml b/mobile/android/app/src/main/res/xml/separator.xml
new file mode 100644
index 000000000000..edd95cd90a3a
--- /dev/null
+++ b/mobile/android/app/src/main/res/xml/separator.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!-- List item separator -->
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:textSize="8sp"
+ android:textStyle="bold"
+ android:background="@drawable/list_section_divider_material"/>
diff --git a/mobile/android/base/locales/en-US/torbrowser_strings.dtd b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
index f5a2ad2cd7fd..f3fba468fc0e 100644
--- a/mobile/android/base/locales/en-US/torbrowser_strings.dtd
+++ b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
@@ -30,4 +30,36 @@
<!ENTITY firstrun_onionservices_message "Onion services are sites that end with a .onion that provide extra protections to publishers and visitors, including added safeguards against censorship. Onion services allow anyone to provide content and services anonymously.">
<!ENTITY firstrun_onionservices_next "Go to explore">
+<!ENTITY tor_bootstrap_swipe_for_logs "Swipe to the left to see Tor logs">
+<!ENTITY tor_bootstrap_connect "Connect">
+<!ENTITY tor_bootstrap_starting_status "We are connecting to the Tor network...">
+
+<!ENTITY pref_tor_network_title "Network">
+<!ENTITY pref_tor_select_a_bridge_title "Select a Bridge">
+<!ENTITY pref_tor_provide_a_bridge_title "Provide a Bridge">
+
+<!ENTITY pref_category_tor_network_summary "Tor Browser connects you to the Tor Network run by thousands of volunteers around the world! Can these options help you?">
+<!ENTITY pref_category_tor_bridge_summary "Bridges are unlisted Tor relays that make it more difficult to block connections into the Tor network. Because of how some countries try to block Tor, certain bridges work in some countries but not others.">
+
+<!ENTITY pref_choice_tor_bridges_enabled_title "Internet is censored here">
+<!ENTITY pref_choice_tor_bridges_enabled_summary "Tap to configure a bridge to connect to Tor">
+
+<!ENTITY pref_tor_bridges_provide_manual_button_title "Provide a Bridge I know">
+<!ENTITY pref_tor_bridges_provide_select_text_title "Select a Bridge">
+<!ENTITY pref_tor_bridges_provide_manual_text_title "Enter Bridge">
+<!ENTITY pref_tor_bridges_provide_manual_summary "Enter the bridge information you received from a trusted source">
+<!ENTITY pref_tor_bridges_provide_manual_address_port_placeholder "address:port">
+<!ENTITY pref_tor_hint_type_one_per_line "Type one per line">
+
+<!-- When another PT is recommended, change TorNetworkBridgeSelectPreference::saveCurrentCheckedRadioButton(), too -->
+<!ENTITY pref_bridges_type_obfs4 "obfs4 (recommended)">
+<!ENTITY pref_bridges_type_meek_azure "meek-azure">
+<!ENTITY pref_bridges_type_obfs3 "obfs3">
+<!ENTITY pref_tor_network_bridges_enabled_change_builtin "You\'re using a built-in bridge to connect to Tor. Change">
+<!ENTITY pref_tor_network_bridges_enabled_change_custom "You\'re using a custom bridge to connect to Tor. Change">
+<!ENTITY pref_tor_network_using_multiple_provided_bridges "You\'re using multiple custom bridges.">
+<!ENTITY pref_tor_network_using_a_provided_bridge "You\'re using &formatS; bridge.">
+
+<!ENTITY tor_notify_user_about_error "An error occurred, please swipe for more information.">
+
<!ENTITY sync_not_supported "Sync is not currently supported in Tor Browser on Android">
diff --git a/mobile/android/base/strings.xml.in b/mobile/android/base/strings.xml.in
index 546dc31eb9c1..8ac8248ea1dc 100644
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -86,6 +86,35 @@
<string name="firstrun_onionservices_message">&firstrun_onionservices_message;</string>
<string name="firstrun_onionservices_next">&firstrun_onionservices_next;</string>
+ <string name="pref_tor_network_title">&pref_tor_network_title;</string>
+ <string name="pref_tor_select_a_bridge_title">&pref_tor_select_a_bridge_title;</string>
+ <string name="pref_tor_provide_a_bridge_title">&pref_tor_provide_a_bridge_title;</string>
+ <string name="pref_category_tor_network_summary">&pref_category_tor_network_summary;</string>
+ <string name="pref_category_tor_bridge_summary">&pref_category_tor_bridge_summary;</string>
+ <string name="tor_notify_user_about_error">&tor_notify_user_about_error;</string>
+
+ <string name="tor_bootstrap_swipe_for_logs">&tor_bootstrap_swipe_for_logs;</string>
+ <string name="tor_bootstrap_connect">&tor_bootstrap_connect;</string>
+ <string name="tor_bootstrap_starting_status">&tor_bootstrap_starting_status;</string>
+
+ <string name="pref_choice_tor_bridges_enabled_title">&pref_choice_tor_bridges_enabled_title;</string>
+ <string name="pref_choice_tor_bridges_enabled_summary">&pref_choice_tor_bridges_enabled_summary;</string>
+ <string name="pref_bridges_type_obfs4">&pref_bridges_type_obfs4;</string>
+ <string name="pref_bridges_type_meek_azure">&pref_bridges_type_meek_azure;</string>
+ <string name="pref_bridges_type_obfs3">&pref_bridges_type_obfs3;</string>
+
+ <string name="pref_tor_bridges_provide_manual_button_title">&pref_tor_bridges_provide_manual_button_title;</string>
+ <string name="pref_tor_bridges_provide_select_text_title">&pref_tor_bridges_provide_select_text_title;</string>
+ <string name="pref_tor_bridges_provide_manual_text_title">&pref_tor_bridges_provide_manual_text_title;</string>
+ <string name="pref_tor_bridges_provide_manual_summary">&pref_tor_bridges_provide_manual_summary;</string>
+
+ <string name="pref_tor_bridges_provide_manual_address_port_placeholder">&pref_tor_bridges_provide_manual_address_port_placeholder;</string>
+ <string name="pref_tor_hint_type_one_per_line">&pref_tor_hint_type_one_per_line;</string>
+ <string name="pref_tor_network_bridges_enabled_change_custom">&pref_tor_network_bridges_enabled_change_custom;</string>
+ <string name="pref_tor_network_bridges_enabled_change_builtin">&pref_tor_network_bridges_enabled_change_builtin;</string>
+ <string name="pref_tor_network_using_multiple_provided_bridges">&pref_tor_network_using_multiple_provided_bridges;</string>
+ <string name="pref_tor_network_using_a_provided_bridge">&pref_tor_network_using_a_provided_bridge;</string>
+
<string name="bookmarks_title">&bookmarks_title;</string>
<string name="history_title">&history_title;</string>
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 28125 - Prevent non-Necko network connections
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit cf14b5eb0d976a53585266ae34dc81cf0e1e9b23
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Thu Oct 25 19:17:09 2018 +0000
Bug 28125 - Prevent non-Necko network connections
---
.../base/java/org/mozilla/gecko/SuggestClient.java | 5 ++
.../homepanel/topstories/PocketStoriesLoader.java | 5 ++
.../mozilla/gecko/distribution/Distribution.java | 5 ++
.../java/org/mozilla/gecko/dlc/BaseAction.java | 6 ++
.../java/org/mozilla/gecko/home/ImageLoader.java | 7 ++
.../mozilla/gecko/icons/loader/IconDownloader.java | 11 +++
.../mozilla/gecko/search/SearchEngineManager.java | 5 ++
.../org/mozilla/gecko/switchboard/SwitchBoard.java | 6 ++
.../gecko/media/GeckoMediaDrmBridgeV21.java | 6 ++
.../exoplayer2/upstream/DefaultHttpDataSource.java | 85 ++++++++++++----------
.../service/utils/AbstractCommunicator.java | 5 ++
11 files changed, 106 insertions(+), 40 deletions(-)
diff --git a/mobile/android/base/java/org/mozilla/gecko/SuggestClient.java b/mobile/android/base/java/org/mozilla/gecko/SuggestClient.java
index 0ebffeccdf21..137e53cc5c03 100644
--- a/mobile/android/base/java/org/mozilla/gecko/SuggestClient.java
+++ b/mobile/android/base/java/org/mozilla/gecko/SuggestClient.java
@@ -72,6 +72,11 @@ public class SuggestClient {
return mPrevResults;
ArrayList<String> suggestions = new ArrayList<String>();
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ return suggestions;
+ }
+
if (TextUtils.isEmpty(mSuggestTemplate) || TextUtils.isEmpty(query)) {
return suggestions;
}
diff --git a/mobile/android/base/java/org/mozilla/gecko/activitystream/homepanel/topstories/PocketStoriesLoader.java b/mobile/android/base/java/org/mozilla/gecko/activitystream/homepanel/topstories/PocketStoriesLoader.java
index 7ebead4cfa3f..516c13610047 100644
--- a/mobile/android/base/java/org/mozilla/gecko/activitystream/homepanel/topstories/PocketStoriesLoader.java
+++ b/mobile/android/base/java/org/mozilla/gecko/activitystream/homepanel/topstories/PocketStoriesLoader.java
@@ -124,6 +124,11 @@ public class PocketStoriesLoader extends AsyncTaskLoader<List<TopStory>> {
}
protected String makeAPIRequestWithKey(final String apiKey) {
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ return null;
+ }
+
HttpURLConnection connection = null;
final Uri uri = Uri.parse(GLOBAL_ENDPOINT)
diff --git a/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java b/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java
index 56340987207a..2e2d07d58914 100644
--- a/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java
+++ b/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java
@@ -555,6 +555,11 @@ public class Distribution {
return false;
}
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ return false;
+ }
+
URI uri = getReferredDistribution(referrer);
if (uri == null) {
return false;
diff --git a/mobile/android/base/java/org/mozilla/gecko/dlc/BaseAction.java b/mobile/android/base/java/org/mozilla/gecko/dlc/BaseAction.java
index 6e71bc13055e..486afe31a5cb 100644
--- a/mobile/android/base/java/org/mozilla/gecko/dlc/BaseAction.java
+++ b/mobile/android/base/java/org/mozilla/gecko/dlc/BaseAction.java
@@ -151,6 +151,12 @@ public abstract class BaseAction {
protected HttpURLConnection buildHttpURLConnection(String url)
throws UnrecoverableDownloadContentException, IOException {
try {
+ if (AppConstants.isTorBrowser()) {
+ String erdcl = "This is Tor Browser. Downloading is disabled for: " + url;
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ throw new UnrecoverableDownloadContentException(erdcl);
+ }
+
System.setProperty("http.keepAlive", "true");
HttpURLConnection connection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(new URI(url));
diff --git a/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java b/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java
index cbbe7babbba4..b6ea0249445c 100644
--- a/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java
@@ -15,6 +15,7 @@ import com.squareup.picasso.Picasso;
import com.squareup.picasso.Downloader.Response;
import com.squareup.picasso.UrlConnectionDownloader;
+import org.mozilla.gecko.AppConstants;
import org.mozilla.gecko.util.ProxySelector;
import java.io.File;
@@ -91,6 +92,12 @@ public class ImageLoader {
@Override
protected HttpURLConnection openConnection(Uri path) throws IOException {
+ if (AppConstants.isTorBrowser()) {
+ String err = "This is Tor Browser. Downloading is disabled for: " + path.toString();
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ throw new IOException(err);
+ }
+
try {
// This is annoying, but |path| is an android.net.Uri and
// openConnectionWithProxy() accepts a java.net.URI
diff --git a/mobile/android/base/java/org/mozilla/gecko/icons/loader/IconDownloader.java b/mobile/android/base/java/org/mozilla/gecko/icons/loader/IconDownloader.java
index 4a03d440556d..84eb7736e94e 100644
--- a/mobile/android/base/java/org/mozilla/gecko/icons/loader/IconDownloader.java
+++ b/mobile/android/base/java/org/mozilla/gecko/icons/loader/IconDownloader.java
@@ -12,6 +12,7 @@ import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.util.Log;
+import org.mozilla.gecko.AppConstants;
import org.mozilla.gecko.GeckoApplication;
import org.mozilla.gecko.icons.decoders.FaviconDecoder;
import org.mozilla.gecko.icons.decoders.LoadFaviconResult;
@@ -132,6 +133,11 @@ public class IconDownloader implements IconLoader {
return null;
}
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ return null;
+ }
+
HttpURLConnection connection = null;
try {
@@ -183,6 +189,11 @@ public class IconDownloader implements IconLoader {
@VisibleForTesting
@NonNull
HttpURLConnection connectTo(String uri) throws URISyntaxException, IOException {
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ throw new IOException();
+ }
+
final HttpURLConnection connection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(
new URI(uri));
diff --git a/mobile/android/base/java/org/mozilla/gecko/search/SearchEngineManager.java b/mobile/android/base/java/org/mozilla/gecko/search/SearchEngineManager.java
index eb1892ffdc6b..dbc3e7286d5a 100644
--- a/mobile/android/base/java/org/mozilla/gecko/search/SearchEngineManager.java
+++ b/mobile/android/base/java/org/mozilla/gecko/search/SearchEngineManager.java
@@ -379,6 +379,11 @@ public class SearchEngineManager implements SharedPreferences.OnSharedPreference
* @return String containing the country code
*/
private String fetchCountryCode() {
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOG_TAG, "This is Tor Browser. Skipping.");
+ return null;
+ }
+
// First, we look to see if we have a cached code.
final String region = GeckoSharedPrefs.forApp(context).getString(PREF_REGION_KEY, null);
if (region != null) {
diff --git a/mobile/android/base/java/org/mozilla/gecko/switchboard/SwitchBoard.java b/mobile/android/base/java/org/mozilla/gecko/switchboard/SwitchBoard.java
index e019c7d6eb77..1dc1b07aba5b 100644
--- a/mobile/android/base/java/org/mozilla/gecko/switchboard/SwitchBoard.java
+++ b/mobile/android/base/java/org/mozilla/gecko/switchboard/SwitchBoard.java
@@ -429,6 +429,12 @@ public class SwitchBoard {
HttpURLConnection connection = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferReader = null;
+
+ if (AppConstants.isTorBrowser()) {
+ Log.i(TAG, "This is Tor Browser. Skipping.");
+ return null;
+ }
+
try {
connection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(url.toURI());
connection.setRequestProperty("User-Agent", HardwareUtils.isTablet() ?
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java
index 352d349477e0..dead9dd26570 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java
@@ -31,6 +31,7 @@ import android.util.Log;
import org.mozilla.gecko.util.StringUtils;
import org.mozilla.gecko.util.ProxySelector;
+import org.mozilla.geckoview.BuildConfig;
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm {
@@ -483,6 +484,11 @@ public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm {
@Override
protected Void doInBackground(final Void... params) {
+ if (BuildConfig.TOR_BROWSER_VERSION != "") {
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
+ return null;
+ }
+
HttpURLConnection urlConnection = null;
BufferedReader in = null;
try {
diff --git a/mobile/android/geckoview/src/thirdparty/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java b/mobile/android/geckoview/src/thirdparty/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java
index 75e1f675c5eb..22e9e1ffcb9b 100644
--- a/mobile/android/geckoview/src/thirdparty/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java
+++ b/mobile/android/geckoview/src/thirdparty/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java
@@ -395,51 +395,56 @@ public class DefaultHttpDataSource implements HttpDataSource {
*/
private HttpURLConnection makeConnection(URL url, byte[] postBody, long position,
long length, boolean allowGzip, boolean followRedirects) throws IOException, URISyntaxException {
+ // AppConstants.isTorBrowser() is in base/, so it's not available in geckoview/
+ Log.i(TAG, "This is Tor Browser. Skipping.");
+ throw new IOException();
+
/**
* Tor Project modified the way the connection object was created. For the sake of
* simplicity, instead of duplicating the whole file we changed the connection object
* to use the ProxySelector.
*/
- HttpURLConnection connection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(url.toURI());
-
- connection.setConnectTimeout(connectTimeoutMillis);
- connection.setReadTimeout(readTimeoutMillis);
- if (defaultRequestProperties != null) {
- for (Map.Entry<String, String> property : defaultRequestProperties.getSnapshot().entrySet()) {
- connection.setRequestProperty(property.getKey(), property.getValue());
- }
- }
- for (Map.Entry<String, String> property : requestProperties.getSnapshot().entrySet()) {
- connection.setRequestProperty(property.getKey(), property.getValue());
- }
- if (!(position == 0 && length == C.LENGTH_UNSET)) {
- String rangeRequest = "bytes=" + position + "-";
- if (length != C.LENGTH_UNSET) {
- rangeRequest += (position + length - 1);
- }
- connection.setRequestProperty("Range", rangeRequest);
- }
- connection.setRequestProperty("User-Agent", userAgent);
- if (!allowGzip) {
- connection.setRequestProperty("Accept-Encoding", "identity");
- }
- connection.setInstanceFollowRedirects(followRedirects);
- connection.setDoOutput(postBody != null);
- if (postBody != null) {
- connection.setRequestMethod("POST");
- if (postBody.length == 0) {
- connection.connect();
- } else {
- connection.setFixedLengthStreamingMode(postBody.length);
- connection.connect();
- OutputStream os = connection.getOutputStream();
- os.write(postBody);
- os.close();
- }
- } else {
- connection.connect();
- }
- return connection;
+ /* Dead code */
+ //HttpURLConnection connection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(url.toURI());
+
+ //connection.setConnectTimeout(connectTimeoutMillis);
+ //connection.setReadTimeout(readTimeoutMillis);
+ //if (defaultRequestProperties != null) {
+ // for (Map.Entry<String, String> property : defaultRequestProperties.getSnapshot().entrySet()) {
+ // connection.setRequestProperty(property.getKey(), property.getValue());
+ // }
+ //}
+ //for (Map.Entry<String, String> property : requestProperties.getSnapshot().entrySet()) {
+ // connection.setRequestProperty(property.getKey(), property.getValue());
+ //}
+ //if (!(position == 0 && length == C.LENGTH_UNSET)) {
+ // String rangeRequest = "bytes=" + position + "-";
+ // if (length != C.LENGTH_UNSET) {
+ // rangeRequest += (position + length - 1);
+ // }
+ // connection.setRequestProperty("Range", rangeRequest);
+ //}
+ //connection.setRequestProperty("User-Agent", userAgent);
+ //if (!allowGzip) {
+ // connection.setRequestProperty("Accept-Encoding", "identity");
+ //}
+ //connection.setInstanceFollowRedirects(followRedirects);
+ //connection.setDoOutput(postBody != null);
+ //if (postBody != null) {
+ // connection.setRequestMethod("POST");
+ // if (postBody.length == 0) {
+ // connection.connect();
+ // } else {
+ // connection.setFixedLengthStreamingMode(postBody.length);
+ // connection.connect();
+ // OutputStream os = connection.getOutputStream();
+ // os.write(postBody);
+ // os.close();
+ // }
+ //} else {
+ // connection.connect();
+ //}
+ //return connection;
}
/**
diff --git a/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java b/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java
index 9b3ee98f89db..fc3248d72219 100644
--- a/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java
+++ b/mobile/android/stumbler/java/org/mozilla/mozstumbler/service/utils/AbstractCommunicator.java
@@ -68,6 +68,11 @@ public abstract class AbstractCommunicator {
}
private void openConnectionAndSetHeaders() {
+ if (AppConstants.isTorBrowser()) {
+ Log.i(LOG_TAG, "This is Tor Browser. Skipping.");
+ throw new Exception();
+ }
+
try {
Prefs prefs = Prefs.getInstanceWithoutContext();
if (sMozApiKey == null || prefs != null) {
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 28051 - Integrate Orbot and add dependencies
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit a627afad7b69ff3757fb791921d78281ad94c68b
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Nov 14 17:36:53 2018 +0000
Bug 28051 - Integrate Orbot and add dependencies
Also:
Bug 28051 - Launch Orbot if it isn't running in the background
Bug 28329 - Part 2. Implement checking if the Tor service is running
Bug 28329 - Part 3. Remove OrbotActivity dependency
Bug 28051 - Stop the background service when we're quitting
If the user swips away the app, then initiate quitting as if the user
selected Quit from the menu.
---
build.gradle | 4 +
mobile/android/app/build.gradle | 13 ++
mobile/android/base/AndroidManifest.xml.in | 8 ++
.../base/java/org/mozilla/gecko/BrowserApp.java | 142 +++++++++++++++++++++
.../base/java/org/mozilla/gecko/GeckoApp.java | 10 ++
.../java/org/mozilla/gecko/GeckoApplication.java | 5 +
mobile/android/config/proguard/proguard.cfg | 14 ++
7 files changed, 196 insertions(+)
diff --git a/build.gradle b/build.gradle
index 8b91888b5d7f..95dfc2ed1323 100644
--- a/build.gradle
+++ b/build.gradle
@@ -32,6 +32,10 @@ allprojects {
url repository
}
}
+ // These are needed for Orbot's dependencies
+ maven { url "https://raw.githubusercontent.com/guardianproject/gpmaven/master" }
+ maven { url 'https://jitpack.io' }
+ jcenter()
}
task downloadDependencies() {
diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle
index c6a0bc45d56f..be0ccdb1b13f 100644
--- a/mobile/android/app/build.gradle
+++ b/mobile/android/app/build.gradle
@@ -235,6 +235,14 @@ dependencies {
// to generate the `Application` class or fork the file on disk.
implementation "com.android.support:multidex:1.0.3"
+ // tor-android-services
+ implementation files('service-release.aar')
+ implementation files('jsocksAndroid-release.aar')
+
+ // Tor_Onion_Proxy_Library
+ implementation files('universal-0.0.3.jar')
+ implementation files('android-release.aar')
+
if (mozconfig.substs.MOZ_NATIVE_DEVICES) {
implementation "com.android.support:mediarouter-v7:$support_library_version"
implementation "com.google.android.gms:play-services-basement:$google_play_services_version"
@@ -277,6 +285,11 @@ dependencies {
// Including the Robotium JAR directly can cause issues with dexing.
androidTestImplementation 'com.jayway.android.robotium:robotium-solo:5.5.4'
+
+ // tor-android-service Dependencies
+ implementation 'net.freehaven.tor.control:jtorctl:0.2'
+ implementation 'org.slf4j:slf4j-api:1.7.25'
+ implementation 'org.slf4j:slf4j-android:1.7.25'
}
// TODO: (bug 1261486): This impl is not robust -
diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in
index 48809195dc57..c60210e0332c 100644
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -572,5 +572,13 @@
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
#endif
+ <!-- Define Orbotservice's TorService -->
+ <service
+ android:name="org.torproject.android.service.TorService"
+ android:enabled="true"
+ android:exported="false"
+ android:stopWithTask="true">
+ </service>
+
</application>
</manifest>
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
index 4123acca9bbe..e0ef8e9c43d9 100644
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -10,11 +10,13 @@ import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.DownloadManager;
+import android.content.BroadcastReceiver;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
@@ -40,6 +42,8 @@ import android.support.annotation.StringRes;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v4.view.MenuItemCompat;
import android.text.TextUtils;
@@ -176,6 +180,9 @@ import org.mozilla.geckoview.DynamicToolbarAnimator;
import org.mozilla.geckoview.DynamicToolbarAnimator.PinReason;
import org.mozilla.geckoview.GeckoSession;
+import org.torproject.android.service.TorService;
+import org.torproject.android.service.TorServiceConstants;
+
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -251,6 +258,8 @@ public class BrowserApp extends GeckoApp
private HomeScreen mHomeScreen;
private TabsPanel mTabsPanel;
+ private boolean mTorNeedsStart = true;
+
private boolean showSplashScreen = false;
private SplashScreen splashScreen;
/**
@@ -1013,6 +1022,130 @@ public class BrowserApp extends GeckoApp
.buildAndShow();
}
+ /**
+ * Send the service a request for the current status.
+ * The response is sent as a broadcast. Capture that in
+ * receiveTorIsStartedAsync().
+ */
+ private void requestTorIsStartedAsync() {
+ Intent torServiceStatus = new Intent(this, TorService.class);
+ torServiceStatus.setAction(TorServiceConstants.ACTION_STATUS);
+ startService(torServiceStatus);
+ }
+
+ private BroadcastReceiver mLocalBroadcastReceiver;
+ private Boolean mTorStatus;
+
+ /**
+ * Setup the status receiver for broadcasts from the service.
+ * The response is sent as a broadcast. Create a background thread
+ * for receiving/handling the broadcast.
+ *
+ * This method is coupled with receiveTorIsStartedAsync(). They should
+ * be used together.
+ */
+ private BroadcastReceiver setupReceiveTorIsStartedAsync() {
+
+ // Create a thread specifically for defining the BroadcastReceiver
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ mLocalBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action == null) {
+ return;
+ }
+
+ // We only want ACTION_STATUS messages
+ if (!action.equals(TorServiceConstants.ACTION_STATUS)) {
+ return;
+ }
+
+ // The current status has the EXTRA_STATUS key
+ String currentStatus =
+ intent.getStringExtra(TorServiceConstants.EXTRA_STATUS);
+
+ try {
+ synchronized (mTorStatus) {
+ mTorStatus = (currentStatus == TorServiceConstants.STATUS_ON);
+ mTorStatus.notify();
+ }
+ } catch (IllegalMonitorStateException e) {
+ // |synchronized| should prevent this
+ }
+ }
+ };
+
+ LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(BrowserApp.this);
+ lbm.registerReceiver(mLocalBroadcastReceiver,
+ new IntentFilter(TorServiceConstants.ACTION_STATUS));
+
+ }
+ }).start();
+
+ return mLocalBroadcastReceiver;
+ }
+
+ /**
+ * Receive the current status from the service.
+ * The response is sent as a broadcast. If it is not received within
+ * 1 second, then return false.
+ *
+ * This method is coupled with setupReceiveTorIsStartedAsync(). They
+ * should be used together.
+ */
+ private boolean receiveTorIsStartedAsync(BroadcastReceiver mLocalBroadcastReceiver, Boolean torStatus) {
+ // Wait until we're notified from the above thread, or we're
+ // interrupted by the timeout.
+ try {
+ // One thousand milliseconds = one second
+ final long oneSecTimeout = Math.round(Math.pow(10, 3));
+ synchronized (torStatus) {
+ // We wake from wait() because we reached the one second
+ // timeout, the BroadcastReceiver notified us, or we received
+ // a spurious wakeup. For all three cases, we can accept the
+ // current value of torStatus.
+ torStatus.wait(oneSecTimeout);
+ }
+ } catch (InterruptedException e) {
+ // ignore.
+ } catch (IllegalArgumentException e) {
+ // oneSecTimeout should never be negative
+ } catch (IllegalMonitorStateException e) {
+ // |synchronized| should take care of this
+ }
+
+ // Unregister the receiver
+ LocalBroadcastManager.getInstance(this).unregisterReceiver(mLocalBroadcastReceiver);
+
+ return torStatus;
+ }
+
+ /**
+ * Receive the current Tor status.
+ *
+ * Send a request for the current status and receive the response.
+ * Returns true if Tor is running, false otherwise.
+ *
+ * mTorStatus provides synchronization across threads.
+ */
+ private boolean checkTorIsStarted() {
+ // When tor is started, true. Otherwise, false
+ mTorStatus = false;
+ BroadcastReceiver br = setupReceiveTorIsStartedAsync();
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ requestTorIsStartedAsync();
+ }
+ }).start();
+
+ return receiveTorIsStartedAsync(br, mTorStatus);
+ }
+
private Class<?> getMediaPlayerManager() {
if (AppConstants.MOZ_MEDIA_PLAYER) {
try {
@@ -1124,6 +1257,13 @@ public class BrowserApp extends GeckoApp
for (BrowserAppDelegate delegate : delegates) {
delegate.onResume(this);
}
+
+ // isInAutomation is overloaded with isTorBrowser(), but here we actually
+ // need to know if we are in automation.
+ final SafeIntent intent = new SafeIntent(getIntent());
+ if (!IntentUtils.getIsInAutomationFromEnvironment(intent)) {
+ mTorNeedsStart = !checkTorIsStarted();
+ }
}
@Override
@@ -1641,6 +1781,8 @@ public class BrowserApp extends GeckoApp
MmaDelegate.flushResources(this);
+ mTorNeedsStart = true;
+
super.onDestroy();
}
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
index c988923e960f..e01318dab422 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -100,6 +100,8 @@ import org.mozilla.geckoview.GeckoViewBridge;
// SafeReceiver excluded at compile-time
//import org.mozilla.mozstumbler.service.mainthread.SafeReceiver;
+import org.torproject.android.service.TorService;
+
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
@@ -623,6 +625,9 @@ public abstract class GeckoApp extends GeckoActivity
EventDispatcher.getInstance().dispatch("Browser:Quit", res);
+ Intent torService = new Intent(this, TorService.class);
+ stopService(torService);
+
// We don't call shutdown here because this creates a race condition which
// can cause the clearing of private data to fail. Instead, we shut down the
// UI only after we're done sanitizing.
@@ -2236,6 +2241,11 @@ public abstract class GeckoApp extends GeckoActivity
GeckoApplication.shutdown(!mRestartOnShutdown ? null : new Intent(
Intent.ACTION_MAIN, /* uri */ null, getApplicationContext(), getClass()));
}
+
+ if (isFinishing()) {
+ Log.i(LOGTAG, "onDestroy() is finishing.");
+ quitAndClear();
+ }
}
public void showSDKVersionError() {
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
index dbd57d72ebc8..26e06b55ecfc 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java
@@ -74,6 +74,8 @@ import java.lang.reflect.Method;
import java.net.URL;
import java.util.UUID;
+import org.torproject.android.service.util.Prefs;
+
public class GeckoApplication extends Application
implements HapticFeedbackDelegate,
SharedPreferences.OnSharedPreferenceChangeListener {
@@ -402,6 +404,9 @@ public class GeckoApplication extends Application
"Profile:Create",
null);
+ // Give Orbot the base Context
+ Prefs.setContext(context);
+
super.onCreate();
}
diff --git a/mobile/android/config/proguard/proguard.cfg b/mobile/android/config/proguard/proguard.cfg
index 175ec85518d9..711e66c4bfc6 100644
--- a/mobile/android/config/proguard/proguard.cfg
+++ b/mobile/android/config/proguard/proguard.cfg
@@ -170,6 +170,20 @@
-dontwarn java.lang.management.**
-dontwarn javax.management.**
+# XXX 68rebase Are these still needed?
+# From https://github.com/square/okhttp/blob/master/okhttp/src/main/resources/META…
+# JSR 305 annotations are for embedding nullability information.
+-dontwarn javax.annotation.**
+
+# A resource is loaded with a relative path so the package of this class must be preserved.
+-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
+
+# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
+-dontwarn org.codehaus.mojo.animal_sniffer.*
+
+# OkHttp platform used only on JVM and when Conscrypt dependency is available.
+-dontwarn okhttp3.internal.platform.ConscryptPlatform
+
-include "adjust-keeps.cfg"
-include "leakcanary-keeps.cfg"
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 27016 - Create proxy connection during image download
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 9ccc623f7ecb6e1031a2e43dad0f71ea5c6d8119
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Thu Aug 2 21:49:05 2018 +0000
Bug 27016 - Create proxy connection during image download
Picasso, the image retrieval library used by Fennec, ignores the network
proxy configuration. We override the openConnection() method and create
the connection using the configured proxy.
---
.../java/org/mozilla/gecko/home/ImageLoader.java | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java b/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java
index 2bbd82a8df77..cbbe7babbba4 100644
--- a/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/ImageLoader.java
@@ -15,9 +15,14 @@ import com.squareup.picasso.Picasso;
import com.squareup.picasso.Downloader.Response;
import com.squareup.picasso.UrlConnectionDownloader;
+import org.mozilla.gecko.util.ProxySelector;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.util.EnumSet;
import java.util.Set;
@@ -84,6 +89,23 @@ public class ImageLoader {
this.distribution = distribution;
}
+ @Override
+ protected HttpURLConnection openConnection(Uri path) throws IOException {
+ try {
+ // This is annoying, but |path| is an android.net.Uri and
+ // openConnectionWithProxy() accepts a java.net.URI
+ return (HttpURLConnection)ProxySelector.openConnectionWithProxy(
+ new URI(
+ path.getScheme(), path.getHost(), path.getPath(),
+ path.getEncodedFragment()));
+ } catch (URISyntaxException ex) {
+ // And android.net.Uri is more lenient than java.net.URI.
+ // Uri does not catch syntax errors which URI may catch.
+ // We'll re-throw this as an IOException
+ throw new IOException(ex.getMessage());
+ }
+ }
+
private Density getDensity(float factor) {
final DisplayMetrics dm = context.getResources().getDisplayMetrics();
final float densityDpi = dm.densityDpi * factor;
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25906 - Imply false both Adjust and Leanplum configure options
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 9c37ba57b2167f6902dd4464bf174ba63e21b013
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Fri Aug 3 18:32:46 2018 +0000
Bug 25906 - Imply false both Adjust and Leanplum configure options
These configure options should be false already, because we set
|--without-google-play-services| in .mozconfig-android. But, this
is another layer of certainty.
---
mobile/android/torbrowser.configure | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/mobile/android/torbrowser.configure b/mobile/android/torbrowser.configure
index ac30fde888a6..8f3462982dc7 100644
--- a/mobile/android/torbrowser.configure
+++ b/mobile/android/torbrowser.configure
@@ -44,3 +44,8 @@ imply_option('MOZ_SERVICES_HEALTHREPORT', False)
imply_option('MOZ_ANDROID_NETWORK_STATE', False);
imply_option('MOZ_ANDROID_LOCATION', False);
+
+# Exclude Leanplum MMA (marketing automation and user behavior)
+imply_option('MOZ_ANDROID_MMA', False);
+# Exclude Adjust (installation tracking)
+imply_option('MOZ_INSTALL_TRACKING', False);
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 26528 - Don't allow Fennec to use UpdateService when installed through the app store
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 0f0feb2c29527d262bec46e0c02f8c3b0b72839f
Author: Igor Oliveira <igt0(a)torproject.org>
Date: Wed Jun 27 12:12:22 2018 -0300
Bug 26528 - Don't allow Fennec to use UpdateService when installed through the app store
App stores such as Google Play or F-Droid have their own update service.
The Fennec UpdateService should be used just when the user installs it
by themselves.
---
.../base/java/org/mozilla/gecko/preferences/GeckoPreferences.java | 4 ++--
.../base/java/org/mozilla/gecko/updater/UpdateServiceHelper.java | 2 +-
.../geckoview/src/main/java/org/mozilla/gecko/util/ContextUtils.java | 5 +++--
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferences.java b/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferences.java
index 3b9227e52e37..cd4a7ec48e1d 100644
--- a/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferences.java
+++ b/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferences.java
@@ -698,8 +698,8 @@ public class GeckoPreferences
i--;
continue;
}
- } else if (PREFS_UPDATER_AUTODOWNLOAD.equals(key)) {
- if (!AppConstants.MOZ_UPDATER || ContextUtils.isInstalledFromGooglePlay(this)) {
+ } else if (PREFS_UPDATER_AUTODOWNLOAD.equals(key)) {
+ if (!AppConstants.MOZ_UPDATER || ContextUtils.isInstalledFromAppStore(this)) {
preferences.removePreference(pref);
i--;
continue;
diff --git a/mobile/android/base/java/org/mozilla/gecko/updater/UpdateServiceHelper.java b/mobile/android/base/java/org/mozilla/gecko/updater/UpdateServiceHelper.java
index df66c914769d..4ea0b6c74f55 100644
--- a/mobile/android/base/java/org/mozilla/gecko/updater/UpdateServiceHelper.java
+++ b/mobile/android/base/java/org/mozilla/gecko/updater/UpdateServiceHelper.java
@@ -212,7 +212,7 @@ public class UpdateServiceHelper {
}
public static boolean isUpdaterEnabled(final Context context) {
- return AppConstants.MOZ_UPDATER && isEnabled && !ContextUtils.isInstalledFromGooglePlay(context);
+ return AppConstants.MOZ_UPDATER && isEnabled && !ContextUtils.isInstalledFromAppStore(context);
}
public static void setUpdateUrl(Context context, String url) {
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ContextUtils.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ContextUtils.java
index 4fb88ea41574..248763761378 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ContextUtils.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ContextUtils.java
@@ -17,6 +17,7 @@ import android.text.TextUtils;
public class ContextUtils {
private static final String INSTALLER_GOOGLE_PLAY = "com.android.vending";
+ private static final String INSTALLER_FDROID = "org.fdroid.fdroid";
private ContextUtils() {}
@@ -41,14 +42,14 @@ public class ContextUtils {
}
}
- public static boolean isInstalledFromGooglePlay(final Context context) {
+ public static boolean isInstalledFromAppStore(final Context context) {
final String installerPackageName = context.getPackageManager().getInstallerPackageName(context.getPackageName());
if (TextUtils.isEmpty(installerPackageName)) {
return false;
}
- return INSTALLER_GOOGLE_PLAY.equals(installerPackageName);
+ return INSTALLER_GOOGLE_PLAY.equals(installerPackageName) || INSTALLER_FDROID.equals(installerPackageName);
}
public static boolean isApplicationDebuggable(final @NonNull Context context) {
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Orfox: disable screenshots and prevent page from being in "recent apps"
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit bed3d6ecd21cb55c4acbad2b8735bb692e5a8b68
Author: Hans-Christoph Steiner <hans(a)eds.org>
Date: Sat Nov 21 00:10:06 2015 +0100
Orfox: disable screenshots and prevent page from being in "recent apps"
Signed-off-by: Amogh Pradeep <amoghbl1(a)gmail.com>
---
mobile/android/base/java/org/mozilla/gecko/GeckoApp.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
index 246ce55d0d23..9143536400e3 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -84,6 +84,7 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.Window;
+import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
@@ -1099,6 +1100,9 @@ public abstract class GeckoApp extends GeckoActivity
super.onCreate(savedInstanceState);
+ // disable screenshots and pic in "recent apps"
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
+
setContentView(getLayout());
// Set up Gecko layout.
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Orfox: hook up default panic trigger to "quit and clear"
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit bd41c7cefcc3e36c45d780b8c03f1d369f8ad4e1
Author: Hans-Christoph Steiner <hans(a)eds.org>
Date: Sat Nov 21 00:24:09 2015 +0100
Orfox: hook up default panic trigger to "quit and clear"
Signed-off-by: Amogh Pradeep <amoghbl1(a)gmail.com>
Also:
Bug 28507: Implement fallback to delete private data in the browser startup
When the TBA is forcefully closed, its private data is not deleted,
even if the history.clear_on_exit is set.
As fallback, this patch calls the Sanitize:ClearData event in the
browser startup to clean the private data if needed.
---
mobile/android/base/AndroidManifest.xml.in | 7 +++
.../base/java/org/mozilla/gecko/GeckoApp.java | 72 ++++++++++++++--------
2 files changed, 52 insertions(+), 27 deletions(-)
diff --git a/mobile/android/base/AndroidManifest.xml.in b/mobile/android/base/AndroidManifest.xml.in
index e61a3411b2e0..48809195dc57 100644
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -171,6 +171,13 @@
<data android:pathPattern=".*\\.xpi" />
</intent-filter>
+ <!-- receive triggers from panickit apps -->
+ <intent-filter>
+ <action android:name="info.guardianproject.panic.action.TRIGGER" />
+
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+
#ifdef MOZ_ANDROID_BEAM
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
index 9143536400e3..c988923e960f 100644
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java
@@ -139,6 +139,7 @@ public abstract class GeckoApp extends GeckoActivity
public static final String ACTION_INIT_PW = "org.mozilla.gecko.INIT_PW";
public static final String ACTION_SWITCH_TAB = "org.mozilla.gecko.SWITCH_TAB";
public static final String ACTION_SHUTDOWN = "org.mozilla.gecko.SHUTDOWN";
+ public static final String ACTION_PANIC_TRIGGER = "info.guardianproject.panic.action.TRIGGER";
public static final String INTENT_REGISTER_STUMBLER_LISTENER = "org.mozilla.gecko.STUMBLER_REGISTER_LOCAL_LISTENER";
@@ -581,42 +582,50 @@ public abstract class GeckoApp extends GeckoActivity
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.quit) {
- // Make sure the Guest Browsing notification goes away when we quit.
- GuestSession.hideNotification(this);
+ quitAndClear();
+ return true;
+ }
- final SharedPreferences prefs = getSharedPreferencesForProfile();
- final Set<String> clearSet = PrefUtils.getStringSet(
- prefs, ClearOnShutdownPref.PREF, new HashSet<String>());
+ return super.onOptionsItemSelected(item);
+ }
- final GeckoBundle clearObj = new GeckoBundle(clearSet.size());
- for (final String clear : clearSet) {
- clearObj.putBoolean(clear, true);
- }
+ private GeckoBundle createSanitizeData() {
+ final SharedPreferences prefs = getSharedPreferencesForProfile();
+ final Set<String> clearSet = PrefUtils.getStringSet(
+ prefs, ClearOnShutdownPref.PREF, new HashSet<String>());
- final GeckoBundle res = new GeckoBundle(2);
- res.putBundle("sanitize", clearObj);
+ final GeckoBundle clearObj = new GeckoBundle(clearSet.size());
+ for (final String clear : clearSet) {
+ clearObj.putBoolean(clear, true);
+ }
+ return clearObj;
+ }
- // If the user wants to clear open tabs, or else has opted out of session
- // restore and does want to clear history, we also want to prevent the current
- // session info from being saved.
- if (clearObj.containsKey("private.data.openTabs")) {
- res.putBoolean("dontSaveSession", true);
- } else if (clearObj.containsKey("private.data.history")) {
+ private void quitAndClear() {
+ // Make sure the Guest Browsing notification goes away when we quit.
+ GuestSession.hideNotification(this);
- final String sessionRestore =
- getSessionRestorePreference(getSharedPreferences());
- res.putBoolean("dontSaveSession", "quit".equals(sessionRestore));
- }
+ final GeckoBundle clearObj = createSanitizeData();
+ final GeckoBundle res = new GeckoBundle(2);
+ res.putBundle("sanitize", clearObj);
- EventDispatcher.getInstance().dispatch("Browser:Quit", res);
+ // If the user wants to clear open tabs, or else has opted out of session
+ // restore and does want to clear history, we also want to prevent the current
+ // session info from being saved.
+ if (clearObj.containsKey("private.data.openTabs")) {
+ res.putBoolean("dontSaveSession", true);
+ } else if (clearObj.containsKey("private.data.history")) {
- // We don't call shutdown here because this creates a race condition which
- // can cause the clearing of private data to fail. Instead, we shut down the
- // UI only after we're done sanitizing.
- return true;
+ final String sessionRestore =
+ getSessionRestorePreference(getSharedPreferences());
+ res.putBoolean("dontSaveSession", "quit".equals(sessionRestore));
}
- return super.onOptionsItemSelected(item);
+ EventDispatcher.getInstance().dispatch("Browser:Quit", res);
+
+ // We don't call shutdown here because this creates a race condition which
+ // can cause the clearing of private data to fail. Instead, we shut down the
+ // UI only after we're done sanitizing.
}
@Override
@@ -1160,6 +1169,13 @@ public abstract class GeckoApp extends GeckoActivity
mTextSelection.create();
final Bundle finalSavedInstanceState = savedInstanceState;
+
+ // When the browser is forcefully closed, its private data is not
+ // deleted, even if the history.clear_on_exit is set. Here we are calling
+ // the Sanitize:ClearData in the startup to make sure the private
+ // data was cleared.
+ EventDispatcher.getInstance().dispatch("Sanitize:ClearData", createSanitizeData());
+
ThreadUtils.postToBackgroundThread(new Runnable() {
@Override
public void run() {
@@ -1602,6 +1618,8 @@ public abstract class GeckoApp extends GeckoActivity
// Copy extras.
settingsIntent.putExtras(intent.getUnsafe());
startActivity(settingsIntent);
+ } else if (ACTION_PANIC_TRIGGER.equals(action)) {
+ quitAndClear();
}
mPromptService = new PromptService(this, getAppEventDispatcher());
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25696 - Implement alpha onboarding for Tor Browser for Android
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit 11c49bccc023231db699b8bef6c6d98681ae4c87
Author: Igor Oliveira <igt0(a)torproject.org>
Date: Mon Aug 6 00:12:26 2018 -0300
Bug 25696 - Implement alpha onboarding for Tor Browser for Android
- FirstrunTorPagerConfig.java: Create file that sets up all the views
in the pager.
- FirstrunPager.java: Update code to use the FirstrunTorPagerConfig.
- FirstrunLastPanel.java: Create view that adds a close handler in the
latest pager view.
Also:
Bug 25696 - Design of alpha onboarding for Tor Browser for Android
Bug 27125 - Move localized Tor Browser for Android strings into separate file
---
.../res/layout/firstrun_animation_container.xml | 10 +--
.../firstrun_basepanel_checkable_fragment.xml | 34 +++++----
mobile/android/app/src/main/res/values/colors.xml | 3 +
mobile/android/app/src/main/res/values/styles.xml | 7 ++
.../mozilla/gecko/firstrun/FirstrunLastPanel.java | 30 ++++++++
.../org/mozilla/gecko/firstrun/FirstrunPager.java | 18 ++---
.../gecko/firstrun/FirstrunPagerConfig.java | 1 +
.../org/mozilla/gecko/firstrun/FirstrunPanel.java | 2 +
.../gecko/firstrun/FirstrunTorPagerConfig.java | 81 +++++++++++++++++++++
.../java/org/mozilla/gecko/firstrun/LastPanel.java | 7 +-
.../android/base/locales/en-US/android_strings.dtd | 2 +-
.../base/locales/en-US/torbrowser_strings.dtd | 26 +++++++
mobile/android/base/strings.xml.in | 32 +++++++-
.../alpha/res/drawable-nodpi/figure_experience.png | Bin 0 -> 44299 bytes
.../alpha/res/drawable-nodpi/figure_network.png | Bin 0 -> 70302 bytes
.../alpha/res/drawable-nodpi/figure_onion.png | Bin 0 -> 139952 bytes
.../alpha/res/drawable-nodpi/figure_privacy.png | Bin 0 -> 61696 bytes
.../alpha/res/drawable-nodpi/figure_security.png | Bin 0 -> 52021 bytes
.../alpha/res/drawable-nodpi/figure_welcome.png | Bin 0 -> 83798 bytes
.../drawable-nodpi/home_tab_menu_strip_tor.9.png | Bin 0 -> 126 bytes
.../res/drawable-nodpi/figure_experience.png | Bin 0 -> 44299 bytes
.../nightly/res/drawable-nodpi/figure_network.png | Bin 0 -> 70302 bytes
.../nightly/res/drawable-nodpi/figure_onion.png | Bin 0 -> 139952 bytes
.../nightly/res/drawable-nodpi/figure_privacy.png | Bin 0 -> 61696 bytes
.../nightly/res/drawable-nodpi/figure_security.png | Bin 0 -> 52021 bytes
.../nightly/res/drawable-nodpi/figure_welcome.png | Bin 0 -> 83798 bytes
.../drawable-nodpi/home_tab_menu_strip_tor.9.png | Bin 0 -> 126 bytes
.../res/drawable-nodpi/figure_experience.png | Bin 0 -> 44299 bytes
.../official/res/drawable-nodpi/figure_network.png | Bin 0 -> 70302 bytes
.../official/res/drawable-nodpi/figure_onion.png | Bin 0 -> 139952 bytes
.../official/res/drawable-nodpi/figure_privacy.png | Bin 0 -> 61696 bytes
.../res/drawable-nodpi/figure_security.png | Bin 0 -> 52021 bytes
.../official/res/drawable-nodpi/figure_welcome.png | Bin 0 -> 83798 bytes
.../drawable-nodpi/home_tab_menu_strip_tor.9.png | Bin 0 -> 126 bytes
34 files changed, 215 insertions(+), 38 deletions(-)
diff --git a/mobile/android/app/src/main/res/layout/firstrun_animation_container.xml b/mobile/android/app/src/main/res/layout/firstrun_animation_container.xml
index 3e7225365c57..dd20466a8e1a 100644
--- a/mobile/android/app/src/main/res/layout/firstrun_animation_container.xml
+++ b/mobile/android/app/src/main/res/layout/firstrun_animation_container.xml
@@ -8,7 +8,7 @@
xmlns:gecko="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent"
- android:background="@color/dark_transparent_overlay">
+ android:background="@android:color/white">
<org.mozilla.gecko.firstrun.FirstrunPager
android:id="@+id/firstrun_pager"
@@ -18,12 +18,12 @@
<org.mozilla.gecko.home.TabMenuStrip android:layout_width="match_parent"
android:layout_height="@dimen/tabs_strip_height"
- android:background="@color/firstrun_pager_header"
+ android:background="@android:color/white"
android:visibility="visible"
android:layout_gravity="top"
- gecko:strip="@drawable/home_tab_menu_strip"
- gecko:activeTextColor="@color/placeholder_grey"
- gecko:inactiveTextColor="@color/tab_text_color"
+ gecko:strip="@drawable/home_tab_menu_strip_tor"
+ gecko:activeTextColor="@color/tor_tab_active_text"
+ gecko:inactiveTextColor="@color/tor_tab_inactive_text"
gecko:tabsMarginLeft="@dimen/firstrun_tab_strip_content_start" />
</org.mozilla.gecko.firstrun.FirstrunPager>
diff --git a/mobile/android/app/src/main/res/layout/firstrun_basepanel_checkable_fragment.xml b/mobile/android/app/src/main/res/layout/firstrun_basepanel_checkable_fragment.xml
index 700ab20663ce..b0083511ae0d 100644
--- a/mobile/android/app/src/main/res/layout/firstrun_basepanel_checkable_fragment.xml
+++ b/mobile/android/app/src/main/res/layout/firstrun_basepanel_checkable_fragment.xml
@@ -13,31 +13,37 @@
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/firstrun_min_height"
- android:background="@color/about_page_header_grey"
+ android:background="@color/tor_description_background_text"
android:gravity="center_horizontal"
android:orientation="vertical">
- <ImageView android:id="@+id/firstrun_image"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/firstrun_background_height"
- android:layout_marginTop="30dp"
- android:layout_marginBottom="18dp"
- android:scaleType="fitCenter"
- android:layout_gravity="center"
- android:adjustViewBounds="true"/>
+ <LinearLayout android:layout_width="match_parent"
+ android:layout_height="@dimen/firstrun_background_height"
+ android:background="@android:color/white"
+ android:gravity="center"
+ android:layout_gravity="center">
+
+ <ImageView android:id="@+id/firstrun_image"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:scaleType="fitCenter"
+ android:layout_gravity="center"
+ android:adjustViewBounds="true"/>
+ </LinearLayout>
<TextView android:id="@+id/firstrun_text"
android:layout_width="@dimen/firstrun_content_width"
android:layout_height="wrap_content"
- android:gravity="center"
+ android:gravity="left"
android:textAppearance="@style/TextAppearance.FirstrunLight.Main"/>
<TextView android:id="@+id/firstrun_subtext"
android:layout_width="@dimen/firstrun_content_width"
android:layout_height="wrap_content"
android:paddingTop="20dp"
- android:gravity="center"
- android:textAppearance="@style/TextAppearance.FirstrunRegular.Body"/>
+ android:gravity="left"
+ android:lineSpacingExtra="5dp"
+ android:textAppearance="@style/TextAppearance.FirstrunTorRegular.Body"/>
<android.support.v7.widget.SwitchCompat
android:id="@+id/firstrun_switch"
@@ -47,10 +53,10 @@
android:visibility="invisible"/>
<TextView android:id="@+id/firstrun_link"
- android:layout_width="wrap_content"
+ android:layout_width="@dimen/firstrun_content_width"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
- android:gravity="center"
+ android:gravity="left"
android:textAppearance="@style/TextAppearance.Link"
android:textAllCaps="true"
android:text="@string/firstrun_button_next"/>
diff --git a/mobile/android/app/src/main/res/values/colors.xml b/mobile/android/app/src/main/res/values/colors.xml
index d1be54da0233..f31f0e73198f 100644
--- a/mobile/android/app/src/main/res/values/colors.xml
+++ b/mobile/android/app/src/main/res/values/colors.xml
@@ -151,6 +151,9 @@
<color name="url_bar_shadow_private">#272727</color>
+ <color name="tor_tab_inactive_text">#484848</color>
+ <color name="tor_tab_active_text">#7D4698</color>
+ <color name="tor_description_background_text">#FAFAFA</color>
<!-- Restricted profiles palette -->
<color name="restricted_profile_background_gold">#ffffcb51</color>
diff --git a/mobile/android/app/src/main/res/values/styles.xml b/mobile/android/app/src/main/res/values/styles.xml
index 033aec05c806..a669933fca01 100644
--- a/mobile/android/app/src/main/res/values/styles.xml
+++ b/mobile/android/app/src/main/res/values/styles.xml
@@ -730,6 +730,7 @@
<style name="TextAppearance.FirstrunLight"/>
<style name="TextAppearance.FirstrunRegular"/>
+ <style name="TextAppearance.FirstrunTorRegular"/>
<style name="TextAppearance.FirstrunLight.Main">
<item name="android:textSize">20sp</item>
@@ -742,6 +743,12 @@
<item name="android:lineSpacingMultiplier">1.25</item>
</style>
+ <style name="TextAppearance.FirstrunTorRegular.Body">
+ <item name="android:textSize">16sp</item>
+ <item name="android:textColor">@color/ob_subtitle</item>
+ <item name="android:lineSpacingMultiplier">2</item>
+ </style>
+
<style name="TextAppearance.Link">
<item name="android:textSize">16sp</item>
<item name="android:textColor">@color/ob_click</item>
diff --git a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunLastPanel.java b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunLastPanel.java
new file mode 100644
index 000000000000..37ccda25d328
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunLastPanel.java
@@ -0,0 +1,30 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.firstrun;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import org.mozilla.gecko.R;
+
+public class FirstrunLastPanel extends FirstrunPanel {
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
+ final ViewGroup root = (ViewGroup) super.onCreateView(inflater, container, savedInstance);
+
+ root.findViewById(R.id.firstrun_link).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ close();
+ }
+ });
+
+ return root;
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPager.java b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPager.java
index 01668978fa7b..d9465dd1939c 100644
--- a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPager.java
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPager.java
@@ -65,15 +65,7 @@ public class FirstrunPager extends RtlViewPager {
public void load(Context appContext, FragmentManager fm, final boolean useLocalValues,
final FirstrunAnimationContainer.OnFinishListener onFinishListener) {
- final List<FirstrunPagerConfig.FirstrunPanelConfig> panels;
-
- if (Restrictions.isRestrictedProfile(appContext)) {
- panels = FirstrunPagerConfig.getRestricted(appContext);
- } else if (FirefoxAccounts.firefoxAccountsExist(appContext)) {
- panels = FirstrunPagerConfig.forFxAUser(appContext, useLocalValues);
- } else {
- panels = FirstrunPagerConfig.getDefault(appContext, useLocalValues);
- }
+ final List<FirstrunTorPagerConfig.FirstrunTorPanelConfig> panels = FirstrunTorPagerConfig.getDefault(appContext);
setAdapter(new ViewPagerAdapter(fm, panels));
this.pagerNavigation = new FirstrunPanel.PagerNavigation() {
@@ -137,14 +129,14 @@ public class FirstrunPager extends RtlViewPager {
}
protected class ViewPagerAdapter extends FragmentPagerAdapter {
- private final List<FirstrunPagerConfig.FirstrunPanelConfig> panels;
+ private final List<FirstrunTorPagerConfig.FirstrunTorPanelConfig> panels;
private final Fragment[] fragments;
- public ViewPagerAdapter(FragmentManager fm, List<FirstrunPagerConfig.FirstrunPanelConfig> panels) {
+ public ViewPagerAdapter(FragmentManager fm, List<FirstrunTorPagerConfig.FirstrunTorPanelConfig> panels) {
super(fm);
this.panels = panels;
this.fragments = new Fragment[panels.size()];
- for (FirstrunPagerConfig.FirstrunPanelConfig panel : panels) {
+ for (FirstrunTorPagerConfig.FirstrunTorPanelConfig panel : panels) {
mDecor.onAddPagerView(panel.getTitle());
}
@@ -157,7 +149,7 @@ public class FirstrunPager extends RtlViewPager {
public Fragment getItem(int i) {
Fragment fragment = this.fragments[i];
if (fragment == null) {
- FirstrunPagerConfig.FirstrunPanelConfig panelConfig = panels.get(i);
+ FirstrunTorPagerConfig.FirstrunTorPanelConfig panelConfig = panels.get(i);
fragment = Fragment.instantiate(context, panelConfig.getClassname(), panelConfig.getArgs());
((FirstrunPanel) fragment).setPagerNavigation(pagerNavigation);
fragments[i] = fragment;
diff --git a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPagerConfig.java b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPagerConfig.java
index 2e5f54f3bd79..d04d179cdd0b 100644
--- a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPagerConfig.java
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPagerConfig.java
@@ -20,6 +20,7 @@ class FirstrunPagerConfig {
static final String KEY_IMAGE = "panelImage";
static final String KEY_MESSAGE = "panelMessage";
static final String KEY_SUBTEXT = "panelDescription";
+ static final String KEY_CTATEXT = "panelCtaText";
static List<FirstrunPanelConfig> getDefault(Context context, final boolean useLocalValues) {
final List<FirstrunPanelConfig> panels = new LinkedList<>();
diff --git a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPanel.java b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPanel.java
index 23f05ce23800..d9a3b06c88f8 100644
--- a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPanel.java
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunPanel.java
@@ -36,10 +36,12 @@ public class FirstrunPanel extends Fragment {
final int image = args.getInt(FirstrunPagerConfig.KEY_IMAGE);
final String message = args.getString(FirstrunPagerConfig.KEY_MESSAGE);
final String subtext = args.getString(FirstrunPagerConfig.KEY_SUBTEXT);
+ final String ctatext = args.getString(FirstrunPagerConfig.KEY_CTATEXT);
((ImageView) root.findViewById(R.id.firstrun_image)).setImageDrawable(getResources().getDrawable(image));
((TextView) root.findViewById(R.id.firstrun_text)).setText(message);
((TextView) root.findViewById(R.id.firstrun_subtext)).setText(subtext);
+ ((TextView) root.findViewById(R.id.firstrun_link)).setText(ctatext);
final TextView messageView = root.findViewById(R.id.firstrun_text);
if (NO_MESSAGE.equals(message)) {
diff --git a/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunTorPagerConfig.java b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunTorPagerConfig.java
new file mode 100644
index 000000000000..9881ba01dda3
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/FirstrunTorPagerConfig.java
@@ -0,0 +1,81 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.firstrun;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+import org.mozilla.gecko.GeckoSharedPrefs;
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.Telemetry;
+import org.mozilla.gecko.TelemetryContract;
+import org.mozilla.gecko.Experiments;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class FirstrunTorPagerConfig {
+ public static final String LOGTAG = "FirstrunPagerConfigTor";
+
+ public static final String KEY_IMAGE = "panelImage";
+ public static final String KEY_MESSAGE = "panelMessage";
+ public static final String KEY_SUBTEXT = "panelDescription";
+ public static final String KEY_CTATEXT = "panelCtaText";
+
+ private static Context mContext;
+
+ public static List<FirstrunTorPanelConfig> getDefault(Context context) {
+ mContext = context;
+ final List<FirstrunTorPanelConfig> panels = new LinkedList<>();
+ panels.add(SimplePanelConfigs.welcomeTorPanelConfig);
+ panels.add(SimplePanelConfigs.privacyPanelConfig);
+ panels.add(SimplePanelConfigs.torNetworkPanelConfig);
+ panels.add(SimplePanelConfigs.secSettingsPanelConfig);
+ panels.add(SimplePanelConfigs.tipsPanelConfig);
+ panels.add(SimplePanelConfigs.onionServicesPanelConfig);
+
+ return panels;
+ }
+
+ public static class FirstrunTorPanelConfig {
+
+ private String classname;
+ private String title;
+ private Bundle args;
+
+ public FirstrunTorPanelConfig(String classname, int title, int image, int message, int subtext, int ctatext) {
+ this.classname = classname;
+ this.title = mContext.getResources().getString(title);
+
+ this.args = new Bundle();
+ this.args.putInt(KEY_IMAGE, image);
+ this.args.putString(KEY_MESSAGE, mContext.getResources().getString(message));
+ this.args.putString(KEY_SUBTEXT, mContext.getResources().getString(subtext));
+ this.args.putString(KEY_CTATEXT, mContext.getResources().getString(ctatext));
+ }
+
+ public String getClassname() {
+ return this.classname;
+ }
+
+ public String getTitle() {
+ return this.title;
+ }
+
+ public Bundle getArgs() {
+ return args;
+ }
+ }
+
+ private static class SimplePanelConfigs {
+ public static final FirstrunTorPanelConfig welcomeTorPanelConfig = new FirstrunTorPanelConfig(FirstrunPanel.class.getName(), R.string.firstrun_welcome_tab_title, R.drawable.figure_welcome, R.string.firstrun_welcome_title, R.string.firstrun_welcome_message, R.string.firstrun_welcome_next);
+ public static final FirstrunTorPanelConfig privacyPanelConfig = new FirstrunTorPanelConfig(FirstrunPanel.class.getName(), R.string.firstrun_privacy_tab_title, R.drawable.figure_privacy, R.string.firstrun_privacy_title, R.string.firstrun_privacy_message, R.string.firstrun_privacy_next);
+ public static final FirstrunTorPanelConfig torNetworkPanelConfig = new FirstrunTorPanelConfig(FirstrunPanel.class.getName(), R.string.firstrun_tornetwork_tab_title, R.drawable.figure_network, R.string.firstrun_tornetwork_title, R.string.firstrun_tornetwork_message, R.string.firstrun_tornetwork_next);
+ public static final FirstrunTorPanelConfig secSettingsPanelConfig = new FirstrunTorPanelConfig(FirstrunPanel.class.getName(), R.string.firstrun_secsettings_tab_title, R.drawable.figure_security, R.string.firstrun_secsettings_title, R.string.firstrun_secsettings_message, R.string.firstrun_secsettings_next);
+ public static final FirstrunTorPanelConfig tipsPanelConfig = new FirstrunTorPanelConfig(FirstrunPanel.class.getName(), R.string.firstrun_tips_tab_title, R.drawable.figure_experience, R.string.firstrun_tips_title, R.string.firstrun_tips_message, R.string.firstrun_tips_next);
+ public static final FirstrunTorPanelConfig onionServicesPanelConfig = new FirstrunTorPanelConfig(LastPanel.class.getName(), R.string.firstrun_onionservices_tab_title, R.drawable.figure_onion, R.string.firstrun_onionservices_title, R.string.firstrun_onionservices_message, R.string.firstrun_onionservices_next);
+ }
+}
diff --git a/mobile/android/base/java/org/mozilla/gecko/firstrun/LastPanel.java b/mobile/android/base/java/org/mozilla/gecko/firstrun/LastPanel.java
index 54d99a3ceeda..55e262eea476 100644
--- a/mobile/android/base/java/org/mozilla/gecko/firstrun/LastPanel.java
+++ b/mobile/android/base/java/org/mozilla/gecko/firstrun/LastPanel.java
@@ -7,6 +7,7 @@ package org.mozilla.gecko.firstrun;
import android.graphics.Bitmap;
import android.os.Bundle;
+import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -14,8 +15,6 @@ import android.widget.ImageView;
import android.widget.TextView;
import org.mozilla.gecko.R;
-import org.mozilla.gecko.Telemetry;
-import org.mozilla.gecko.TelemetryContract;
public class LastPanel extends FirstrunPanel {
@Override
@@ -26,10 +25,11 @@ public class LastPanel extends FirstrunPanel {
final int image = args.getInt(FirstrunPagerConfig.KEY_IMAGE);
final String message = args.getString(FirstrunPagerConfig.KEY_MESSAGE);
final String subtext = args.getString(FirstrunPagerConfig.KEY_SUBTEXT);
+ final String ctatext = args.getString(FirstrunPagerConfig.KEY_CTATEXT);
((ImageView) root.findViewById(R.id.firstrun_image)).setImageDrawable(getResources().getDrawable(image));
((TextView) root.findViewById(R.id.firstrun_subtext)).setText(subtext);
- ((TextView) root.findViewById(R.id.firstrun_link)).setText(R.string.firstrun_welcome_button_browser);
+ ((TextView) root.findViewById(R.id.firstrun_link)).setText(ctatext);
final TextView messageView = root.findViewById(R.id.firstrun_text);
if (NO_MESSAGE.equals(message)) {
@@ -42,7 +42,6 @@ public class LastPanel extends FirstrunPanel {
root.findViewById(R.id.firstrun_link).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.BUTTON, "firstrun-next");
close();
}
});
diff --git a/mobile/android/base/locales/en-US/android_strings.dtd b/mobile/android/base/locales/en-US/android_strings.dtd
index 643818d2bc7a..0e67ce1ce628 100644
--- a/mobile/android/base/locales/en-US/android_strings.dtd
+++ b/mobile/android/base/locales/en-US/android_strings.dtd
@@ -8,7 +8,7 @@
<!ENTITY firstrun_urlbar_subtext2 "A modern mobile browser from Mozilla, the non-profit committed to a free and open web.">
<!ENTITY newfirstrun_urlbar_subtext "Fast, private, and on your side.">
<!ENTITY firstrun_panel_title_privacy "Privacy">
-<!ENTITY firstrun_privacy_message "Browse like no one\'s watching">
+<!--!ENTITY firstrun_privacy_message "Browse like no one\'s watching"-->
<!ENTITY firstrun_privacy_subtext "Private Browsing with Tracking Protection blocks trackers while you browse and won’t remember your history when you finish browsing.">
<!ENTITY newfirstrun_privacy_subtext "Private browsing blocks ad trackers that follow you online.">
<!ENTITY firstrun_panel_title_customize "Customize">
diff --git a/mobile/android/base/locales/en-US/torbrowser_strings.dtd b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
index b43134a0260b..f5a2ad2cd7fd 100644
--- a/mobile/android/base/locales/en-US/torbrowser_strings.dtd
+++ b/mobile/android/base/locales/en-US/torbrowser_strings.dtd
@@ -4,4 +4,30 @@
<!ENTITY firstrun_urlbar_subtext2 "A modern mobile browser from The Tor Project, the non-profit committed to a free and open web.">
+<!-- Location note: Tor First run messages -->
+<!ENTITY firstrun_welcome_tab_title "Welcome">
+<!ENTITY firstrun_welcome_title "You\'re ready.">
+<!ENTITY firstrun_welcome_message "Tor Browser offers the highest standard of privacy and security while browsing the web. You\'re now protected against tracking, surveillance, and censorship. This quick onboarding will show you how.">
+<!ENTITY firstrun_welcome_next "Start now">
+<!ENTITY firstrun_privacy_tab_title "Privacy">
+<!ENTITY firstrun_privacy_title "Snub trackers and snoopers.">
+<!ENTITY firstrun_privacy_message "Tor Browser isolates cookies and deletes your browser history after your session. These modifications ensure your privacy and security are protected in the browser. Click ‘Tor Network’ to learn how we protect you on the network level.">
+<!ENTITY firstrun_privacy_next "Go to Tor Network">
+<!ENTITY firstrun_tornetwork_tab_title "Tor Network">
+<!ENTITY firstrun_tornetwork_title "Travel a decentralized network.">
+<!ENTITY firstrun_tornetwork_message "Tor Browser connects you to the Tor network run by thousands of volunteers around the world. Unlike a VPN, there\'s no one point of failure or centralized entity you need to trust in order to enjoy the internet privately.">
+<!ENTITY firstrun_tornetwork_next "Next">
+<!ENTITY firstrun_secsettings_tab_title "Security">
+<!ENTITY firstrun_secsettings_title "Choose your experience.">
+<!ENTITY firstrun_secsettings_message "We also provide you with additional settings for bumping up your browser security. Our Security Settings allow you to block elements that could be used to attack your computer.">
+<!ENTITY firstrun_secsettings_next "Next">
+<!ENTITY firstrun_tips_tab_title "Tips">
+<!ENTITY firstrun_tips_title "Experience Tips.">
+<!ENTITY firstrun_tips_message "With all the security and privacy features provided by Tor, your experience while browsing the internet may be a little different. Things may be a bit slower and depending on your security level, some elements may not work or load. You may also be asked to prove you are a human and not a robot.">
+<!ENTITY firstrun_tips_next "Next">
+<!ENTITY firstrun_onionservices_tab_title "Onions">
+<!ENTITY firstrun_onionservices_title "Onion Services.">
+<!ENTITY firstrun_onionservices_message "Onion services are sites that end with a .onion that provide extra protections to publishers and visitors, including added safeguards against censorship. Onion services allow anyone to provide content and services anonymously.">
+<!ENTITY firstrun_onionservices_next "Go to explore">
+
<!ENTITY sync_not_supported "Sync is not currently supported in Tor Browser on Android">
diff --git a/mobile/android/base/strings.xml.in b/mobile/android/base/strings.xml.in
index 5453bed65e71..546dc31eb9c1 100644
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -34,7 +34,7 @@
<string name="firstrun_urlbar_subtext">&firstrun_urlbar_subtext2;</string>
<string name="newfirstrun_urlbar_subtext">&newfirstrun_urlbar_subtext;</string>
<string name="firstrun_panel_title_privacy">&firstrun_panel_title_privacy;</string>
- <string name="firstrun_privacy_message">&firstrun_privacy_message;</string>
+ <!--string name="firstrun_privacy_message">&firstrun_privacy_message;</string-->
<string name="firstrun_privacy_subtext">&firstrun_privacy_subtext;</string>
<string name="newfirstrun_privacy_subtext">&newfirstrun_privacy_subtext;</string>
<string name="firstrun_panel_title_customize">&firstrun_panel_title_customize;</string>
@@ -56,6 +56,36 @@
<string name="sync_not_supported">&sync_not_supported;</string>
+ <string name="firstrun_welcome_tab_title">&firstrun_welcome_tab_title;</string>
+ <string name="firstrun_welcome_title">&firstrun_welcome_title;</string>
+ <string name="firstrun_welcome_message">&firstrun_welcome_message;</string>
+ <string name="firstrun_welcome_next">&firstrun_welcome_next;</string>
+
+ <string name="firstrun_privacy_tab_title">&firstrun_privacy_tab_title;</string>
+ <string name="firstrun_privacy_title">&firstrun_privacy_title;</string>
+ <string name="firstrun_privacy_message">&firstrun_privacy_message;</string>
+ <string name="firstrun_privacy_next">&firstrun_privacy_next;</string>
+
+ <string name="firstrun_tornetwork_tab_title">&firstrun_tornetwork_tab_title;</string>
+ <string name="firstrun_tornetwork_title">&firstrun_tornetwork_title;</string>
+ <string name="firstrun_tornetwork_message">&firstrun_tornetwork_message;</string>
+ <string name="firstrun_tornetwork_next">&firstrun_tornetwork_next;</string>
+
+ <string name="firstrun_secsettings_tab_title">&firstrun_secsettings_tab_title;</string>
+ <string name="firstrun_secsettings_title">&firstrun_secsettings_title;</string>
+ <string name="firstrun_secsettings_message">&firstrun_secsettings_message;</string>
+ <string name="firstrun_secsettings_next">&firstrun_secsettings_next;</string>
+
+ <string name="firstrun_tips_tab_title">&firstrun_tips_tab_title;</string>
+ <string name="firstrun_tips_title">&firstrun_tips_title;</string>
+ <string name="firstrun_tips_message">&firstrun_tips_message;</string>
+ <string name="firstrun_tips_next">&firstrun_tips_next;</string>
+
+ <string name="firstrun_onionservices_tab_title">&firstrun_onionservices_tab_title;</string>
+ <string name="firstrun_onionservices_title">&firstrun_onionservices_title;</string>
+ <string name="firstrun_onionservices_message">&firstrun_onionservices_message;</string>
+ <string name="firstrun_onionservices_next">&firstrun_onionservices_next;</string>
+
<string name="bookmarks_title">&bookmarks_title;</string>
<string name="history_title">&history_title;</string>
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/figure_experience.png b/mobile/android/branding/alpha/res/drawable-nodpi/figure_experience.png
new file mode 100644
index 000000000000..2eeeb1ccbd7d
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/figure_experience.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/figure_network.png b/mobile/android/branding/alpha/res/drawable-nodpi/figure_network.png
new file mode 100644
index 000000000000..62bf5e2d144d
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/figure_network.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/figure_onion.png b/mobile/android/branding/alpha/res/drawable-nodpi/figure_onion.png
new file mode 100644
index 000000000000..cbd8236f82e9
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/figure_onion.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/figure_privacy.png b/mobile/android/branding/alpha/res/drawable-nodpi/figure_privacy.png
new file mode 100644
index 000000000000..d9d56229aa8a
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/figure_privacy.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/figure_security.png b/mobile/android/branding/alpha/res/drawable-nodpi/figure_security.png
new file mode 100644
index 000000000000..0a0d47f75370
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/figure_security.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/figure_welcome.png b/mobile/android/branding/alpha/res/drawable-nodpi/figure_welcome.png
new file mode 100644
index 000000000000..274dea5c31a6
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/figure_welcome.png differ
diff --git a/mobile/android/branding/alpha/res/drawable-nodpi/home_tab_menu_strip_tor.9.png b/mobile/android/branding/alpha/res/drawable-nodpi/home_tab_menu_strip_tor.9.png
new file mode 100644
index 000000000000..a92420d11b8e
Binary files /dev/null and b/mobile/android/branding/alpha/res/drawable-nodpi/home_tab_menu_strip_tor.9.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/figure_experience.png b/mobile/android/branding/nightly/res/drawable-nodpi/figure_experience.png
new file mode 100644
index 000000000000..2eeeb1ccbd7d
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/figure_experience.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/figure_network.png b/mobile/android/branding/nightly/res/drawable-nodpi/figure_network.png
new file mode 100644
index 000000000000..62bf5e2d144d
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/figure_network.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/figure_onion.png b/mobile/android/branding/nightly/res/drawable-nodpi/figure_onion.png
new file mode 100644
index 000000000000..cbd8236f82e9
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/figure_onion.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/figure_privacy.png b/mobile/android/branding/nightly/res/drawable-nodpi/figure_privacy.png
new file mode 100644
index 000000000000..d9d56229aa8a
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/figure_privacy.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/figure_security.png b/mobile/android/branding/nightly/res/drawable-nodpi/figure_security.png
new file mode 100644
index 000000000000..0a0d47f75370
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/figure_security.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/figure_welcome.png b/mobile/android/branding/nightly/res/drawable-nodpi/figure_welcome.png
new file mode 100644
index 000000000000..274dea5c31a6
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/figure_welcome.png differ
diff --git a/mobile/android/branding/nightly/res/drawable-nodpi/home_tab_menu_strip_tor.9.png b/mobile/android/branding/nightly/res/drawable-nodpi/home_tab_menu_strip_tor.9.png
new file mode 100644
index 000000000000..a92420d11b8e
Binary files /dev/null and b/mobile/android/branding/nightly/res/drawable-nodpi/home_tab_menu_strip_tor.9.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/figure_experience.png b/mobile/android/branding/official/res/drawable-nodpi/figure_experience.png
new file mode 100644
index 000000000000..2eeeb1ccbd7d
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/figure_experience.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/figure_network.png b/mobile/android/branding/official/res/drawable-nodpi/figure_network.png
new file mode 100644
index 000000000000..62bf5e2d144d
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/figure_network.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/figure_onion.png b/mobile/android/branding/official/res/drawable-nodpi/figure_onion.png
new file mode 100644
index 000000000000..cbd8236f82e9
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/figure_onion.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/figure_privacy.png b/mobile/android/branding/official/res/drawable-nodpi/figure_privacy.png
new file mode 100644
index 000000000000..d9d56229aa8a
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/figure_privacy.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/figure_security.png b/mobile/android/branding/official/res/drawable-nodpi/figure_security.png
new file mode 100644
index 000000000000..0a0d47f75370
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/figure_security.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/figure_welcome.png b/mobile/android/branding/official/res/drawable-nodpi/figure_welcome.png
new file mode 100644
index 000000000000..274dea5c31a6
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/figure_welcome.png differ
diff --git a/mobile/android/branding/official/res/drawable-nodpi/home_tab_menu_strip_tor.9.png b/mobile/android/branding/official/res/drawable-nodpi/home_tab_menu_strip_tor.9.png
new file mode 100644
index 000000000000..a92420d11b8e
Binary files /dev/null and b/mobile/android/branding/official/res/drawable-nodpi/home_tab_menu_strip_tor.9.png differ
1
0

[tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25741 - TBA: Do not import bookmarks and history from native browser by default
by gk@torproject.org 31 Aug '19
by gk@torproject.org 31 Aug '19
31 Aug '19
commit d5971ab34f8a0675a19d34d008f09c44d73b7872
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Apr 11 18:51:09 2018 +0000
Bug 25741 - TBA: Do not import bookmarks and history from native browser by default
---
mobile/android/app/src/main/res/values/arrays.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/mobile/android/app/src/main/res/values/arrays.xml b/mobile/android/app/src/main/res/values/arrays.xml
index 8aa0240c66ea..af7001b5e41f 100644
--- a/mobile/android/app/src/main/res/values/arrays.xml
+++ b/mobile/android/app/src/main/res/values/arrays.xml
@@ -48,8 +48,8 @@
<item>@string/history_title</item>
</string-array>
<string-array name="pref_import_android_defaults">
- <item>true</item>
- <item>true</item>
+ <item>false</item>
+ <item>false</item>
</string-array>
<string-array name="pref_import_android_values">
<item>android_import.data.bookmarks</item>
1
0