Bug 1063750 - Part 1: Replace Remote Tabs tray with messaging to Remote Tabs home panel. r=mcomella
authorNick Alexander <nalexander@mozilla.com>
Tue, 07 Oct 2014 16:53:27 -0700
changeset 232530 439792036cc72d763b518c7caf220d0bf99d2596
parent 232529 a1d225fd8168b2ef93c36bcc2199fb15da39434d
child 232531 918c616ddc23985d40c6d170cbe847de490070aa
push id4187
push userbhearsum@mozilla.com
push dateFri, 28 Nov 2014 15:29:12 +0000
treeherdermozilla-beta@f23cc6a30c11 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmcomella
bugs1063750
milestone35.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1063750 - Part 1: Replace Remote Tabs tray with messaging to Remote Tabs home panel. r=mcomella
mobile/android/base/locales/en-US/android_strings.dtd
mobile/android/base/moz.build
mobile/android/base/resources/layout-xlarge-v11/remote_tabs_child.xml
mobile/android/base/resources/layout-xlarge-v11/remote_tabs_group.xml
mobile/android/base/resources/layout/remote_tabs_child.xml
mobile/android/base/resources/layout/remote_tabs_container_panel.xml
mobile/android/base/resources/layout/remote_tabs_group.xml
mobile/android/base/resources/layout/remote_tabs_panel.xml
mobile/android/base/resources/layout/remote_tabs_setup_panel.xml
mobile/android/base/resources/layout/remote_tabs_verification_panel.xml
mobile/android/base/strings.xml.in
mobile/android/base/tabs/RemoteTabsContainerPanel.java
mobile/android/base/tabs/RemoteTabsList.java
mobile/android/base/tabs/RemoteTabsPanel.java
mobile/android/base/tabs/RemoteTabsSetupPanel.java
mobile/android/base/tabs/RemoteTabsVerificationPanel.java
--- a/mobile/android/base/locales/en-US/android_strings.dtd
+++ b/mobile/android/base/locales/en-US/android_strings.dtd
@@ -433,16 +433,20 @@ size. -->
 <!-- Localization note (home_remote_tabs_unhide_selected_devices) : This is
      the text of a button; we expect more than one device. -->
 <!ENTITY home_remote_tabs_unhide_selected_devices "Unhide selected devices">
 
 <!ENTITY private_browsing_title "Private Browsing">
 <!ENTITY private_tabs_panel_empty_desc "Your private tabs will show up here. While we don\'t keep any of your browsing history or cookies, bookmarks and files that you download will still be saved on your device.">
 <!ENTITY private_tabs_panel_learn_more "Want to learn more?">
 
