[tor-commits] [tor-browser/tor-browser-68.1.0esr-9.0-1] Bug 25696 - Implement alpha onboarding for Tor Browser for Android

gk at torproject.org gk at torproject.org
Sat Aug 31 19:46:16 UTC 2019


commit 11c49bccc023231db699b8bef6c6d98681ae4c87
Author: Igor Oliveira <igt0 at 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





More information about the tor-commits mailing list