зеркало из https://github.com/mozilla/gecko-dev.git
Bug 708266: UI to show tabs remote tabs. [r=mfinkle, r=rnewman]
--HG-- rename : mobile/android/base/resources/drawable/background.png => mobile/android/base/resources/drawable-nodpi/background.png
This commit is contained in:
Родитель
2484a7808b
Коммит
02059bbdef
|
@ -717,18 +717,4 @@ public class AboutHomeContent extends ScrollView {
|
|||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static class LinkTextView extends TextView {
|
||||
public LinkTextView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setText(CharSequence text, BufferType type) {
|
||||
SpannableString content = new SpannableString(text + " \u00BB");
|
||||
content.setSpan(new UnderlineSpan(), 0, text.length(), 0);
|
||||
|
||||
super.setText(content, BufferType.SPANNABLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -160,6 +160,10 @@
|
|||
android:theme="@style/Gecko.Translucent.TabsTray"
|
||||
android:launchMode="singleTask"/>
|
||||
|
||||
<activity android:name="org.mozilla.gecko.RemoteTabs"
|
||||
android:theme="@style/Gecko.Translucent.TabsTray"
|
||||
android:launchMode="singleTask"/>
|
||||
|
||||
<activity android:name="org.mozilla.gecko.GeckoPreferences"
|
||||
android:theme="@style/Gecko.TitleBar.Preferences"
|
||||
android:label="@string/settings_title"
|
||||
|
|
|
@ -850,7 +850,6 @@ abstract public class GeckoApp
|
|||
|
||||
void showTabs() {
|
||||
Intent intent = new Intent(mAppContext, TabsTray.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
|
||||
startActivity(intent);
|
||||
overridePendingTransition(R.anim.grow_fade_in, 0);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
/* 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 android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.text.SpannableString;
|
||||
import android.text.style.UnderlineSpan;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class LinkTextView extends TextView {
|
||||
public LinkTextView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setText(CharSequence text, BufferType type) {
|
||||
SpannableString content = new SpannableString(text + " \u00BB");
|
||||
content.setSpan(new UnderlineSpan(), 0, text.length(), 0);
|
||||
|
||||
super.setText(content, BufferType.SPANNABLE);
|
||||
}
|
||||
}
|
|
@ -94,12 +94,14 @@ FENNEC_JAVA_FILES = \
|
|||
GeckoThread.java \
|
||||
GlobalHistory.java \
|
||||
LinkPreference.java \
|
||||
LinkTextView.java \
|
||||
ProfileMigrator.java \
|
||||
PromptService.java \
|
||||
sqlite/ByteBufferInputStream.java \
|
||||
sqlite/MatrixBlobCursor.java \
|
||||
sqlite/SQLiteBridge.java \
|
||||
sqlite/SQLiteBridgeException.java \
|
||||
RemoteTabs.java \
|
||||
SetupScreen.java \
|
||||
SurfaceLockInfo.java \
|
||||
Tab.java \
|
||||
|
@ -245,6 +247,9 @@ RES_LAYOUT = \
|
|||
res/layout/notification_progress_text.xml \
|
||||
res/layout/site_setting_title.xml \
|
||||
res/layout/setup_screen.xml \
|
||||
res/layout/remote_tabs.xml \
|
||||
res/layout/remote_tabs_child.xml \
|
||||
res/layout/remote_tabs_group.xml \
|
||||
res/layout/tabs_row.xml \
|
||||
res/layout/tabs_tray.xml \
|
||||
res/layout/list_item_header.xml \
|
||||
|
@ -290,6 +295,7 @@ RES_ANIM = \
|
|||
RES_DRAWABLE_NODPI = \
|
||||
res/drawable-nodpi/abouthome_bg.png \
|
||||
res/drawable-nodpi/abouthome_topsites_bg.png \
|
||||
res/drawable-nodpi/background.png \
|
||||
res/drawable-nodpi/tabs_tray_bg.png \
|
||||
res/drawable-nodpi/tabs_tray_pressed_bg.png \
|
||||
$(NULL)
|
||||
|
@ -525,7 +531,6 @@ MOZ_ANDROID_DRAWABLES += \
|
|||
mobile/android/base/resources/drawable/awesomebar_tab_press_selected.xml \
|
||||
mobile/android/base/resources/drawable/awesomebar_tab_selected.xml \
|
||||
mobile/android/base/resources/drawable/awesomebar_tab_unselected.xml \
|
||||
mobile/android/base/resources/drawable/background.png \
|
||||
mobile/android/base/resources/drawable/desktop_notification.png \
|
||||
mobile/android/base/resources/drawable/gecko_actionbar_bg.xml \
|
||||
mobile/android/base/resources/drawable/progress_spinner.xml \
|
||||
|
@ -547,6 +552,7 @@ MOZ_ANDROID_DRAWABLES += \
|
|||
mobile/android/base/resources/drawable/progress_spinner_16.png \
|
||||
mobile/android/base/resources/drawable/progress_spinner_17.png \
|
||||
mobile/android/base/resources/drawable/progress_spinner_18.png \
|
||||
mobile/android/base/resources/drawable/remote_tabs_group_bg_repeat.xml \
|
||||
mobile/android/base/resources/drawable/start.png \
|
||||
mobile/android/base/resources/drawable/site_security_level.xml \
|
||||
mobile/android/base/resources/drawable/tabs_button.xml \
|
||||
|
|
|
@ -0,0 +1,230 @@
|
|||
/* 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 java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.mozilla.gecko.db.BrowserContract.Clients;
|
||||
import org.mozilla.gecko.db.BrowserContract.Tabs;
|
||||
import org.mozilla.gecko.db.BrowserContract;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Bundle;
|
||||
import android.os.SystemClock;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ExpandableListView;
|
||||
import android.widget.SimpleExpandableListAdapter;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
public class RemoteTabs extends Activity
|
||||
implements ExpandableListView.OnGroupClickListener, ExpandableListView.OnChildClickListener {
|
||||
private static final String LOGTAG = "GeckoRemoteTabs";
|
||||
|
||||
private static int sPreferredHeight;
|
||||
private static int sChildItemHeight;
|
||||
private static int sGroupItemHeight;
|
||||
private static ExpandableListView mList;
|
||||
|
||||
private static ArrayList <HashMap <String, String>> mClientsList;
|
||||
private static ArrayList <ArrayList <HashMap <String, String>>> mTabsList;
|
||||
|
||||
// 50 for child + 2 for divider
|
||||
private static final int CHILD_ITEM_HEIGHT = 52;
|
||||
|
||||
// 30 for group + 2 for divider
|
||||
private static final int GROUP_ITEM_HEIGHT = 32;
|
||||
|
||||
private static final String[] PROJECTION_COLUMNS = new String[] {
|
||||
BrowserContract.Tabs.TITLE, // 0
|
||||
BrowserContract.Tabs.URL, // 1
|
||||
BrowserContract.Clients.GUID, // 2
|
||||
BrowserContract.Clients.NAME // 3
|
||||
};
|
||||
|
||||
private static final String[] CLIENT_KEY = new String[] { "name" };
|
||||
private static final String[] TAB_KEY = new String[] { "title" };
|
||||
private static final int[] CLIENT_RESOURCE = new int[] { R.id.client };
|
||||
private static final int[] TAB_RESOURCE = new int[] { R.id.tab };
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.remote_tabs);
|
||||
|
||||
mList = (ExpandableListView) findViewById(R.id.list);
|
||||
mList.setOnGroupClickListener(this);
|
||||
mList.setOnChildClickListener(this);
|
||||
|
||||
LinearLayout container = (LinearLayout) findViewById(R.id.container);
|
||||
container.setOnClickListener(new Button.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
finishActivity();
|
||||
}
|
||||
});
|
||||
|
||||
DisplayMetrics metrics = new DisplayMetrics();
|
||||
getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
||||
|
||||
sChildItemHeight = (int) (CHILD_ITEM_HEIGHT * metrics.density);
|
||||
sGroupItemHeight = (int) (GROUP_ITEM_HEIGHT * metrics.density);
|
||||
sPreferredHeight = (int) (0.67 * metrics.heightPixels);
|
||||
|
||||
// Query the database for remote tabs in AsyncTask
|
||||
(new QueryRemoteTabsTask()).execute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
startActivity(new Intent(this, TabsTray.class));
|
||||
overridePendingTransition(R.anim.grow_fade_in, 0);
|
||||
finishActivity();
|
||||
}
|
||||
|
||||
void finishActivity() {
|
||||
finish();
|
||||
overridePendingTransition(0, R.anim.shrink_fade_out);
|
||||
}
|
||||
|
||||
@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 <String, String> tab = mTabsList.get(groupPosition).get(childPosition);
|
||||
if (tab == null) {
|
||||
finishActivity();
|
||||
return true;
|
||||
}
|
||||
|
||||
String url = tab.get("url");
|
||||
JSONObject args = new JSONObject();
|
||||
try {
|
||||
args.put("url", url);
|
||||
args.put("engine", null);
|
||||
args.put("userEntered", false);
|
||||
} catch (Exception e) {
|
||||
Log.e(LOGTAG, "error building JSON arguments");
|
||||
}
|
||||
|
||||
Log.i(LOGTAG, "Sending message to Gecko: " + SystemClock.uptimeMillis() + " - Tab:Add");
|
||||
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Tab:Add", args.toString()));
|
||||
finishActivity();
|
||||
return true;
|
||||
}
|
||||
|
||||
// Tabs List Container holds the ExpandableListView
|
||||
public static class TabsListContainer extends LinearLayout {
|
||||
public TabsListContainer(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
SimpleExpandableListAdapter adapter = (SimpleExpandableListAdapter) mList.getExpandableListAdapter();
|
||||
if (adapter == null) {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
return;
|
||||
}
|
||||
|
||||
int groupCount = adapter.getGroupCount();
|
||||
int childrenHeight = groupCount * sGroupItemHeight;
|
||||
for (int i = 0; i < groupCount; i++)
|
||||
childrenHeight += adapter.getChildrenCount(i) * sChildItemHeight;
|
||||
|
||||
int restrictedHeightSpec = MeasureSpec.makeMeasureSpec(Math.min(childrenHeight, sPreferredHeight), MeasureSpec.EXACTLY);
|
||||
super.onMeasure(widthMeasureSpec, restrictedHeightSpec);
|
||||
}
|
||||
}
|
||||
|
||||
// AsyncTask to query the database
|
||||
private class QueryRemoteTabsTask extends GeckoAsyncTask<Void, Void, Void> {
|
||||
@Override
|
||||
protected Void doInBackground(Void... unused) {
|
||||
mClientsList = new ArrayList <HashMap <String, String>>();
|
||||
mTabsList = new ArrayList <ArrayList <HashMap <String, String>>>();
|
||||
|
||||
Cursor tabs = getContentResolver().query(BrowserContract.Tabs.CONTENT_URI,
|
||||
PROJECTION_COLUMNS,
|
||||
BrowserContract.Tabs.CLIENT_GUID + " IS NOT NULL",
|
||||
null,
|
||||
null);
|
||||
|
||||
if (tabs == null)
|
||||
return null;
|
||||
|
||||
String oldGuid = null;
|
||||
ArrayList <HashMap <String, String>> tabsForClient = null;
|
||||
HashMap <String, String> client;
|
||||
HashMap <String, String> tab;
|
||||
|
||||
try {
|
||||
while (tabs.moveToNext()) {
|
||||
String title = tabs.getString(0);
|
||||
String url = tabs.getString(1);
|
||||
String guid = tabs.getString(2);
|
||||
String name = tabs.getString(3);
|
||||
|
||||
if (oldGuid == null || !TextUtils.equals(oldGuid, guid)) {
|
||||
client = new HashMap <String, String>();
|
||||
client.put("name", name);
|
||||
mClientsList.add(client);
|
||||
|
||||
tabsForClient = new ArrayList <HashMap <String, String>>();
|
||||
mTabsList.add(tabsForClient);
|
||||
|
||||
oldGuid = new String(guid);
|
||||
}
|
||||
|
||||
tab = new HashMap<String, String>();
|
||||
tab.put("title", TextUtils.isEmpty(title) ? url : title);
|
||||
tab.put("url", url);
|
||||
tabsForClient.add(tab);
|
||||
}
|
||||
} finally {
|
||||
tabs.close();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Void unused) {
|
||||
if (mClientsList.size() == 0) {
|
||||
finishActivity();
|
||||
return;
|
||||
}
|
||||
|
||||
mList.setAdapter(new SimpleExpandableListAdapter(getApplicationContext(),
|
||||
mClientsList,
|
||||
R.layout.remote_tabs_group,
|
||||
CLIENT_KEY,
|
||||
CLIENT_RESOURCE,
|
||||
mTabsList,
|
||||
R.layout.remote_tabs_child,
|
||||
TAB_KEY,
|
||||
TAB_RESOURCE));
|
||||
|
||||
for (int i = 0; i < mClientsList.size(); i++) {
|
||||
mList.expandGroup(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -39,8 +39,14 @@ package org.mozilla.gecko;
|
|||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.mozilla.gecko.db.BrowserContract.Clients;
|
||||
import org.mozilla.gecko.db.BrowserContract;
|
||||
|
||||
import android.accounts.AccountManager;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Bundle;
|
||||
import android.os.Build;
|
||||
|
@ -66,6 +72,7 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener {
|
|||
private static int sAddTabHeight;
|
||||
private static ListView mList;
|
||||
private static TabsListContainer mListContainer;
|
||||
private static LinkTextView mRemoteTabs;
|
||||
private TabsAdapter mTabsAdapter;
|
||||
private boolean mWaitingForClose;
|
||||
|
||||
|
@ -84,14 +91,21 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener {
|
|||
mList = (ListView) findViewById(R.id.list);
|
||||
mListContainer = (TabsListContainer) findViewById(R.id.list_container);
|
||||
|
||||
LinearLayout addTab = (LinearLayout) findViewById(R.id.add_tab);
|
||||
ImageButton addTab = (ImageButton) findViewById(R.id.add_tab);
|
||||
addTab.setOnClickListener(new Button.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
GeckoApp.mAppContext.addTab();
|
||||
finishActivity();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
mRemoteTabs = (LinkTextView) findViewById(R.id.remote_tabs);
|
||||
mRemoteTabs.setOnClickListener(new Button.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
showRemoteTabs();
|
||||
}
|
||||
});
|
||||
|
||||
LinearLayout container = (LinearLayout) findViewById(R.id.container);
|
||||
container.setOnClickListener(new Button.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
|
@ -103,7 +117,7 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener {
|
|||
getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
||||
|
||||
sListItemHeight = (int) (TABS_LIST_ITEM_HEIGHT * metrics.density);
|
||||
sAddTabHeight = (int) (TABS_ADD_TAB_HEIGHT * metrics.density);
|
||||
sAddTabHeight = (int) (TABS_ADD_TAB_HEIGHT * metrics.density);
|
||||
sPreferredHeight = (int) (0.67 * metrics.heightPixels);
|
||||
sMaxHeight = (int) (sPreferredHeight + (0.33 * sListItemHeight));
|
||||
|
||||
|
@ -111,6 +125,11 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener {
|
|||
tabs.registerOnTabsChangedListener(this);
|
||||
tabs.refreshThumbnails();
|
||||
onTabChanged(null, null);
|
||||
|
||||
// If sync is set up, query the database for remote clients
|
||||
// Cleanup after Bug: 734211 is fixed
|
||||
if (AccountManager.get(getApplicationContext()).getAccountsByType("org.mozilla.firefox_sync").length > 0)
|
||||
(new QueryForRemoteClientsTask()).execute();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -118,7 +137,7 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener {
|
|||
super.onDestroy();
|
||||
Tabs.getInstance().unregisterOnTabsChangedListener(this);
|
||||
}
|
||||
|
||||
|
||||
public void onTabChanged(Tab tab, Tabs.TabEvents msg) {
|
||||
if (Tabs.getInstance().getCount() == 1)
|
||||
finishActivity();
|
||||
|
@ -135,7 +154,7 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener {
|
|||
mList.setSelection(selected);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int position = mTabsAdapter.getPositionForTab(tab);
|
||||
if (position == -1)
|
||||
return;
|
||||
|
@ -157,6 +176,12 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener {
|
|||
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Tab:Screenshot:Cancel",""));
|
||||
}
|
||||
|
||||
void showRemoteTabs() {
|
||||
startActivity(new Intent(this, RemoteTabs.class));
|
||||
overridePendingTransition(R.anim.grow_fade_in, 0);
|
||||
finishActivity();
|
||||
}
|
||||
|
||||
// Tabs List Container holds the ListView and the New Tab button
|
||||
public static class TabsListContainer extends LinearLayout {
|
||||
public TabsListContainer(Context context, AttributeSet attrs) {
|
||||
|
@ -186,7 +211,36 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener {
|
|||
}
|
||||
}
|
||||
|
||||
// Adapter to bind tabs into a list
|
||||
// AsyncTask to see if there is any remote tabs in the database
|
||||
private class QueryForRemoteClientsTask extends GeckoAsyncTask<Void, Void, Boolean> {
|
||||
@Override
|
||||
protected Boolean doInBackground(Void... unused) {
|
||||
Cursor clients = getContentResolver().query(BrowserContract.Clients.CONTENT_URI,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null);
|
||||
|
||||
if (clients == null)
|
||||
return false;
|
||||
|
||||
try {
|
||||
return clients.moveToNext();
|
||||
} finally {
|
||||
clients.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Boolean clientsExist) {
|
||||
if (clientsExist.booleanValue())
|
||||
mRemoteTabs.setVisibility(View.VISIBLE);
|
||||
else
|
||||
mRemoteTabs.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
// Adapter to bind tabs into a list
|
||||
private class TabsAdapter extends BaseAdapter {
|
||||
public TabsAdapter(Context context, ArrayList<Tab> tabs) {
|
||||
mContext = context;
|
||||
|
@ -199,7 +253,7 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener {
|
|||
for (int i = 0; i < tabs.size(); i++) {
|
||||
mTabs.add(tabs.get(i));
|
||||
}
|
||||
|
||||
|
||||
mOnInfoClickListener = new View.OnClickListener() {
|
||||
public void onClick(View v) {
|
||||
Tabs.getInstance().selectTab(Integer.parseInt((String) v.getTag()));
|
||||
|
@ -225,7 +279,7 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener {
|
|||
public int getCount() {
|
||||
return mTabs.size();
|
||||
}
|
||||
|
||||
|
||||
public Tab getItem(int position) {
|
||||
return mTabs.get(position);
|
||||
}
|
||||
|
@ -274,7 +328,7 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener {
|
|||
info.setOnClickListener(mOnInfoClickListener);
|
||||
|
||||
assignValues(convertView, tab);
|
||||
|
||||
|
||||
ImageButton close = (ImageButton) convertView.findViewById(R.id.close);
|
||||
if (mTabs.size() > 1) {
|
||||
close.setTag(String.valueOf(tab.getId()));
|
||||
|
@ -293,7 +347,7 @@ public class TabsTray extends Activity implements Tabs.OnTabsChangedListener {
|
|||
@Override
|
||||
public void notifyDataSetInvalidated() {
|
||||
}
|
||||
|
||||
|
||||
private Context mContext;
|
||||
private ArrayList<Tab> mTabs;
|
||||
private LayoutInflater mInflater;
|
||||
|
|
|
@ -51,7 +51,7 @@ public class TabsProvider extends ContentProvider {
|
|||
static final int CLIENTS = 602;
|
||||
static final int CLIENTS_ID = 603;
|
||||
|
||||
static final String DEFAULT_TABS_SORT_ORDER = Tabs.POSITION + " ASC";
|
||||
static final String DEFAULT_TABS_SORT_ORDER = Clients.LAST_MODIFIED + " DESC, " + Tabs.LAST_USED + " DESC";
|
||||
static final String DEFAULT_CLIENTS_SORT_ORDER = Clients.LAST_MODIFIED + " DESC";
|
||||
|
||||
static final String INDEX_TABS_GUID = "tabs_guid_index";
|
||||
|
@ -73,13 +73,15 @@ public class TabsProvider extends ContentProvider {
|
|||
|
||||
map = new HashMap<String, String>();
|
||||
map.put(Tabs._ID, Tabs._ID);
|
||||
map.put(Tabs.CLIENT_GUID, Tabs.CLIENT_GUID);
|
||||
map.put(Tabs.TITLE, Tabs.TITLE);
|
||||
map.put(Tabs.URL, Tabs.URL);
|
||||
map.put(Tabs.HISTORY, Tabs.HISTORY);
|
||||
map.put(Tabs.FAVICON, Tabs.FAVICON);
|
||||
map.put(Tabs.LAST_USED, Tabs.LAST_USED);
|
||||
map.put(Tabs.POSITION, Tabs.POSITION);
|
||||
map.put(Clients.GUID, Clients.GUID);
|
||||
map.put(Clients.NAME, Clients.NAME);
|
||||
map.put(Clients.LAST_MODIFIED, Clients.LAST_MODIFIED);
|
||||
TABS_PROJECTION_MAP = Collections.unmodifiableMap(map);
|
||||
|
||||
map = new HashMap<String, String>();
|
||||
|
@ -526,7 +528,7 @@ public class TabsProvider extends ContentProvider {
|
|||
}
|
||||
|
||||
qb.setProjectionMap(TABS_PROJECTION_MAP);
|
||||
qb.setTables(TABLE_TABS);
|
||||
qb.setTables(TABLE_TABS + " LEFT OUTER JOIN " + TABLE_CLIENTS + " ON (" + TABLE_TABS + "." + Tabs.CLIENT_GUID + " = " + TABLE_CLIENTS + "." + Clients.GUID + ")");
|
||||
break;
|
||||
|
||||
case CLIENTS_ID:
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
|
||||
<!ENTITY awesomebar_default_text "Enter Search or Address">
|
||||
|
||||
<!ENTITY remote_tabs "Synced Tabs">
|
||||
|
||||
<!ENTITY bookmark "Bookmark">
|
||||
<!ENTITY bookmark_added "Bookmark added">
|
||||
<!ENTITY bookmark_removed "Bookmark removed">
|
||||
|
|
До Ширина: | Высота: | Размер: 18 KiB После Ширина: | Высота: | Размер: 18 KiB |
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:src="@drawable/background"
|
||||
android:tileMode="repeat"/>
|
|
@ -60,16 +60,15 @@
|
|||
android:isScrollContainer="false"
|
||||
android:gravity="center"/>
|
||||
|
||||
<view class="org.mozilla.gecko.AboutHomeContent$LinkTextView"
|
||||
android:id="@+id/all_top_sites_text"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="30dip"
|
||||
android:layout_below="@id/top_sites_grid"
|
||||
android:layout_marginTop="7dip"
|
||||
android:textColor="#22629e"
|
||||
android:textSize="12sp"
|
||||
android:gravity="top|center_horizontal"
|
||||
android:text="@string/abouthome_top_sites_browse"/>
|
||||
<org.mozilla.gecko.LinkTextView android:id="@+id/all_top_sites_text"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="30dip"
|
||||
android:layout_below="@id/top_sites_grid"
|
||||
android:layout_marginTop="7dip"
|
||||
android:textColor="#22629e"
|
||||
android:textSize="12sp"
|
||||
android:gravity="top|center_horizontal"
|
||||
android:text="@string/abouthome_top_sites_browse"/>
|
||||
|
||||
<RelativeLayout android:id="@+id/sync_box_container"
|
||||
android:layout_width="fill_parent"
|
||||
|
@ -139,16 +138,15 @@
|
|||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<view class="org.mozilla.gecko.AboutHomeContent$LinkTextView"
|
||||
android:id="@+id/last_tabs_open_all"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="47dip"
|
||||
android:background="@drawable/abouthome_separator"
|
||||
android:textColor="#22629e"
|
||||
android:textSize="12sp"
|
||||
android:gravity="center"
|
||||
android:visibility="gone"
|
||||
android:text="@string/abouthome_last_tabs_open"/>
|
||||
<org.mozilla.gecko.LinkTextView android:id="@+id/last_tabs_open_all"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="47dip"
|
||||
android:background="@drawable/abouthome_separator"
|
||||
android:textColor="#22629e"
|
||||
android:textSize="12sp"
|
||||
android:gravity="center"
|
||||
android:visibility="gone"
|
||||
android:text="@string/abouthome_last_tabs_open"/>
|
||||
|
||||
<TextView android:id="@+id/recommended_addons_title"
|
||||
android:layout_width="fill_parent"
|
||||
|
@ -169,16 +167,15 @@
|
|||
android:visibility="gone"
|
||||
android:isScrollContainer="false"/>
|
||||
|
||||
<view class="org.mozilla.gecko.AboutHomeContent$LinkTextView"
|
||||
android:id="@+id/all_addons_text"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="47dip"
|
||||
android:background="@drawable/abouthome_separator"
|
||||
android:textColor="#22629e"
|
||||
android:textSize="12sp"
|
||||
android:gravity="center"
|
||||
android:visibility="gone"
|
||||
android:text="@string/abouthome_addons_browse"/>
|
||||
<org.mozilla.gecko.LinkTextView android:id="@+id/all_addons_text"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="47dip"
|
||||
android:background="@drawable/abouthome_separator"
|
||||
android:textColor="#22629e"
|
||||
android:textSize="12sp"
|
||||
android:gravity="center"
|
||||
android:visibility="gone"
|
||||
android:text="@string/abouthome_addons_browse"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/container"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<view class="org.mozilla.gecko.RemoteTabs$TabsListContainer"
|
||||
android:id="@+id/list_container"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:background="@drawable/tabs_tray_bg_repeat">
|
||||
|
||||
<ExpandableListView android:id="@+id/list"
|
||||
style="@style/TabsList"
|
||||
android:childDivider="@drawable/tabs_tray_list_divider"
|
||||
android:dividerHeight="2dip"
|
||||
android:groupIndicator="@android:color/transparent"/>
|
||||
|
||||
</view>
|
||||
|
||||
</LinearLayout>
|
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/tab"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="50dip"
|
||||
android:paddingLeft="10dip"
|
||||
android:paddingRight="10dip"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:textColor="#E5F2FF"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="middle"
|
||||
android:shadowColor="#000000"
|
||||
android:shadowRadius="1"
|
||||
android:shadowDx="0"
|
||||
android:shadowDy="1"
|
||||
android:background="@drawable/tabs_tray_list_selector"
|
||||
android:gravity="center_vertical"/>
|
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/client"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="30dip"
|
||||
android:paddingLeft="10dip"
|
||||
android:paddingRight="10dip"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:textColor="#E5F2FF"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="middle"
|
||||
android:shadowColor="#000000"
|
||||
android:shadowRadius="1"
|
||||
android:shadowDx="0"
|
||||
android:shadowDy="1"
|
||||
android:background="@drawable/remote_tabs_group_bg_repeat"
|
||||
android:gravity="center_vertical"/>
|
|
@ -20,19 +20,39 @@
|
|||
android:layout_height="2dp"
|
||||
android:background="@drawable/tabs_tray_list_divider"/>
|
||||
|
||||
<LinearLayout android:id="@+id/add_tab"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="50dip"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center|left"
|
||||
android:background="@drawable/tabs_tray_list_selector">
|
||||
<RelativeLayout android:layout_width="fill_parent"
|
||||
android:layout_height="50dip"
|
||||
android:background="@drawable/tabs_tray_bg_repeat">
|
||||
|
||||
<ImageView android:layout_width="20dip"
|
||||
android:layout_height="20dip"
|
||||
android:layout_marginLeft="20dip"
|
||||
android:src="@drawable/tab_new"/>
|
||||
<ImageButton android:id="@+id/add_tab"
|
||||
android:layout_width="60dip"
|
||||
android:layout_height="50dip"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:paddingTop="15dip"
|
||||
android:paddingBottom="15dip"
|
||||
android:paddingLeft="20dip"
|
||||
android:paddingRight="20dip"
|
||||
android:src="@drawable/tab_new"
|
||||
android:background="@drawable/tabs_tray_list_selector"/>
|
||||
|
||||
</LinearLayout>
|
||||
<org.mozilla.gecko.LinkTextView android:id="@+id/remote_tabs"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="50dip"
|
||||
android:layout_alignParentRight="true"
|
||||
android:gravity="center_vertical"
|
||||
android:paddingRight="20dip"
|
||||
android:text="@string/remote_tabs"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:textColor="#E5F2FF"
|
||||
android:shadowColor="#000000"
|
||||
android:shadowRadius="1"
|
||||
android:shadowDx="0"
|
||||
android:shadowDy="1"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="middle"
|
||||
android:visibility="gone"/>
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</view>
|
||||
|
||||
|
|
|
@ -33,6 +33,8 @@
|
|||
<string name="choose_file">&choose_file;</string>
|
||||
|
||||
<string name="awesomebar_default_text">&awesomebar_default_text;</string>
|
||||
|
||||
<string name="remote_tabs">&remote_tabs;</string>
|
||||
|
||||
<string name="quit">&quit;</string>
|
||||
<string name="bookmark">&bookmark;</string>
|
||||
|
|
Загрузка…
Ссылка в новой задаче