+<!ENTITY remote_tabs_panel_moved_title "Where did my tabs go?">
+<!ENTITY remote_tabs_panel_moved_desc "We\'ve moved your tabs from other devices into a panel on your home page that can be easily accessed every time you open a new tab.">
+<!ENTITY remote_tabs_panel_moved_link "Take me to my new panel.">
+
 <!ENTITY pin_site_dialog_hint "Enter a search keyword">
 
 <!ENTITY filepicker_title "Choose File">
 <!ENTITY filepicker_audio_title "Choose or record a sound">
 <!ENTITY filepicker_image_title "Choose or take a picture">
 <!ENTITY filepicker_video_title "Choose or record a video">
 
 <!-- Site identity popup -->
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -384,21 +384,17 @@ gbjar.sources += [
     'sqlite/SQLiteBridge.java',
     'sqlite/SQLiteBridgeException.java',
     'StartPane.java',
     'SuggestClient.java',
     'SurfaceBits.java',
     'Tab.java',
     'Tabs.java',
     'tabs/PrivateTabsPanel.java',
-    'tabs/RemoteTabsContainerPanel.java',
-    'tabs/RemoteTabsList.java',
     'tabs/RemoteTabsPanel.java',
-    'tabs/RemoteTabsSetupPanel.java',
-    'tabs/RemoteTabsVerificationPanel.java',
     'tabs/TabCurve.java',
     'tabs/TabsGridLayout.java',
     'tabs/TabsLayoutAdapter.java',
     'tabs/TabsLayoutItemView.java',
     'tabs/TabsListLayout.java',
     'tabs/TabsPanel.java',
     'TabsAccessor.java',
     'Telemetry.java',
deleted file mode 100644
--- a/mobile/android/base/resources/layout-xlarge-v11/remote_tabs_child.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?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/. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:background="@drawable/action_bar_button_inverse"
-              android:gravity="center_vertical"
-              android:layout_width="match_parent"
-              android:layout_height="@dimen/remote_tab_child_row_height"
-              android:orientation="vertical"
-              android:paddingLeft="2dp"
-              android:paddingRight="2dp">
-
-    <TextView android:id="@+id/title"
-              style="@style/TabRowTextAppearance"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content"
-              android:textSize="14sp"/>
-
-    <TextView android:id="@+id/url"
-              style="@style/TabRowTextAppearance.Url"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content"
-              android:textSize="12sp"/>
-
-</LinearLayout>
deleted file mode 100644
--- a/mobile/android/base/resources/layout-xlarge-v11/remote_tabs_group.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?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/. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:background="@android:color/transparent"
-              android:layout_width="match_parent"
-              android:layout_height="@dimen/remote_tab_child_row_height"
-              android:gravity="center_vertical"
-              android:orientation="vertical"
-              android:paddingLeft="2dp"
-              android:paddingRight="2dp">
-
-    <org.mozilla.gecko.widget.AllCapsTextView android:id="@+id/client"
-                                              style="@style/TabRowTextAppearance"
-                                              android:layout_width="match_parent"
-                                              android:layout_height="wrap_content"
-                                              android:maxLines="2"
-                                              android:singleLine="false"
-                                              android:textSize="14sp"
-                                              android:textStyle="bold" />
-
-    <TextView android:id="@+id/last_synced"
-              style="@style/TabRowTextAppearance.Url"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content"
-              android:textSize="12sp"/>
-
-</LinearLayout>
deleted file mode 100644
--- a/mobile/android/base/resources/layout/remote_tabs_child.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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/. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:background="@android:color/transparent"
-              android:gravity="center_vertical"
-              android:layout_width="match_parent"
-              android:layout_height="@dimen/remote_tab_child_row_height"
-              android:orientation="vertical"
-              android:paddingLeft="4dp"
-              android:paddingRight="4dp">
-
-    <TextView android:id="@+id/title"
-              style="@style/TabRowTextAppearance"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content"
-              android:textSize="18sp" />
-
-    <TextView android:id="@+id/url"
-              style="@style/TabRowTextAppearance.Url"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content"
-              android:maxLength="1024"
-              android:textSize="14sp" />
-
-</LinearLayout>
deleted file mode 100644
--- a/mobile/android/base/resources/layout/remote_tabs_container_panel.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?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/. -->
-
-<org.mozilla.gecko.tabs.RemoteTabsContainerPanel
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:visibility="gone">
-
-    <org.mozilla.gecko.tabs.RemoteTabsList
-            style="@style/RemoteTabsList"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:paddingLeft="@dimen/tabs_panel_list_padding"
-            android:paddingRight="@dimen/tabs_panel_list_padding"
-            android:scrollbarStyle="outsideOverlay"/>
-
-</org.mozilla.gecko.tabs.RemoteTabsContainerPanel>
deleted file mode 100644
--- a/mobile/android/base/resources/layout/remote_tabs_group.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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/. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:background="@android:color/transparent"
-              android:layout_width="match_parent"
-              android:layout_height="@dimen/remote_tab_child_row_height"
-              android:gravity="center_vertical"
-              android:orientation="vertical"
-              android:paddingLeft="4dp"
-              android:paddingRight="4dp" >
-
-    <org.mozilla.gecko.widget.AllCapsTextView android:id="@+id/client"
-                                              style="@style/TabRowTextAppearance"
-                                              android:layout_width="match_parent"
-                                              android:layout_height="@dimen/remote_tab_group_row_height"
-                                              android:textSize="18sp"
-                                              android:textStyle="bold" />
-
-    <TextView android:id="@+id/last_synced"
-              style="@style/TabRowTextAppearance.Url"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content"
-              android:maxLength="1024"
-              android:textSize="14sp" />
-
-</LinearLayout>
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/resources/layout/remote_tabs_panel.xml
@@ -0,0 +1,53 @@
+<?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/.
+-->
+
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+       xmlns:gecko="http://schemas.android.com/apk/res-auto" >
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" >
+
+        <LinearLayout
+            android:id="@+id/container"
+            style="@style/TabsPanelFrame.PrivateTabs"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" >
+
+            <LinearLayout
+                style="@style/TabsPanelSection.PrivateTabs.Header"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content" >
+
+                <TextView
+                    style="@style/TabsPanelItem.TextAppearance.Header.PrivateTabs"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="@string/remote_tabs_panel_moved_title" />
+
+                <TextView
+                    style="@style/TabsPanelItem.TextAppearance"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="@string/remote_tabs_panel_moved_desc" />
+            </LinearLayout>
+
+            <LinearLayout
+                style="@style/TabsPanelSection.PrivateTabs"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" >
+
+                <TextView
+                    android:id="@+id/go_to_panel"
+                    style="@style/TabsPanelItem.TextAppearance.Linkified.LearnMore"
+                    android:layout_width="match_parent"
+                    android:text="@string/remote_tabs_panel_moved_link" />
+            </LinearLayout>
+        </LinearLayout>
+    </ScrollView>
+
+</merge>
\ No newline at end of file
deleted file mode 100644
--- a/mobile/android/base/resources/layout/remote_tabs_setup_panel.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?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/. -->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <LinearLayout android:id="@+id/remote_tabs_setup_containing_layout"
-                  style="@style/TabsPanelFrame.RemoteTabs"
-                  android:layout_width="match_parent"
-                  android:layout_height="match_parent">
-
-        <LinearLayout style="@style/TabsPanelSection"
-                      android:layout_width="match_parent"
-                      android:layout_height="wrap_content">
-
-           <TextView style="@style/TabsPanelItem.TextAppearance.Header"
-                     android:layout_width="match_parent"
-                     android:layout_height="wrap_content"
-                     android:text="@string/fxaccount_getting_started_welcome_to_sync"/>
-
-           <TextView style="@style/TabsPanelItem.TextAppearance"
-                     android:layout_width="match_parent"
-                     android:layout_height="wrap_content"
-                     android:text="@string/fxaccount_getting_started_description"/>
-
-        </LinearLayout>
-
-        <LinearLayout style="@style/TabsPanelSection"
-                      android:layout_width="match_parent"
-                      android:layout_height="wrap_content">
-
-            <!-- Setting gravity/layout_gravity in portrait is redundant to these elements'
-                 styles, however, it overrides the default left-align behavior in landscape. -->
-            <Button android:id="@+id/remote_tabs_setup_get_started"
-                    android:layout_gravity="center"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    style="@style/TabsPanelItem.Button"
-                    android:text="@string/fxaccount_getting_started_get_started"
-                    android:layout_marginBottom="15dp"/>
-
-            <TextView android:id="@+id/remote_tabs_setup_old_sync_link"
-                      android:gravity="center"
-                      android:layout_gravity="center"
-                      android:layout_width="match_parent"
-                      android:layout_height="wrap_content"
-                      style="@style/TabsPanelItem.TextAppearance.Linkified"
-                      android:text="@string/fxaccount_getting_started_old_firefox"/>
-
-        </LinearLayout>
-
-    </LinearLayout>
-
-</merge>
deleted file mode 100644
--- a/mobile/android/base/resources/layout/remote_tabs_verification_panel.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?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/. -->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <LinearLayout android:id="@+id/remote_tabs_verification_containing_layout"
-                  style="@style/TabsPanelFrame.RemoteTabs"
-                  android:layout_width="match_parent"
-                  android:layout_height="match_parent">
-
-        <LinearLayout style="@style/TabsPanelSection"
-                      android:layout_width="match_parent"
-                      android:layout_height="wrap_content">
-
-            <TextView style="@style/TabsPanelItem.TextAppearance.Header.FXAccounts"
-                      android:layout_width="match_parent"
-                      android:layout_height="wrap_content"
-                      android:text="@string/fxaccount_full_label"
-                      android:layout_marginBottom="0dp"/>
-
-            <TextView style="@style/TabsPanelItem.TextAppearance.Header"
-                      android:layout_width="match_parent"
-                      android:layout_height="wrap_content"
-                      android:text="@string/fxaccount_confirm_account_header"
-                      android:layout_marginTop="0dp"/>
-
-            <TextView android:id="@+id/remote_tabs_confirm_verification"
-                      style="@style/TabsPanelItem.TextAppearance"
-                      android:layout_width="match_parent"
-                      android:layout_height="wrap_content"
-                      android:text="@string/fxaccount_confirm_account_verification_link"/>
-
-        </LinearLayout>
-
-        <LinearLayout style="@style/TabsPanelSection"
-                      android:layout_width="match_parent"
-                      android:layout_height="match_parent">
-
-            <TextView android:id="@+id/remote_tabs_confirm_resend"
-                      style="@style/TabsPanelItem.TextAppearance.Linkified.Resend"
-                      android:layout_width="match_parent"
-                      android:text="@string/fxaccount_confirm_account_resend_email"/>
-
-        </LinearLayout>
-
-    </LinearLayout>
-
-</merge>
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -373,16 +373,20 @@
   <string name="home_remote_tabs_unhide_selected_devices">&home_remote_tabs_unhide_selected_devices;</string>
   <string name="private_browsing_title">&private_browsing_title;</string>
   <string name="private_tabs_panel_empty_desc">&private_tabs_panel_empty_desc;</string>
   <string name="private_tabs_panel_learn_more">&private_tabs_panel_learn_more;</string>
   <!-- https://support.mozilla.org/%LOCALE%/kb/mobile-private-browsing-browse-web-without-saving-syncing-info -->
   <string name="private_tabs_panel_learn_more_link">https://support.mozilla.org/&formatS1;/kb/mobile-private-browsing-browse-web-without-saving-syncing-info</string>
   <string name="pin_site_dialog_hint">&pin_site_dialog_hint;</string>
 
+  <string name="remote_tabs_panel_moved_title">&remote_tabs_panel_moved_title;</string>
+  <string name="remote_tabs_panel_moved_desc">&remote_tabs_panel_moved_desc;</string>
+  <string name="remote_tabs_panel_moved_link">&remote_tabs_panel_moved_link;</string>
+
   <string name="filepicker_title">&filepicker_title;</string>
   <string name="filepicker_audio_title">&filepicker_audio_title;</string>
   <string name="filepicker_image_title">&filepicker_image_title;</string>
   <string name="filepicker_video_title">&filepicker_video_title;</string>
 
   <!-- Default bookmarks. We used to use bookmark titles shared with XUL from mobile's
        profile/bookmarks.inc (see bug 964946). Don't expose the URLs to L10N. -->
   <string name="bookmarkdefaults_title_aboutfirefox">@bookmarks_aboutBrowser@</string>
deleted file mode 100644
--- a/mobile/android/base/tabs/RemoteTabsContainerPanel.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/* 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.tabs;
-
-import org.mozilla.gecko.R;
-import org.mozilla.gecko.Tabs;
-import org.mozilla.gecko.TabsAccessor;
-import org.mozilla.gecko.fxa.FirefoxAccounts;
-import org.mozilla.gecko.tabs.TabsPanel.Panel;
-import org.mozilla.gecko.util.ThreadUtils;
-import org.mozilla.gecko.widget.GeckoSwipeRefreshLayout;
-
-import android.accounts.Account;
-import android.content.Context;
-import android.graphics.drawable.AnimationDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- * Provides a container to wrap the list of synced tabs and provide
- * swipe-to-refresh support. The only child view should be an instance of
- * {@link RemoteTabsList}.
- */
-public class RemoteTabsContainerPanel extends GeckoSwipeRefreshLayout
-                                 implements TabsPanel.PanelView {
-    private static final String[] STAGES_TO_SYNC_ON_REFRESH = new String[] { "clients", "tabs" };
-
-    /**
-     * Refresh indicators (the swipe-to-refresh "laser show" and the spinning
-     * icon) will never be shown for less than the following duration, in
-     * milliseconds.
-     */
-    private static final long MINIMUM_REFRESH_INDICATOR_DURATION_IN_MS = 12 * 100; // 12 frames, 100 ms each.
-
-    private final Context context;
-    private final RemoteTabsSyncObserver syncListener;
-    private TabsPanel panel;
-    private RemoteTabsList list;
-
-    // Whether or not a sync status listener is attached.
-    private boolean isListening;
-
-    public RemoteTabsContainerPanel(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        this.context = context;
-        this.syncListener = new RemoteTabsSyncObserver();
-
-        setOnRefreshListener(new RemoteTabsRefreshListener());
-    }
-
-    @Override
-    public void addView(View child, int index, ViewGroup.LayoutParams params) {
-        super.addView(child, index, params);
-
-        list = (RemoteTabsList) child;
-
-        // Must be called after the child view has been added.
-        setColorScheme(R.color.swipe_refresh_orange1, R.color.swipe_refresh_orange2,
-                       R.color.swipe_refresh_orange3, R.color.swipe_refresh_orange4);
-    }
-
-
-    @Override
-    public boolean canChildScrollUp() {
-        // We are not supporting swipe-to-refresh for old sync. This disables
-        // the swipe gesture if no FxA are detected.
-        if (FirefoxAccounts.firefoxAccountsExist(getContext())) {
-            return super.canChildScrollUp();
-        } else {
-            return true;
-        }
-    }
-
-    @Override
-    public void setTabsPanel(TabsPanel panel) {
-        this.panel = panel;
-        list.setTabsPanel(panel);
-    }
-
-    @Override
-    public void show() {
-        // Start fetching remote tabs.
-        TabsAccessor.getTabs(context, list);
-        // The user can trigger a tabs sync, so we want to be very certain the
-        // locally-persisted tabs are fresh (tab writes are batched and delayed).
-        Tabs.getInstance().persistAllTabs();
-
-        if (!isListening) {
-            isListening = true;
-            FirefoxAccounts.addSyncStatusListener(syncListener);
-        }
-        setVisibility(View.VISIBLE);
-    }
-
-    @Override
-    public void hide() {
-        setVisibility(View.GONE);
-        if (isListening) {
-            isListening = false;
-            FirefoxAccounts.removeSyncStatusListener(syncListener);
-        }
-    }
-
-    @Override
-    public boolean shouldExpand() {
-        return true;
-    }
-
-    private class RemoteTabsRefreshListener implements OnRefreshListener {
-        @Override
-        public void onRefresh() {
-            if (FirefoxAccounts.firefoxAccountsExist(getContext())) {
-                final Account account = FirefoxAccounts.getFirefoxAccount(getContext());
-                FirefoxAccounts.requestSync(account, FirefoxAccounts.FORCE, STAGES_TO_SYNC_ON_REFRESH, null);
-            }
-        }
-    }
-
-    private class RemoteTabsSyncObserver implements FirefoxAccounts.SyncStatusListener {
-        // Written on the main thread, and read off the main thread, but no need
-        // to synchronize.
-        protected volatile long lastSyncStarted;
-
-        @Override
-        public Context getContext() {
-            return RemoteTabsContainerPanel.this.getContext();
-        }
-
-        @Override
-        public Account getAccount() {
-            return FirefoxAccounts.getFirefoxAccount(getContext());
-        }
-
-        public void onSyncStarted() {
-            ThreadUtils.postToUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    lastSyncStarted = System.currentTimeMillis();
-
-                    // Replace the static sync icon with an animated icon, and
-                    // start the animation. This works around an Android 4.4.2
-                    // bug, which makes animating the animated icon unreliable.
-                    // See Bug 1015974.
-                    panel.setIconDrawable(Panel.REMOTE_TABS, R.drawable.tabs_synced_animated);
-                    final Drawable iconDrawable = panel.getIconDrawable(Panel.REMOTE_TABS);
-                    if (iconDrawable instanceof AnimationDrawable) {
-                        ((AnimationDrawable) iconDrawable).start();
-                    }
-                }
-            });
-        }
-
-        public void onSyncFinished() {
-            final Handler uiHandler = ThreadUtils.getUiHandler();
-
-            // We want to update the list immediately ...
-            uiHandler.post(new Runnable() {
-                @Override
-                public void run() {
-                    TabsAccessor.getTabs(context, list);
-                }
-            });
-
-            // ... but we want the refresh indicators to persist for long enough
-            // to be visible.
-            final long last = lastSyncStarted;
-            final long now = System.currentTimeMillis();
-            final long delay = Math.max(0, MINIMUM_REFRESH_INDICATOR_DURATION_IN_MS - (now - last));
-
-            uiHandler.postDelayed(new Runnable() {
-                @Override
-                public void run() {
-                    setRefreshing(false);
-
-                    // Replace the animated sync icon with the static sync icon.
-                    // This works around an Android 4.4.2 bug, which makes
-                    // animating the animated icon unreliable. See Bug 1015974.
-                    panel.setIconDrawable(Panel.REMOTE_TABS, R.drawable.tabs_synced);
-                }
-            }, delay);
-        }
-    }
-}
deleted file mode 100644
--- a/mobile/android/base/tabs/RemoteTabsList.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/* 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.tabs;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.mozilla.gecko.R;
-import org.mozilla.gecko.RemoteTabsExpandableListAdapter;
-import org.mozilla.gecko.Tabs;
-import org.mozilla.gecko.TabsAccessor;
-import org.mozilla.gecko.TabsAccessor.RemoteClient;
-import org.mozilla.gecko.TabsAccessor.RemoteTab;
-import org.mozilla.gecko.Telemetry;
-import org.mozilla.gecko.TelemetryContract;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.ExpandableListView;
-
-/**
- * The actual list of synced tabs. This serves as the only child view of {@link RemoteTabsContainerPanel}
- * so it can be refreshed using a swipe-to-refresh gesture.
- */
-public class RemoteTabsList extends ExpandableListView
-                            implements ExpandableListView.OnGroupClickListener,
-                                       ExpandableListView.OnChildClickListener,
-                                       TabsAccessor.OnQueryTabsCompleteListener {
-    private TabsPanel tabsPanel;
-
-    // A list of the clients that are currently expanded.
-    private List<String> expandedClientList;
-
-    // The client that previously had an item selected is used to restore the scroll position.
-    private String clientScrollPosition;
-
-    public RemoteTabsList(Context context, AttributeSet attrs) {
-        super(context, attrs);
-
-        setOnGroupClickListener(this);
-        setOnChildClickListener(this);
-        setAdapter(new RemoteTabsExpandableListAdapter(R.layout.remote_tabs_group, R.layout.remote_tabs_child, null));
-    }
-
-    public void setTabsPanel(TabsPanel panel) {
-        tabsPanel = panel;
-    }
-
-    private void autoHidePanel() {
-        tabsPanel.autoHidePanel();
-    }
-
-    @Override
-    public boolean onGroupClick(ExpandableListView parent, View view, int groupPosition, long id) {
-        final RemoteClient client = (RemoteClient) parent.getExpandableListAdapter().getGroup(groupPosition);
-        final String clientGuid = client.guid;
-
-        if (isGroupExpanded(groupPosition)) {
-            collapseGroup(groupPosition);
-            expandedClientList.remove(clientGuid);
-        } else {
-            expandGroup(groupPosition);
-            expandedClientList.add(clientGuid);
-        }
-
-        clientScrollPosition = clientGuid;
-        return true;
-    }
-
-    @Override
-    public boolean onChildClick(ExpandableListView parent, View view, int groupPosition, int childPosition, long id) {
-        final RemoteTab tab = (RemoteTab) parent.getExpandableListAdapter().getChild(groupPosition, childPosition);
-        if (tab == null) {
-            autoHidePanel();
-            return true;
-        }
-
-        Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, TelemetryContract.Method.LIST_ITEM, "remote");
-
-        Tabs.getInstance().loadUrl(tab.url, Tabs.LOADURL_NEW_TAB);
-        autoHidePanel();
-
-        final RemoteClient client = (RemoteClient) parent.getExpandableListAdapter().getGroup(groupPosition);
-        clientScrollPosition = client.guid;
-
-        return true;
-    }
-
-    @Override
-    public void onQueryTabsComplete(List<RemoteClient> clients) {
-        ((RemoteTabsExpandableListAdapter) getExpandableListAdapter()).replaceClients(clients);
-
-        // Either set the initial UI state, or restore it.
-        List<String> newExpandedClientList = new ArrayList<String>();
-        for (int i = 0; i < clients.size(); i++) {
-            final String clientGuid = clients.get(i).guid;
-
-            if (expandedClientList == null) {
-                // On initial entry we expand all clients by default.
-                newExpandedClientList.add(clientGuid);
-                expandGroup(i);
-            } else {
-                // On subsequent entries, we expand clients based on their previous UI state.
-                if (expandedClientList.contains(clientGuid)) {
-                    newExpandedClientList.add(clientGuid);
-                    expandGroup(i);
-                }
-
-                // Additionally we reset the UI scroll position.
-                if (clientGuid.equals(clientScrollPosition)) {
-                    setSelectedGroup(i);
-                }
-            }
-        }
-        expandedClientList = newExpandedClientList;
-    }
-}
--- a/mobile/android/base/tabs/RemoteTabsPanel.java
+++ b/mobile/android/base/tabs/RemoteTabsPanel.java
@@ -1,123 +1,64 @@
 /* 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.tabs;
 
 import org.mozilla.gecko.R;
-import org.mozilla.gecko.fxa.FirefoxAccounts;
-import org.mozilla.gecko.fxa.login.State;
-import org.mozilla.gecko.sync.setup.SyncAccounts;
+import org.mozilla.gecko.Tabs;
+import org.mozilla.gecko.home.HomeConfig;
 import org.mozilla.gecko.tabs.TabsPanel.PanelView;
 
 import android.content.Context;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.FrameLayout;
+import android.widget.LinearLayout;
 
 /**
- * This panel, which is a {@link TabsPanel.PanelView}, chooses which underlying
- * PanelView to show based on the current account state, and forwards the appropriate
- * calls to the currently visible panel.
+ * A tabs tray panel that displays a static view that informs users that the
+ * Synced Tabs/Remote Tabs list is now accessed as a home panel. The view
+ * provides a single link that opens the new home panel.
  */
 class RemoteTabsPanel extends FrameLayout implements PanelView {
-    private enum RemotePanelType {
-        SETUP,
-        VERIFICATION,
-        CONTAINER
-    }
-
-    private PanelView currentPanel;
-    private RemotePanelType currentPanelType;
-
     private TabsPanel tabsPanel;
 
     public RemoteTabsPanel(Context context, AttributeSet attrs) {
         super(context, attrs);
-        updateCurrentPanel();
+
+        LayoutInflater.from(context).inflate(R.layout.remote_tabs_panel, this);
+
+        final View link = findViewById(R.id.go_to_panel);
+        link.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                // For now, we don't do anything.
+                if (tabsPanel != null) {
+                    tabsPanel.autoHidePanel();
+                }
+            }
+        });
     }
 
     @Override
     public void setTabsPanel(TabsPanel panel) {
         tabsPanel = panel;
-        currentPanel.setTabsPanel(panel);
     }
 
     @Override
     public void show() {
-        updateCurrentPanel();
-        currentPanel.show();
         setVisibility(View.VISIBLE);
     }
 
     @Override
     public void hide() {
         setVisibility(View.GONE);
-        currentPanel.hide();
     }
 
     @Override
     public boolean shouldExpand() {
-        return currentPanel.shouldExpand();
-    }
-
-    private void updateCurrentPanel() {
-        final RemotePanelType newPanelType = getPanelTypeFromAccountState();
-        if (newPanelType != currentPanelType) {
-            // The current panel should be null the first time this is called.
-            if (currentPanel != null) {
-                currentPanel.hide();
-            }
-            removeAllViews();
-
-            currentPanelType = newPanelType;
-            currentPanel = inflatePanel(currentPanelType);
-            currentPanel.setTabsPanel(tabsPanel);
-            addView((View) currentPanel);
-        }
-    }
-
-    private RemotePanelType getPanelTypeFromAccountState() {
-        final Context context = getContext();
-        final State accountState = FirefoxAccounts.getFirefoxAccountState(context);
-        if (accountState == null) {
-            // If old Sync exists, we want to show their synced tabs,
-            // rather than the new Sync setup screen.
-            if (SyncAccounts.syncAccountsExist(context)) {
-                return RemotePanelType.CONTAINER;
-            } else {
-                return RemotePanelType.SETUP;
-            }
-        }
-
-        if (accountState.getNeededAction() == State.Action.NeedsVerification) {
-            return RemotePanelType.VERIFICATION;
-        }
-
-        return RemotePanelType.CONTAINER;
-    }
-
-    private PanelView inflatePanel(final RemotePanelType panelType) {
-        final PanelView view;
-        switch (panelType) {
-            case SETUP:
-                view = new RemoteTabsSetupPanel(getContext());
-                break;
-
-            case VERIFICATION:
-                view = new RemoteTabsVerificationPanel(getContext());
-                break;
-
-            case CONTAINER:
-                final LayoutInflater inflater = LayoutInflater.from(getContext());
-                view = (PanelView) inflater.inflate(R.layout.remote_tabs_container_panel, null);
-                break;
-
-            default:
-                throw new IllegalArgumentException("Unknown panelType, " + panelType);
-        }
-
-        return view;
+        final LinearLayout container = (LinearLayout) findViewById(R.id.container);
+        return container.getOrientation() == LinearLayout.VERTICAL;
     }
 }
