Bug 965867 - Update final URLs for Android Firefox Accounts landing. r=rnewman
authorNick Alexander <nalexander@mozilla.com>
Thu, 30 Jan 2014 17:59:30 -0800
changeset 165876 85db73060d6b79a3d6918f2ea3b77c021399eb01
parent 165875 b1e034d5e7725d541fa66f2cb537331e26e3327a
child 165877 84309462c82b1719da70b1e60aea418c8243a1b2
push id1025
push usernalexander@mozilla.com
push dateFri, 31 Jan 2014 02:02:19 +0000
treeherderservices-central@1c6a696b65a7 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersrnewman
bugs965867
milestone29.0a1
Bug 965867 - Update final URLs for Android Firefox Accounts landing. r=rnewman
mobile/android/base/fxa/activities/FxAccountGetStartedActivity.java
mobile/android/base/fxa/activities/FxAccountSignInActivity.java
mobile/android/base/fxa/activities/FxAccountStatusActivity.java
mobile/android/base/fxa/activities/FxAccountUpdateCredentialsActivity.java
mobile/android/base/locales/en-US/sync_strings.dtd
mobile/android/base/resources/layout/fxaccount_create_account.xml
mobile/android/base/resources/layout/fxaccount_sign_in.xml
mobile/android/base/resources/layout/fxaccount_status.xml
mobile/android/base/resources/layout/fxaccount_update_credentials.xml
mobile/android/base/resources/values/fxaccount_styles.xml
mobile/android/base/sync/Utils.java
mobile/android/base/sync/setup/activities/ActivityUtils.java
mobile/android/services/strings.xml.in
--- a/mobile/android/base/fxa/activities/FxAccountGetStartedActivity.java
+++ b/mobile/android/base/fxa/activities/FxAccountGetStartedActivity.java
@@ -1,19 +1,23 @@
 /* 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.fxa.activities;
 
+import java.util.Locale;
+
+import org.mozilla.gecko.AppConstants;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.background.common.log.Logger;
 import org.mozilla.gecko.background.fxa.FxAccountAgeLockoutHelper;
 import org.mozilla.gecko.fxa.FxAccountConstants;
 import org.mozilla.gecko.fxa.authenticator.FxAccountAuthenticator;
+import org.mozilla.gecko.sync.Utils;
 import org.mozilla.gecko.sync.setup.activities.ActivityUtils;
 
 import android.accounts.AccountAuthenticatorActivity;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.SystemClock;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -33,18 +37,17 @@ public class FxAccountGetStartedActivity
   @Override
   public void onCreate(Bundle icicle) {
     Logger.setThreadLogTag(FxAccountConstants.GLOBAL_LOG_TAG);
     Logger.debug(LOG_TAG, "onCreate(" + icicle + ")");
 
     super.onCreate(icicle);
     setContentView(R.layout.fxaccount_get_started);
 
-    TextView oldFirefox = (TextView) findViewById(R.id.old_firefox);
-    ActivityUtils.linkTextView(oldFirefox, R.string.fxaccount_getting_started_old_firefox, R.string.fxaccount_getting_started_link_old_firefox);
+    linkifyOldFirefoxLink();
 
     View button = findViewById(R.id.get_started_button);
     button.setOnClickListener(new OnClickListener() {
       @Override
       public void onClick(View v) {
         Intent intent = new Intent(FxAccountGetStartedActivity.this, FxAccountCreateAccountActivity.class);
         // Per http://stackoverflow.com/a/8992365, this triggers a known bug with
         // the soft keyboard not being shown for the started activity. Why, Android, why?
@@ -87,9 +90,21 @@ public class FxAccountGetStartedActivity
       super.onActivityResult(requestCode, resultCode, data);
       return;
     }
     if (data != null) {
       this.setAccountAuthenticatorResult(data.getExtras());
     }
     this.setResult(requestCode, data);
   }
+
+  protected void linkifyOldFirefoxLink() {
+    TextView oldFirefox = (TextView) findViewById(R.id.old_firefox);
+    String text = getResources().getString(R.string.fxaccount_getting_started_old_firefox);
+    String VERSION = AppConstants.MOZ_APP_VERSION;
+    String OS = AppConstants.OS_TARGET;
+    // We'll need to adjust this when we have active locale switching.
+    String LOCALE = Utils.getLanguageTag(Locale.getDefault());
+    String url = getResources().getString(R.string.fxaccount_link_old_firefox, VERSION, OS, LOCALE);
+    FxAccountConstants.pii(LOG_TAG, "Old Firefox url is: " + url); // Don't want to leak locale in particular.
+    ActivityUtils.linkTextView(oldFirefox, text, url);
+  }
 }
--- a/mobile/android/base/fxa/activities/FxAccountSignInActivity.java
+++ b/mobile/android/base/fxa/activities/FxAccountSignInActivity.java
@@ -13,16 +13,17 @@ import org.mozilla.gecko.background.fxa.
 import org.mozilla.gecko.background.fxa.FxAccountClient10.RequestDelegate;
 import org.mozilla.gecko.background.fxa.FxAccountClient20;
 import org.mozilla.gecko.background.fxa.FxAccountClient20.LoginResponse;
 import org.mozilla.gecko.background.fxa.FxAccountClientException.FxAccountClientRemoteException;
 import org.mozilla.gecko.background.fxa.PasswordStretcher;
 import org.mozilla.gecko.background.fxa.QuickPasswordStretcher;
 import org.mozilla.gecko.fxa.FxAccountConstants;
 import org.mozilla.gecko.fxa.activities.FxAccountSetupTask.FxAccountSignInTask;
+import org.mozilla.gecko.sync.setup.activities.ActivityUtils;
 
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.ProgressBar;
@@ -75,18 +76,18 @@ public class FxAccountSignInActivity ext
 
     // Only set email/password in onCreate; we don't want to overwrite edited values onResume.
     if (getIntent() != null && getIntent().getExtras() != null) {
       Bundle bundle = getIntent().getExtras();
       emailEdit.setText(bundle.getString("email"));
       passwordEdit.setText(bundle.getString("password"));
     }
 
-    // Not yet implemented.
-    // this.launchActivityOnClick(ensureFindViewById(null, R.id.forgot_password_link, "forgot password link"), null);
+    TextView view = (TextView) findViewById(R.id.forgot_password_link);
+    ActivityUtils.linkTextView(view, R.string.fxaccount_sign_in_forgot_password, R.string.fxaccount_link_forgot_password);
   }
 
   /**
    * We might have switched to the CreateAccount activity; if that activity
    * succeeds, feed its result back to the authenticator.
    */
   @Override
   public void onActivityResult(int requestCode, int resultCode, Intent data) {
--- a/mobile/android/base/fxa/activities/FxAccountStatusActivity.java
+++ b/mobile/android/base/fxa/activities/FxAccountStatusActivity.java
@@ -11,16 +11,17 @@ import java.util.Set;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.background.common.log.Logger;
 import org.mozilla.gecko.db.BrowserContract;
 import org.mozilla.gecko.fxa.FxAccountConstants;
 import org.mozilla.gecko.fxa.authenticator.AndroidFxAccount;
 import org.mozilla.gecko.fxa.login.Married;
 import org.mozilla.gecko.fxa.login.State;
 import org.mozilla.gecko.sync.SyncConfiguration;
+import org.mozilla.gecko.sync.setup.activities.ActivityUtils;
 
 import android.content.ContentResolver;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.os.Handler;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
@@ -118,16 +119,22 @@ public class FxAccountStatusActivity ext
         }
         Logger.info(LOG_TAG, "Requesting a sync sometime soon.");
         // Request a sync, but not necessarily an immediate sync.
         ContentResolver.requestSync(fxAccount.getAndroidAccount(), BrowserContract.AUTHORITY, Bundle.EMPTY);
         // SyncAdapter.requestImmediateSync(fxAccount.getAndroidAccount(), null);
       }
     };
 
