diff -r 000000000000 -r 6474c204b198 mobile/android/base/RemoteTabsList.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobile/android/base/RemoteTabsList.java Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,124 @@ +/* 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; + +import org.mozilla.gecko.Telemetry; +import org.mozilla.gecko.TelemetryContract; + +import android.content.Context; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ExpandableListView; +import android.widget.SimpleExpandableListAdapter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * The actual list of synced tabs. This serves as the only child view of {@link RemoteTabsContainer} + * so it can be refreshed using a swipe-to-refresh gesture. + */ +class RemoteTabsList extends ExpandableListView + implements ExpandableListView.OnGroupClickListener, + ExpandableListView.OnChildClickListener, + TabsAccessor.OnQueryTabsCompleteListener { + private static final String[] CLIENT_KEY = new String[] { "name" }; + private static final String[] TAB_KEY = new String[] { "title", "url" }; + private static final int[] CLIENT_RESOURCE = new int[] { R.id.client }; + private static final int[] TAB_RESOURCE = new int[] { R.id.tab, R.id.url }; + + private final Context context; + private TabsPanel tabsPanel; + + private ArrayList >> tabsList; + + public RemoteTabsList(Context context, AttributeSet attrs) { + super(context, attrs); + this.context = context; + + setOnGroupClickListener(this); + setOnChildClickListener(this); + } + + public void setTabsPanel(TabsPanel panel) { + tabsPanel = panel; + } + + private void autoHidePanel() { + tabsPanel.autoHidePanel(); + } + + @Override + public boolean onGroupClick(ExpandableListView parent, View view, int position, long id) { + // By default, the group collapses/expands. Consume the event. + return true; + } + + @Override + public boolean onChildClick(ExpandableListView parent, View view, int groupPosition, int childPosition, long id) { + HashMap tab = tabsList.get(groupPosition).get(childPosition); + if (tab == null) { + autoHidePanel(); + return true; + } + + Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, "", "remote"); + + Tabs.getInstance().loadUrl(tab.get("url"), Tabs.LOADURL_NEW_TAB); + autoHidePanel(); + return true; + } + + @Override + public void onQueryTabsComplete(List remoteTabsList) { + ArrayList remoteTabs = new ArrayList (remoteTabsList); + if (remoteTabs == null || remoteTabs.size() == 0) + return; + + ArrayList > clients = new ArrayList >(); + + tabsList = new ArrayList >>(); + + String oldGuid = null; + ArrayList > tabsForClient = null; + HashMap client; + HashMap tab; + + for (TabsAccessor.RemoteTab remoteTab : remoteTabs) { + if (oldGuid == null || !TextUtils.equals(oldGuid, remoteTab.guid)) { + client = new HashMap (); + client.put("name", remoteTab.name); + clients.add(client); + + tabsForClient = new ArrayList >(); + tabsList.add(tabsForClient); + + oldGuid = new String(remoteTab.guid); + } + + tab = new HashMap(); + tab.put("title", TextUtils.isEmpty(remoteTab.title) ? remoteTab.url : remoteTab.title); + tab.put("url", remoteTab.url); + tabsForClient.add(tab); + } + + setAdapter(new SimpleExpandableListAdapter(context, + clients, + R.layout.remote_tabs_group, + CLIENT_KEY, + CLIENT_RESOURCE, + tabsList, + R.layout.remote_tabs_child, + TAB_KEY, + TAB_RESOURCE)); + + for (int i = 0; i < clients.size(); i++) { + expandGroup(i); + } + } +}