deleted file mode 100644
--- a/mobile/android/base/tabs/RemoteTabsSetupPanel.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/* 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.tabs;
-
-import java.util.Locale;
-
-import org.mozilla.gecko.R;
-import org.mozilla.gecko.Tabs;
-import org.mozilla.gecko.fxa.FirefoxAccounts;
-import org.mozilla.gecko.fxa.activities.FxAccountCreateAccountActivity;
-import org.mozilla.gecko.tabs.TabsPanel.PanelView;
-
-import android.content.Context;
-import android.content.Intent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.ScrollView;
-
-/**
- * A tabs panel which allows a user to get started setting up a Firefox
- * Accounts account. Currently used as one sub-panel in a sequence
- * contained by the {@link RemoteTabsPanel}.
- */
-class RemoteTabsSetupPanel extends ScrollView implements PanelView {
-    private final LinearLayout containingLayout;
-
-    private TabsPanel tabsPanel;
-
-    public RemoteTabsSetupPanel(Context context) {
-        super(context);
-
-        LayoutInflater.from(context).inflate(R.layout.remote_tabs_setup_panel, this);
-        containingLayout = (LinearLayout) findViewById(R.id.remote_tabs_setup_containing_layout);
-
-        final View setupGetStartedButton =
-                containingLayout.findViewById(R.id.remote_tabs_setup_get_started);
-        setupGetStartedButton.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(final View v) {
-                final Context context = getContext();
-                // This Activity will redirect to the correct Activity if the
-                // account is no longer in the setup state.
-                final Intent intent = new Intent(context, FxAccountCreateAccountActivity.class);
-                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                context.startActivity(intent);
-            }
-        });
-
-        final View setupOlderVersionLink =
-                containingLayout.findViewById(R.id.remote_tabs_setup_old_sync_link);
-        setupOlderVersionLink.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(final View v) {
-                final String url = FirefoxAccounts.getOldSyncUpgradeURL(
-                        getResources(), Locale.getDefault());
-                Tabs.getInstance().loadUrlInTab(url);
-                if (tabsPanel != null) {
-                    tabsPanel.autoHidePanel();
-                }
-            }
-        });
-    }
-
-    @Override
-    public void setTabsPanel(TabsPanel panel) {
-        tabsPanel = panel;
-    }
-
-    @Override
-    public void show() {
-        setVisibility(View.VISIBLE);
-    }
-
-    @Override
-    public void hide() {
-        setVisibility(View.GONE);
-    }
-
-    @Override
-    public boolean shouldExpand() {
-        return containingLayout.getOrientation() == LinearLayout.VERTICAL;
-    }
-}
deleted file mode 100644
--- a/mobile/android/base/tabs/RemoteTabsVerificationPanel.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/* 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.tabs;
-
-import org.mozilla.gecko.R;
-import org.mozilla.gecko.fxa.FirefoxAccounts;
-import org.mozilla.gecko.fxa.login.State;
-import org.mozilla.gecko.tabs.TabsPanel.PanelView;
-
-import android.content.Context;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.ScrollView;
-import android.widget.TextView;
-
-/**
- * A tabs panel which allows a user to get resend the verification email
- * to confirm a Firefox Account. Currently used as one sub-panel in a sequence
- * contained by the {@link RemoteTabsPanel}.
- */
-class RemoteTabsVerificationPanel extends ScrollView implements PanelView {
-    private static final String LOG_TAG = RemoteTabsVerificationPanel.class.getSimpleName();
-
-    private final LinearLayout containingLayout;
-
-    private TabsPanel tabsPanel;
-
-    public RemoteTabsVerificationPanel(Context context) {
-        super(context);
-
-        LayoutInflater.from(context).inflate(R.layout.remote_tabs_verification_panel, this);
-        containingLayout = (LinearLayout) findViewById(R.id.remote_tabs_verification_containing_layout);
-
-        final View resendLink = containingLayout.findViewById(R.id.remote_tabs_confirm_resend);
-        resendLink.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                final State accountState = FirefoxAccounts.getFirefoxAccountState(getContext());
-                final State.Action neededAction = accountState.getNeededAction();
-                if (accountState.getNeededAction() != State.Action.NeedsVerification) {
-                    autoHideTabsPanelOnUnexpectedState("Account expected to need verification " +
-                            "on resend, but action was " + neededAction + " instead.");
-                    return;
-                }
-
-                if (!FirefoxAccounts.resendVerificationEmail(getContext())) {
-                    autoHideTabsPanelOnUnexpectedState("Account DNE when resending verification email.");
-                    return;
-                }
-            }
-        });
-    }
-
-    private void refresh() {
-        final TextView verificationView =
-                (TextView) containingLayout.findViewById(R.id.remote_tabs_confirm_verification);
-        final String email = FirefoxAccounts.getFirefoxAccountEmail(getContext());
-        if (email == null) {
-            autoHideTabsPanelOnUnexpectedState("Account email DNE on View refresh.");
-            return;
-        }
-
-        final String text = getResources().getString(
-                R.string.fxaccount_confirm_account_verification_link, email);
-        verificationView.setText(text);
-    }
-
-    /**
-     * Hides the tabs panel and logs the given String.
-     *
-     * As the name suggests, this method should be only be used for unexpected states!
-     * We hide the tabs panel on unexpected states as the best of several evils - hiding
-     * the tabs panel communicates to the user, "Hey, that's a strange bug!" and, if they're
-     * curious enough, will reopen the RemoteTabsPanel, refreshing its contents. Since we're
-     * in a strange state, we may already be screwed, but it's better than some alternatives like:
-     *   * Crashing
-     *   * Hiding the resources which allow invalid state (e.g. resend link, email text)
-     *   * Attempting to refresh the RemoteTabsPanel, possibly starting an infinite loop.
-     *
-     * @param log The message to log.
-     */
-    private void autoHideTabsPanelOnUnexpectedState(final String log) {
-        Log.w(LOG_TAG, "Unexpected state: " + log + " Closing the tabs panel.");
-
-        if (tabsPanel != null) {
-            tabsPanel.autoHidePanel();
-        }
-    }
-
-    @Override
-    public void setTabsPanel(TabsPanel panel) {
-        tabsPanel = panel;
-    }
-
-    @Override
-    public void show() {
-        refresh();
-        setVisibility(View.VISIBLE);
-    }
-
-    @Override
-    public void hide() {
-        setVisibility(View.GONE);
-    }
-
-    @Override
-    public boolean shouldExpand() {
-        return containingLayout.getOrientation() == LinearLayout.VERTICAL;
-    }
-}