| |
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
| |
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
| |
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
4 |
| |
5 package org.mozilla.gecko; |
| |
6 |
| |
7 import org.mozilla.gecko.Telemetry; |
| |
8 import org.mozilla.gecko.TelemetryContract; |
| |
9 |
| |
10 import android.content.Context; |
| |
11 import android.text.TextUtils; |
| |
12 import android.util.AttributeSet; |
| |
13 import android.view.View; |
| |
14 import android.view.ViewGroup; |
| |
15 import android.widget.ExpandableListView; |
| |
16 import android.widget.SimpleExpandableListAdapter; |
| |
17 |
| |
18 import java.util.ArrayList; |
| |
19 import java.util.HashMap; |
| |
20 import java.util.List; |
| |
21 |
| |
22 /** |
| |
23 * The actual list of synced tabs. This serves as the only child view of {@link RemoteTabsContainer} |
| |
24 * so it can be refreshed using a swipe-to-refresh gesture. |
| |
25 */ |
| |
26 class RemoteTabsList extends ExpandableListView |
| |
27 implements ExpandableListView.OnGroupClickListener, |
| |
28 ExpandableListView.OnChildClickListener, |
| |
29 TabsAccessor.OnQueryTabsCompleteListener { |
| |
30 private static final String[] CLIENT_KEY = new String[] { "name" }; |
| |
31 private static final String[] TAB_KEY = new String[] { "title", "url" }; |
| |
32 private static final int[] CLIENT_RESOURCE = new int[] { R.id.client }; |
| |
33 private static final int[] TAB_RESOURCE = new int[] { R.id.tab, R.id.url }; |
| |
34 |
| |
35 private final Context context; |
| |
36 private TabsPanel tabsPanel; |
| |
37 |
| |
38 private ArrayList <ArrayList <HashMap <String, String>>> tabsList; |
| |
39 |
| |
40 public RemoteTabsList(Context context, AttributeSet attrs) { |
| |
41 super(context, attrs); |
| |
42 this.context = context; |
| |
43 |
| |
44 setOnGroupClickListener(this); |
| |
45 setOnChildClickListener(this); |
| |
46 } |
| |
47 |
| |
48 public void setTabsPanel(TabsPanel panel) { |
| |
49 tabsPanel = panel; |
| |
50 } |
| |
51 |
| |
52 private void autoHidePanel() { |
| |
53 tabsPanel.autoHidePanel(); |
| |
54 } |
| |
55 |
| |
56 @Override |
| |
57 public boolean onGroupClick(ExpandableListView parent, View view, int position, long id) { |
| |
58 // By default, the group collapses/expands. Consume the event. |
| |
59 return true; |
| |
60 } |
| |
61 |
| |
62 @Override |
| |
63 public boolean onChildClick(ExpandableListView parent, View view, int groupPosition, int childPosition, long id) { |
| |
64 HashMap <String, String> tab = tabsList.get(groupPosition).get(childPosition); |
| |
65 if (tab == null) { |
| |
66 autoHidePanel(); |
| |
67 return true; |
| |
68 } |
| |
69 |
| |
70 Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, "", "remote"); |
| |
71 |
| |
72 Tabs.getInstance().loadUrl(tab.get("url"), Tabs.LOADURL_NEW_TAB); |
| |
73 autoHidePanel(); |
| |
74 return true; |
| |
75 } |
| |
76 |
| |
77 @Override |
| |
78 public void onQueryTabsComplete(List<TabsAccessor.RemoteTab> remoteTabsList) { |
| |
79 ArrayList<TabsAccessor.RemoteTab> remoteTabs = new ArrayList<TabsAccessor.RemoteTab> (remoteTabsList); |
| |
80 if (remoteTabs == null || remoteTabs.size() == 0) |
| |
81 return; |
| |
82 |
| |
83 ArrayList <HashMap <String, String>> clients = new ArrayList <HashMap <String, String>>(); |
| |
84 |
| |
85 tabsList = new ArrayList <ArrayList <HashMap <String, String>>>(); |
| |
86 |
| |
87 String oldGuid = null; |
| |
88 ArrayList <HashMap <String, String>> tabsForClient = null; |
| |
89 HashMap <String, String> client; |
| |
90 HashMap <String, String> tab; |
| |
91 |
| |
92 for (TabsAccessor.RemoteTab remoteTab : remoteTabs) { |
| |
93 if (oldGuid == null || !TextUtils.equals(oldGuid, remoteTab.guid)) { |
| |
94 client = new HashMap <String, String>(); |
| |
95 client.put("name", remoteTab.name); |
| |
96 clients.add(client); |
| |
97 |
| |
98 tabsForClient = new ArrayList <HashMap <String, String>>(); |
| |
99 tabsList.add(tabsForClient); |
| |
100 |
| |
101 oldGuid = new String(remoteTab.guid); |
| |
102 } |
| |
103 |
| |
104 tab = new HashMap<String, String>(); |
| |
105 tab.put("title", TextUtils.isEmpty(remoteTab.title) ? remoteTab.url : remoteTab.title); |
| |
106 tab.put("url", remoteTab.url); |
| |
107 tabsForClient.add(tab); |
| |
108 } |
| |
109 |
| |
110 setAdapter(new SimpleExpandableListAdapter(context, |
| |
111 clients, |
| |
112 R.layout.remote_tabs_group, |
| |
113 CLIENT_KEY, |
| |
114 CLIENT_RESOURCE, |
| |
115 tabsList, |
| |
116 R.layout.remote_tabs_child, |
| |
117 TAB_KEY, |
| |
118 TAB_RESOURCE)); |
| |
119 |
| |
120 for (int i = 0; i < clients.size(); i++) { |
| |
121 expandGroup(i); |
| |
122 } |
| |
123 } |
| |
124 } |