+    TextView privacyView = (TextView) findViewById(R.id.fxaccount_status_linkprivacy);
+    ActivityUtils.linkTextView(privacyView, R.string.fxaccount_policy_linkprivacy, R.string.fxaccount_link_pn);
+
+    TextView tosView = (TextView) findViewById(R.id.fxaccount_status_linktos);
+    ActivityUtils.linkTextView(tosView, R.string.fxaccount_policy_linktos, R.string.fxaccount_link_tos);
+
     if (FxAccountConstants.LOG_PERSONAL_INFORMATION) {
       createDebugButtons();
     }
   }
 
   @Override
   public void onResume() {
     super.onResume();
--- a/mobile/android/base/fxa/activities/FxAccountUpdateCredentialsActivity.java
+++ b/mobile/android/base/fxa/activities/FxAccountUpdateCredentialsActivity.java
@@ -18,16 +18,17 @@ import org.mozilla.gecko.background.fxa.
 import org.mozilla.gecko.background.fxa.PasswordStretcher;
 import org.mozilla.gecko.background.fxa.QuickPasswordStretcher;
 import org.mozilla.gecko.fxa.FxAccountConstants;
 import org.mozilla.gecko.fxa.activities.FxAccountSetupTask.FxAccountSignInTask;
 import org.mozilla.gecko.fxa.authenticator.AndroidFxAccount;
 import org.mozilla.gecko.fxa.login.Engaged;
 import org.mozilla.gecko.fxa.login.State;
 import org.mozilla.gecko.fxa.login.State.StateLabel;
+import org.mozilla.gecko.sync.setup.activities.ActivityUtils;
 
 import android.os.Bundle;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.ProgressBar;
 import android.widget.TextView;
@@ -68,18 +69,18 @@ public class FxAccountUpdateCredentialsA
     minimumPasswordLength = 1; // Minimal restriction on passwords entered to sign in.
     createButton();
     addListeners();
     updateButtonState();
     createShowPasswordButton();
 
     emailEdit.setEnabled(false);
 
-    // Not yet implemented.
-    // this.launchActivityOnClick(ensureFindViewById(null, R.id.forgot_password_link, "forgot password link"), null);
+    TextView view = (TextView) findViewById(R.id.forgot_password_link);
+    ActivityUtils.linkTextView(view, R.string.fxaccount_sign_in_forgot_password, R.string.fxaccount_link_forgot_password);
   }
 
   @Override
   public void onResume() {
     super.onResume();
     this.fxAccount = getAndroidFxAccount();
     if (fxAccount == null) {
       Logger.warn(LOG_TAG, "Could not get Firefox Account.");
--- a/mobile/android/base/locales/en-US/sync_strings.dtd
+++ b/mobile/android/base/locales/en-US/sync_strings.dtd
@@ -127,41 +127,37 @@
 <!-- Localization note: these are shown in all screens that query the
      user for an email address and password. Hide and show are button
      labels. -->
 <!ENTITY fxaccount_email_hint 'Email'>
 <!ENTITY fxaccount_password_hint 'Password'>
 <!ENTITY fxaccount_password_hide 'Hide'>
 <!ENTITY fxaccount_password_show 'Show'>
 
-<!ENTITY fxaccount_link_tos 'https://accounts.firefox.com/legal/terms'>
-<!ENTITY fxaccount_link_pn 'https://accounts.firefox.com/legal/privacy'>
 <!ENTITY fxaccount_policy_linktos 'Terms of Service'>
 <!ENTITY fxaccount_policy_linkprivacy 'Privacy Notice'>
 
 <!ENTITY fxaccount_getting_started_welcome_to_sync 'Welcome to &syncBrand.shortName.label;'>
 <!ENTITY fxaccount_getting_started_description 'Sign in to sync your tabs, bookmarks, passwords &amp; more.'>
 <!ENTITY fxaccount_getting_started_get_started 'Get started'>
-<!ENTITY fxaccount_getting_started_link_old_firefox 'https://support.mozilla.org/kb/use-sync-with-an-older-version-of-firefox'>
 <!ENTITY fxaccount_getting_started_old_firefox 'Using an older version of &syncBrand.shortName.label;?'>
 
 <!ENTITY fxaccount_create_account_sub_header 'Create an account'>
 <!ENTITY fxaccount_create_account_password_length_restriction 'Must be at least 8 characters'>
 <!ENTITY fxaccount_create_account_year_of_birth 'Year of birth'>
 <!-- Localization note: &formatS1; is fxaccount_policy_linktos, &formatS2; is fxaccount_policy_linkprivacy, both hyperlinked. -->
 <!ENTITY fxaccount_create_account_policy_text 'By proceeding, I agree to the &formatS1; and &formatS2; of Firefox online services.'>
 <!ENTITY fxaccount_create_account_button 'Next'>
 <!ENTITY fxaccount_create_account_choose_what_to_sync 'Choose what to sync'>
 <!ENTITY fxaccount_create_account_sign_in_instead 'Already have an account? Sign in'>
 <!ENTITY fxaccount_create_account_1950_or_earlier '1950 or earlier'>
 <!ENTITY fxaccount_create_account_unknown_error 'Could not create account'>
 
 <!ENTITY fxaccount_account_create_not_allowed 'Cannot create account'>
 <!ENTITY fxaccount_account_create_not_allowed_you_must_meet_certain_age_requirements 'You must meet certain age requirements to create an account.'>
-<!ENTITY fxaccount_link_create_not_allowed 'http://www.ftc.gov/news-events/media-resources/protecting-consumer-privacy/kids-privacy-coppa'>
 <!ENTITY fxaccount_account_create_not_allowed_learn_more 'Learn more'>
 
 <!ENTITY fxaccount_confirm_account_header 'Confirm your account'>
 <!-- Localization note: &formatS; is the Firefox Account's email address. -->
 <!ENTITY fxaccount_confirm_account_verification_link 'A verification link has been sent to &formatS;'>
 <!ENTITY fxaccount_confirm_account_resend_email 'Resend email'>
 <!ENTITY fxaccount_confirm_account_verification_link_sent 'Sent fresh verification link'>
 <!ENTITY fxaccount_confirm_account_verification_link_not_sent 'Couldn\&apos;t send a fresh verification link'>
--- a/mobile/android/base/resources/layout/fxaccount_create_account.xml
+++ b/mobile/android/base/resources/layout/fxaccount_create_account.xml
@@ -22,17 +22,17 @@
 
         <TextView
             style="@style/FxAccountSubHeaderItem"
             android:text="@string/fxaccount_create_account_sub_header" />
 
         <include layout="@layout/fxaccount_email_password_view" />
 
         <TextView
-            style="@style/FxAccountLinkifiedItem"
+            style="@style/FxAccountTextItem"
             android:layout_marginTop="10dp"
             android:text="@string/fxaccount_create_account_password_length_restriction" />
 
         <!-- Per http://stackoverflow.com/questions/2359176/android-edittext-onclicklistener, not allowing focus allows us to highjack the click. -->
 
         <EditText
             android:id="@+id/year_edit"
             style="@style/FxAccountEditItem"
@@ -83,9 +83,9 @@
 
         <LinearLayout style="@style/FxAccountSpacer" />
 
         <ImageView
             style="@style/FxAccountIcon"
             android:contentDescription="@string/fxaccount_icon_contentDescription" />
     </LinearLayout>
 
-</ScrollView>
\ No newline at end of file
+</ScrollView>
--- a/mobile/android/base/resources/layout/fxaccount_sign_in.xml
+++ b/mobile/android/base/resources/layout/fxaccount_sign_in.xml
@@ -45,17 +45,17 @@
         <LinearLayout
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:layout_marginTop="10dp"
             android:orientation="horizontal" >
 
             <TextView
                 android:id="@+id/forgot_password_link"
-                style="@style/FxAccountLinkItem"
+                style="@style/FxAccountLinkifiedItem"
                 android:layout_gravity="left"
                 android:layout_weight="1"
                 android:gravity="left"
                 android:text="@string/fxaccount_sign_in_forgot_password" />
 
             <TextView
                 android:id="@+id/create_account_link"
                 style="@style/FxAccountLinkItem"
@@ -67,9 +67,9 @@
 
         <LinearLayout style="@style/FxAccountSpacer" />
 
         <ImageView
             style="@style/FxAccountIcon"
             android:contentDescription="@string/fxaccount_icon_contentDescription" />
     </LinearLayout>
 
-</ScrollView>
\ No newline at end of file
+</ScrollView>
--- a/mobile/android/base/resources/layout/fxaccount_status.xml
+++ b/mobile/android/base/resources/layout/fxaccount_status.xml
@@ -112,19 +112,19 @@
 
         <LinearLayout
             android:id="@+id/spacer2"
             android:layout_width="fill_parent"
             android:layout_height="20dp"
             android:orientation="vertical" />
 
         <TextView
-            style="@style/FxAccountLinkItem"
-            android:text="@string/fxaccount_policy_linktos" >
-        </TextView>
+            android:id="@+id/fxaccount_status_linktos"
+            style="@style/FxAccountLinkifiedItem"
+            android:text="@string/fxaccount_policy_linktos" />
 
         <TextView
-            style="@style/FxAccountLinkItem"
-            android:text="@string/fxaccount_policy_linkprivacy" >
-        </TextView>
+            android:id="@+id/fxaccount_status_linkprivacy"
+            style="@style/FxAccountLinkifiedItem"
+            android:text="@string/fxaccount_policy_linkprivacy" />
     </LinearLayout>
 
 </ScrollView>
--- a/mobile/android/base/resources/layout/fxaccount_update_credentials.xml
+++ b/mobile/android/base/resources/layout/fxaccount_update_credentials.xml
@@ -39,19 +39,19 @@
             <Button
                 android:id="@+id/button"
                 style="@style/FxAccountButton"
                 android:text="@string/fxaccount_update_credentials_button_label" />
         </FrameLayout>
 
         <TextView
             android:id="@+id/forgot_password_link"
-            style="@style/FxAccountLinkItem"
+            style="@style/FxAccountLinkifiedItem"
             android:text="@string/fxaccount_sign_in_forgot_password" />
 
         <LinearLayout style="@style/FxAccountSpacer" />
 
         <ImageView
             style="@style/FxAccountIcon"
             android:contentDescription="@string/fxaccount_icon_contentDescription" />
     </LinearLayout>
 
-</ScrollView>
\ No newline at end of file
+</ScrollView>
--- a/mobile/android/base/resources/values/fxaccount_styles.xml
+++ b/mobile/android/base/resources/values/fxaccount_styles.xml
@@ -70,17 +70,17 @@
         <item name="android:background">@drawable/fxaccount_textfield_background</item>
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">wrap_content</item>
         <item name="android:singleLine">true</item>
         <item name="android:textColor">@color/fxaccount_input_textColor</item>
         <item name="android:textColorHint">@color/fxaccount_input_textColorHint</item>
     </style>
 
-    <style name="FxAccountLinkifiedItem" parent="@android:style/TextAppearance.Small">
+    <style name="FxAccountLinkifiedItem" parent="@style/FxAccountTextItem">
         <item name="android:clickable">true</item>
         <item name="android:focusable">true</item>
         <item name="android:textColor">@color/fxaccount_linkified_textColor</item>
         <item name="android:textColorLink">@color/fxaccount_linkified_textColorLink</item>
         <item name="android:layout_width">fill_parent</item>
         <item name="android:layout_height">wrap_content</item>
         <item name="android:gravity">center</item>
     </style>
@@ -122,9 +122,9 @@
 
     <style name="FxAccountCheckBox">
         <item name="android:layout_width">fill_parent</item>
         <item name="android:layout_height">wrap_content</item>
         <item name="android:layout_marginBottom">10dp</item>
         <item name="android:textColor">@drawable/fxaccount_checkbox_textcolor</item>
     </style>
 
-</resources>
\ No newline at end of file
+</resources>
--- a/mobile/android/base/sync/Utils.java
+++ b/mobile/android/base/sync/Utils.java
@@ -566,9 +566,41 @@ public class Utils {
 
   public static void throwIfNull(Object... objects) {
     for (Object object : objects) {
       if (object == null) {
         throw new IllegalArgumentException("object must not be null");
       }
     }
   }
+
+  /**
+   * Gecko uses locale codes like "es-ES", whereas a Java {@link Locale}
+   * stringifies as "es_ES".
+   *
+   * This method approximates the Java 7 method <code>Locale#toLanguageTag()</code>.
+   * <p>
+   * <b>Warning:</b> all consumers of this method will need to be audited when
+   * we have active locale switching.
+   *
+   * @return a locale string suitable for passing to Gecko.
+   */
+  public static String getLanguageTag(final Locale locale) {
+    // If this were Java 7:
+    // return locale.toLanguageTag();
+
+    String language = locale.getLanguage();  // Can, but should never be, an empty string.
+    // Modernize certain language codes.
+    if (language.equals("iw")) {
+      language = "he";
+    } else if (language.equals("in")) {
+      language = "id";
+    } else if (language.equals("ji")) {
+      language = "yi";
+    }
+
+    String country = locale.getCountry();    // Can be an empty string.
+    if (country.equals("")) {
+      return language;
+    }
+    return language + "-" + country;
+  }
 }
--- a/mobile/android/base/sync/setup/activities/ActivityUtils.java
+++ b/mobile/android/base/sync/setup/activities/ActivityUtils.java
@@ -83,18 +83,25 @@ public class ActivityUtils {
   }
 
   /**
    * Replace the contents of a plain text view with the provided text wrapped in a link.
    * TODO: escape the URL!
    */
   public static void linkTextView(TextView view, int text, int link) {
     final Context context = view.getContext();
-    final String url = context.getString(link);
-    view.setText("<a href=\"" + url + "\">" + context.getString(text) + "</a>");
+    linkTextView(view, context.getString(text), context.getString(link));
+  }
+
+  /**
+   * Replace the contents of a plain text view with the provided text wrapped in a link.
+   * TODO: escape the URL!
+   */
+  public static void linkTextView(TextView view, String text, String url) {
+    view.setText("<a href=\"" + url + "\">" + text + "</a>");
     linkifyTextView(view, false);
   }
 
   public static void linkifyTextView(TextView textView, boolean underlining) {
     if (textView == null) {
       Logger.warn(LOG_TAG, "Could not process links for view.");
       return;
     }
--- a/mobile/android/services/strings.xml.in
+++ b/mobile/android/services/strings.xml.in
@@ -97,51 +97,55 @@
   <string name="sync_text_redirect_to_set_up_sync">&sync.text.redirect.to.set.up.sync.label;</string>
   <string name="sync_text_tab_sent">&sync.text.tab.sent.label;</string>
   <string name="sync_text_tab_not_sent">&sync.text.tab.not.sent.label;</string>
 
 <!-- Firefox Account strings. -->
 <string name="firefox_accounts">&firefox_accounts;</string>
 <string name="firefox_account">&firefox_account;</string>
 
+<!-- Firefox Account links. -->
+<!-- https://support.mozilla.org/1/mobile/%VERSION%/%OS%/%LOCALE%/old-sync -->
+<string name="fxaccount_link_old_firefox">https://support.mozilla.org/1/mobile/&formatS1;/&formatS2;/&formatS3;/old-sync</string>
+<string name="fxaccount_link_create_not_allowed">http://www.consumer.ftc.gov/articles/0031-protecting-your-childs-privacy-online</string>
+<string name="fxaccount_link_tos">https://accounts.firefox.com/legal/terms</string>
+<string name="fxaccount_link_pn">https://accounts.firefox.com/legal/privacy</string>
+<string name="fxaccount_link_forgot_password">https://accounts.firefox.com/reset_password</string>
+
 <string name="fxaccount_checkbox_contentDescription">&fxaccount_checkbox_contentDescription;</string>
 <string name="fxaccount_icon_contentDescription">&fxaccount_icon_contentDescription;</string>
 <string name="fxaccount_intro_contentDescription">&fxaccount_intro_contentDescription;</string>
 <string name="fxaccount_mail_contentDescription">&fxaccount_mail_contentDescription;</string>
 
 <string name="fxaccount_email_hint">&fxaccount_email_hint;</string>
 <string name="fxaccount_password_hint">&fxaccount_password_hint;</string>
 <string name="fxaccount_password_hide">&fxaccount_password_hide;</string>
 <string name="fxaccount_password_show">&fxaccount_password_show;</string>
 
-<string name="fxaccount_link_tos">&fxaccount_link_tos;</string>
-<string name="fxaccount_link_pn">&fxaccount_link_pn;</string>
 <string name="fxaccount_policy_linktos">&fxaccount_policy_linktos;</string>
 <string name="fxaccount_policy_linkprivacy">&fxaccount_policy_linkprivacy;</string>
 
 <string name="fxaccount_getting_started_welcome_to_sync">&fxaccount_getting_started_welcome_to_sync;</string>
 <string name="fxaccount_getting_started_description">&fxaccount_getting_started_description;</string>
 <string name="fxaccount_getting_started_get_started">&fxaccount_getting_started_get_started;</string>
-<string name="fxaccount_getting_started_link_old_firefox">&fxaccount_getting_started_link_old_firefox;</string>
 <string name="fxaccount_getting_started_old_firefox">&fxaccount_getting_started_old_firefox;</string>
 
 <string name="fxaccount_create_account_sub_header">&fxaccount_create_account_sub_header;</string>
 <string name="fxaccount_create_account_password_length_restriction">&fxaccount_create_account_password_length_restriction;</string>
 <string name="fxaccount_create_account_year_of_birth">&fxaccount_create_account_year_of_birth;</string>
 
 <string name="fxaccount_create_account_policy_text">&fxaccount_create_account_policy_text;</string>
 <string name="fxaccount_create_account_button">&fxaccount_create_account_button;</string>
 <string name="fxaccount_create_account_choose_what_to_sync">&fxaccount_create_account_choose_what_to_sync;</string>
 <string name="fxaccount_create_account_sign_in_instead">&fxaccount_create_account_sign_in_instead;</string>
 <string name="fxaccount_create_account_1950_or_earlier">&fxaccount_create_account_1950_or_earlier;</string>
 <string name="fxaccount_create_account_unknown_error">&fxaccount_create_account_unknown_error;</string>
 
 <string name="fxaccount_account_create_not_allowed">&fxaccount_account_create_not_allowed;</string>
 <string name="fxaccount_account_create_not_allowed_you_must_meet_certain_age_requirements">&fxaccount_account_create_not_allowed_you_must_meet_certain_age_requirements;</string>
-<string name="fxaccount_link_create_not_allowed">&fxaccount_link_create_not_allowed;</string>
 <string name="fxaccount_account_create_not_allowed_learn_more">&fxaccount_account_create_not_allowed_learn_more;</string>
 
 <string name="fxaccount_confirm_account_header">&fxaccount_confirm_account_header;</string>
 <string name="fxaccount_confirm_account_verification_link">&fxaccount_confirm_account_verification_link;</string>
 <string name="fxaccount_confirm_account_resend_email">&fxaccount_confirm_account_resend_email;</string>
 <string name="fxaccount_confirm_account_verification_link_sent">&fxaccount_confirm_account_verification_link_sent;</string>
 <string name="fxaccount_confirm_account_verification_link_not_sent">&fxaccount_confirm_account_verification_link_not_sent;</string>
 
@@ -180,11 +184,9 @@
 <string name="fxaccount_remote_error_INCORRECT_PASSWORD">&fxaccount_remote_error_INCORRECT_PASSWORD;</string>
 <string name="fxaccount_remote_error_ATTEMPT_TO_OPERATE_ON_AN_UNVERIFIED_ACCOUNT">&fxaccount_remote_error_ATTEMPT_TO_OPERATE_ON_AN_UNVERIFIED_ACCOUNT;</string>
 <string name="fxaccount_remote_error_CLIENT_HAS_SENT_TOO_MANY_REQUESTS">&fxaccount_remote_error_CLIENT_HAS_SENT_TOO_MANY_REQUESTS;</string>
 <string name="fxaccount_remote_error_SERVICE_TEMPORARILY_UNAVAILABLE_TO_DUE_HIGH_LOAD">&fxaccount_remote_error_SERVICE_TEMPORARILY_UNAVAILABLE_TO_DUE_HIGH_LOAD;</string>
 <string name="fxaccount_remote_error_UNKNOWN_ERROR">&fxaccount_remote_error_UNKNOWN_ERROR;</string>
 <string name="fxaccount_remote_error_COULD_NOT_CONNECT">&fxaccount_remote_error_COULD_NOT_CONNECT;</string>
 
 <string name="fxaccount_sync_sign_in_error_notification_title">&fxaccount_sync_sign_in_error_notification_title;</string>
-<!-- Note to translators: the format string below will be replaced
-     with the Firefox Account's email address. -->
 <string name="fxaccount_sync_sign_in_error_notification_text">&fxaccount_sync_sign_in_error_notification_text;</string>