summaryrefslogtreecommitdiffstats
path: root/src/com/android
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android')
-rw-r--r--src/com/android/browser/BaseUi.java84
-rw-r--r--src/com/android/browser/BrowserSettings.java9
-rw-r--r--src/com/android/browser/Controller.java10
-rw-r--r--src/com/android/browser/IntentHandler.java1
-rw-r--r--src/com/android/browser/PageDialogsHandler.java2
-rw-r--r--src/com/android/browser/PieControlPhone.java48
-rw-r--r--src/com/android/browser/PieControlXLarge.java7
-rw-r--r--src/com/android/browser/PreloadController.java4
-rw-r--r--src/com/android/browser/SnapshotByteArrayOutputStream.java58
-rw-r--r--src/com/android/browser/Tab.java65
-rw-r--r--src/com/android/browser/WebViewController.java2
-rw-r--r--src/com/android/browser/XLargeUi.java9
-rw-r--r--src/com/android/browser/preferences/GeneralPreferencesFragment.java3
-rw-r--r--src/com/android/browser/provider/BrowserProvider2.java56
-rw-r--r--src/com/android/browser/view/PieMenu.java28
15 files changed, 265 insertions, 121 deletions
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index bce3257ed..3128934b4 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -17,6 +17,7 @@
package com.android.browser;
import android.app.Activity;
+import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -33,6 +34,7 @@ import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
+import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@@ -49,7 +51,7 @@ import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.Toast;
-import com.android.browser.Tab.LockIcon;
+import com.android.browser.Tab.SecurityState;
import com.android.internal.view.menu.MenuBuilder;
import java.util.List;
@@ -81,14 +83,14 @@ public abstract class BaseUi implements UI {
protected Tab mActiveTab;
private InputMethodManager mInputManager;
- private Drawable mSecLockIcon;
- private Drawable mMixLockIcon;
+ private Drawable mLockIconSecure;
+ private Drawable mLockIconMixed;
protected Drawable mGenericFavicon;
protected FrameLayout mContentView;
protected FrameLayout mCustomViewContainer;
- private View mCustomView;
+ private CustomViewHolder mCustomView;
private WebChromeClient.CustomViewCallback mCustomViewCallback;
private int mOriginalOrientation;
@@ -115,8 +117,8 @@ public abstract class BaseUi implements UI {
Resources res = mActivity.getResources();
mInputManager = (InputMethodManager)
browser.getSystemService(Activity.INPUT_METHOD_SERVICE);
- mSecLockIcon = res.getDrawable(R.drawable.ic_secure_holo_dark);
- mMixLockIcon = res.getDrawable(R.drawable.ic_secure_partial_holo_dark);
+ mLockIconSecure = res.getDrawable(R.drawable.ic_secure_holo_dark);
+ mLockIconMixed = res.getDrawable(R.drawable.ic_secure_partial_holo_dark);
FrameLayout frameLayout = (FrameLayout) mActivity.getWindow()
.getDecorView().findViewById(android.R.id.content);
@@ -124,10 +126,10 @@ public abstract class BaseUi implements UI {
.inflate(R.layout.custom_screen, frameLayout);
mContentView = (FrameLayout) frameLayout.findViewById(
R.id.main_content);
+ mCustomViewContainer = (FrameLayout) frameLayout.findViewById(
+ R.id.fullscreen_custom_content);
mErrorConsoleContainer = (LinearLayout) frameLayout
.findViewById(R.id.error_console);
- mCustomViewContainer = (FrameLayout) frameLayout
- .findViewById(R.id.fullscreen_custom_content);
setFullscreen(BrowserSettings.getInstance().useFullscreen());
mGenericFavicon = res.getDrawable(
R.drawable.app_web_browser_sm);
@@ -201,6 +203,7 @@ public abstract class BaseUi implements UI {
updateNavigationState(tab);
mTitleBar.onTabDataChanged(tab);
mNavigationBar.onTabDataChanged(tab);
+ onProgressChanged(tab);
}
@Override
@@ -517,18 +520,23 @@ public abstract class BaseUi implements UI {
}
mOriginalOrientation = mActivity.getRequestedOrientation();
+ WindowManager wm = (WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE);
+ WindowManager.LayoutParams params = new WindowManager.LayoutParams(
+ WindowManager.LayoutParams.TYPE_APPLICATION,
+ 0);
+ params.x = 0;
+ params.y = 0;
+ params.width = LayoutParams.MATCH_PARENT;
+ params.height = LayoutParams.MATCH_PARENT;
+ params.systemUiVisibility = View.STATUS_BAR_HIDDEN;
+ mCustomView = new CustomViewHolder(mActivity);
+ view.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
+ LayoutParams.MATCH_PARENT));
+ mCustomView.addView(view);
+ wm.addView(mCustomView, params);
- // Add the custom view to its container.
- mCustomViewContainer.addView(view, COVER_SCREEN_GRAVITY_CENTER);
- mCustomView = view;
mCustomViewCallback = callback;
- // Hide the content view.
- mContentView.setVisibility(View.GONE);
- // Finally show the custom view container.
- setStatusBarVisibility(false);
mActivity.setRequestedOrientation(requestedOrientation);
- mCustomViewContainer.setVisibility(View.VISIBLE);
- mCustomViewContainer.bringToFront();
}
@Override
@@ -536,17 +544,13 @@ public abstract class BaseUi implements UI {
if (mCustomView == null)
return;
- // Hide the custom view.
- mCustomView.setVisibility(View.GONE);
- // Remove the custom view from its container.
- mCustomViewContainer.removeView(mCustomView);
+ WindowManager wm = (WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE);
+ wm.removeView(mCustomView);
+
mCustomView = null;
- mCustomViewContainer.setVisibility(View.GONE);
mCustomViewCallback.onCustomViewHidden();
// Show the content view.
mActivity.setRequestedOrientation(mOriginalOrientation);
- setStatusBarVisibility(true);
- mContentView.setVisibility(View.VISIBLE);
}
@Override
@@ -590,19 +594,19 @@ public abstract class BaseUi implements UI {
*/
protected void updateLockIconToLatest(Tab t) {
if (t != null && t.inForeground()) {
- updateLockIconImage(t.getLockIconType());
+ updateLockIconImage(t.getSecurityState());
}
}
/**
* Updates the lock-icon image in the title-bar.
*/
- private void updateLockIconImage(LockIcon lockIconType) {
+ private void updateLockIconImage(SecurityState securityState) {
Drawable d = null;
- if (lockIconType == LockIcon.LOCK_ICON_SECURE) {
- d = mSecLockIcon;
- } else if (lockIconType == LockIcon.LOCK_ICON_MIXED) {
- d = mMixLockIcon;
+ if (securityState == SecurityState.SECURITY_STATE_SECURE) {
+ d = mLockIconSecure;
+ } else if (securityState == SecurityState.SECURITY_STATE_MIXED) {
+ d = mLockIconMixed;
}
mNavigationBar.setLock(d);
}
@@ -709,12 +713,6 @@ public abstract class BaseUi implements UI {
}
}
- private void setStatusBarVisibility(boolean visible) {
- WindowManager.LayoutParams params = mActivity.getWindow().getAttributes();
- params.systemUiVisibility = visible ? View.STATUS_BAR_VISIBLE : View.STATUS_BAR_HIDDEN;
- mActivity.getWindow().setAttributes(params);
- }
-
// -------------------------------------------------------------------------
// Helper function for WebChromeClient
// -------------------------------------------------------------------------
@@ -828,4 +826,18 @@ public abstract class BaseUi implements UI {
mUiController.hideCustomView();
}
+ // custom FrameLayout to forward key events
+ static class CustomViewHolder extends FrameLayout {
+ Activity mActivity;
+
+ public CustomViewHolder(Activity act) {
+ super(act);
+ mActivity = act;
+ }
+
+ public boolean dispatchKeyEvent(KeyEvent event) {
+ return mActivity.dispatchKeyEvent(event);
+ }
+ }
+
}
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index cfb8dd435..145178b2f 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -20,6 +20,7 @@ import android.app.ActivityManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Build;
import android.os.Message;
@@ -428,7 +429,13 @@ public class BrowserSettings implements OnSharedPreferenceChangeListener,
}
public void setDebugEnabled(boolean value) {
- mPrefs.edit().putBoolean(PREF_DEBUG_MENU, value).apply();
+ Editor edit = mPrefs.edit();
+ edit.putBoolean(PREF_DEBUG_MENU, value);
+ if (!value) {
+ // Reset to "safe" value
+ edit.putBoolean(PREF_ENABLE_HARDWARE_ACCEL_SKIA, false);
+ }
+ edit.apply();
}
public void clearCache() {
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 78d007700..282d4f2ef 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -336,8 +336,11 @@ public class Controller
// TabControl.restoreState() will create a new tab even if
// restoring the state fails.
setActiveTab(mTabControl.getCurrentTab());
- // Handle the intent
- mIntentHandler.onNewIntent(intent);
+ // Handle the intent if needed. If icicle != null, we are restoring
+ // and the intent will be stale - ignore it.
+ if (icicle == null) {
+ mIntentHandler.onNewIntent(intent);
+ }
}
// Read JavaScript flags if it exists.
String jsFlags = getSettings().getJsEngineFlags();
@@ -880,7 +883,7 @@ public class Controller
}
@Override
- public void onUpdatedLockIcon(Tab tab) {
+ public void onUpdatedSecurityState(Tab tab) {
mUi.onTabDataChanged(tab);
}
@@ -2358,6 +2361,7 @@ public class Controller
if (tab != null) {
dismissSubWindow(tab);
tab.loadUrl(url, headers);
+ mUi.onProgressChanged(tab);
}
}
diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java
index cc6b57c91..c76197d4c 100644
--- a/src/com/android/browser/IntentHandler.java
+++ b/src/com/android/browser/IntentHandler.java
@@ -65,7 +65,6 @@ public class IntentHandler {
}
void onNewIntent(Intent intent) {
- mActivity.setIntent(null);
Tab current = mTabControl.getCurrentTab();
// When a tab is closed on exit, the current tab index is set to -1.
// Reset before proceed as Browser requires the current tab to be set.
diff --git a/src/com/android/browser/PageDialogsHandler.java b/src/com/android/browser/PageDialogsHandler.java
index 13e9ceb13..0c249587a 100644
--- a/src/com/android/browser/PageDialogsHandler.java
+++ b/src/com/android/browser/PageDialogsHandler.java
@@ -98,7 +98,7 @@ public class PageDialogsHandler {
mHttpAuthenticationDialog.setCancelListener(new HttpAuthenticationDialog.CancelListener() {
public void onCancel() {
handler.cancel();
- mController.onUpdatedLockIcon(tab);
+ mController.onUpdatedSecurityState(tab);
mHttpAuthenticationDialog = null;
}
});
diff --git a/src/com/android/browser/PieControlPhone.java b/src/com/android/browser/PieControlPhone.java
index 0b62cef9e..f12c49ad7 100644
--- a/src/com/android/browser/PieControlPhone.java
+++ b/src/com/android/browser/PieControlPhone.java
@@ -17,13 +17,12 @@
package com.android.browser;
import android.app.Activity;
+import android.view.Menu;
+import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
-import android.view.ViewGroup.LayoutParams;
-import android.webkit.WebView;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-import android.widget.TextView;
+import android.widget.PopupMenu;
+import android.widget.PopupMenu.OnMenuItemClickListener;
import com.android.browser.view.PieItem;
import com.android.browser.view.PieMenu.PieView.OnLayoutListener;
@@ -34,13 +33,15 @@ import java.util.List;
/**
* controller for Quick Controls pie menu
*/
-public class PieControlPhone extends PieControlBase implements OnClickListener {
+public class PieControlPhone extends PieControlBase implements OnClickListener,
+ OnMenuItemClickListener {
private PhoneUi mUi;
- private PieItem mBack;
private PieItem mUrl;
private PieItem mShowTabs;
+ private PieItem mOptions;
private TabAdapter mTabAdapter;
+ private PopupMenu mPopup;
public PieControlPhone(Activity activity, UiController controller, PhoneUi ui) {
super(activity, controller);
@@ -48,7 +49,6 @@ public class PieControlPhone extends PieControlBase implements OnClickListener {
}
protected void populateMenu() {
- mBack = makeItem(R.drawable.ic_back_holo_dark, 1);
mUrl = makeItem(R.drawable.ic_web_holo_dark, 1);
View tabs = makeTabsView();
mShowTabs = new PieItem(tabs, 1);
@@ -63,13 +63,31 @@ public class PieControlPhone extends PieControlBase implements OnClickListener {
stack.setOnCurrentListener(mTabAdapter);
stack.setAdapter(mTabAdapter);
mShowTabs.setPieView(stack);
+ mOptions = makeItem(com.android.internal.R.drawable.ic_menu_moreoverflow_normal_holo_dark,
+ 1);
+
// level 1
- mPie.addItem(mBack);
- mPie.addItem(mUrl);
mPie.addItem(mShowTabs);
- setClickListener(this, mBack, mUrl, mShowTabs);
+ mPie.addItem(mUrl);
+ mPie.addItem(mOptions);
+ setClickListener(this, mUrl, mShowTabs, mOptions);
+ mPopup = new PopupMenu(mActivity, mUi.getTitleBar());
+ Menu menu = mPopup.getMenu();
+ mPopup.getMenuInflater().inflate(R.menu.browser, menu);
+ mPopup.setOnMenuItemClickListener(this);
+ }
+
+ protected void showMenu() {
+ mUiController.updateMenuState(mUiController.getCurrentTab(), mPopup.getMenu());
+ mPopup.show();
}
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ return mUiController.onOptionsItemSelected(item);
+ }
+
+
private void buildTabs() {
final List<Tab> tabs = mUiController.getTabs();
mUi.getActiveTab().capture();
@@ -81,15 +99,13 @@ public class PieControlPhone extends PieControlBase implements OnClickListener {
@Override
public void onClick(View v) {
- Tab tab = mUiController.getTabControl().getCurrentTab();
- if (mBack.getView() == v) {
- tab.goBack();
- } else if (mUrl.getView() == v) {
+ if (mUrl.getView() == v) {
mUi.editUrl(false);
} else if (mShowTabs.getView() == v) {
mUi.showNavScreen();
+ } else if (mOptions.getView() == v) {
+ showMenu();
}
}
-
}
diff --git a/src/com/android/browser/PieControlXLarge.java b/src/com/android/browser/PieControlXLarge.java
index 95f586e41..0072aeadc 100644
--- a/src/com/android/browser/PieControlXLarge.java
+++ b/src/com/android/browser/PieControlXLarge.java
@@ -27,6 +27,7 @@ import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.webkit.WebView;
import android.widget.BaseAdapter;
+import android.widget.FrameLayout;
import android.widget.TextView;
import com.android.browser.view.PieItem;
@@ -61,6 +62,12 @@ public class PieControlXLarge extends PieControlBase implements OnClickListener
mUi = ui;
}
+ @Override
+ protected void attachToContainer(FrameLayout container) {
+ super.attachToContainer(container);
+ mPie.setUseBackground(true);
+ }
+
protected void populateMenu() {
mBack = makeItem(R.drawable.ic_back_holo_dark, 1);
mUrl = makeItem(R.drawable.ic_web_holo_dark, 1);
diff --git a/src/com/android/browser/PreloadController.java b/src/com/android/browser/PreloadController.java
index dec22ff65..5de5be0af 100644
--- a/src/com/android/browser/PreloadController.java
+++ b/src/com/android/browser/PreloadController.java
@@ -209,8 +209,8 @@ public class PreloadController implements WebViewController {
}
@Override
- public void onUpdatedLockIcon(Tab tab) {
- if (LOGD_ENABLED) Log.d(LOGTAG, "onUpdatedLockIcon()");
+ public void onUpdatedSecurityState(Tab tab) {
+ if (LOGD_ENABLED) Log.d(LOGTAG, "onUpdatedSecurityState()");
}
@Override
diff --git a/src/com/android/browser/SnapshotByteArrayOutputStream.java b/src/com/android/browser/SnapshotByteArrayOutputStream.java
new file mode 100644
index 000000000..bfd1a76a9
--- /dev/null
+++ b/src/com/android/browser/SnapshotByteArrayOutputStream.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.browser;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class SnapshotByteArrayOutputStream extends OutputStream {
+
+ // Maximum size, just below CursorWindow's 2mb row limit
+ private static final int MAX_SIZE = 2000000;
+ private ByteArrayOutputStream mStream;
+
+ public SnapshotByteArrayOutputStream() {
+ mStream = new ByteArrayOutputStream(MAX_SIZE);
+ }
+
+ @Override
+ public synchronized void write(int oneByte) throws IOException {
+ checkError(1);
+ mStream.write(oneByte);
+ }
+
+ @Override
+ public void write(byte[] buffer, int offset, int count) throws IOException {
+ checkError(count);
+ mStream.write(buffer, offset, count);
+ }
+
+ private void checkError(int expandBy) throws IOException {
+ if ((size() + expandBy) > MAX_SIZE) {
+ throw new IOException("Exceeded max size!");
+ }
+ }
+
+ public int size() {
+ return mStream.size();
+ }
+
+ public byte[] toByteArray() {
+ return mStream.toByteArray();
+ }
+
+}
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 96920a49f..936aca9b4 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -103,6 +103,7 @@ class Tab implements PictureListener {
private static final int MSG_CAPTURE = 42;
private static final int CAPTURE_DELAY = 100;
+ private static final int INITIAL_PROGRESS = 5;
private static Bitmap sDefaultFavicon;
@@ -112,10 +113,17 @@ class Tab implements PictureListener {
sAlphaPaint.setColor(Color.TRANSPARENT);
}
- public enum LockIcon {
- LOCK_ICON_UNSECURE,
- LOCK_ICON_SECURE,
- LOCK_ICON_MIXED,
+ public enum SecurityState {
+ // The page does not use SSL.
+ SECURITY_STATE_NOT_SECURE,
+ // The page uses SSL, the certificate is good and all elements are secure.
+ SECURITY_STATE_SECURE,
+ // The page uses SSL and the certificate is good, but some elements are insecure.
+ SECURITY_STATE_MIXED,
+ // TODO: Add SECURITY_STATE_BAD_CERTIFICATE
+ // See http://b/5403366
+ // The page uses SSL but there is a problem with the certificate.
+ //SECURITY_STATE_BAD_CERTIFICATE,
}
Context mContext;
@@ -198,7 +206,7 @@ class Tab implements PictureListener {
String mUrl;
String mOriginalUrl;
String mTitle;
- LockIcon mLockIcon;
+ SecurityState mSecurityState;
Bitmap mFavicon;
boolean mIsBookmarkedSite = false;
boolean mIncognito = false;
@@ -213,7 +221,7 @@ class Tab implements PictureListener {
mTitle = c.getString(R.string.new_tab);
}
mFavicon = null;
- mLockIcon = LockIcon.LOCK_ICON_UNSECURE;
+ mSecurityState = SecurityState.SECURITY_STATE_NOT_SECURE;
}
PageState(Context c, boolean incognito, String url, Bitmap favicon) {
@@ -221,9 +229,9 @@ class Tab implements PictureListener {
mOriginalUrl = mUrl = url;
mTitle = null;
if (URLUtil.isHttpsUrl(url)) {
- mLockIcon = LockIcon.LOCK_ICON_SECURE;
+ mSecurityState = SecurityState.SECURITY_STATE_SECURE;
} else {
- mLockIcon = LockIcon.LOCK_ICON_UNSECURE;
+ mSecurityState = SecurityState.SECURITY_STATE_NOT_SECURE;
}
mFavicon = favicon;
}
@@ -556,7 +564,7 @@ class Tab implements PictureListener {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
mInPageLoad = true;
- mPageLoadProgress = 0;
+ mPageLoadProgress = INITIAL_PROGRESS;
mCurrentState = new PageState(mContext,
view.isPrivateBrowsingEnabled(), url, favicon);
mLoadStartTime = SystemClock.uptimeMillis();
@@ -640,21 +648,22 @@ class Tab implements PictureListener {
}
/**
- * Updates the lock icon. This method is called when we discover another
- * resource to be loaded for this page (for example, javascript). While
- * we update the icon type, we do not update the lock icon itself until
- * we are done loading, it is slightly more secure this way.
+ * Updates the security state. This method is called when we discover
+ * another resource to be loaded for this page (for example,
+ * javascript). While we update the security state, we do not update
+ * the lock icon until we are done loading, as it is slightly more
+ * secure this way.
*/
@Override
public void onLoadResource(WebView view, String url) {
if (url != null && url.length() > 0) {
// It is only if the page claims to be secure that we may have
- // to update the lock:
- if (mCurrentState.mLockIcon == LockIcon.LOCK_ICON_SECURE) {
- // If NOT a 'safe' url, change the lock to mixed content!
+ // to update the security state:
+ if (mCurrentState.mSecurityState == SecurityState.SECURITY_STATE_SECURE) {
+ // If NOT a 'safe' url, change the state to mixed content!
if (!(URLUtil.isHttpsUrl(url) || URLUtil.isDataUrl(url)
|| URLUtil.isAboutUrl(url))) {
- mCurrentState.mLockIcon = LockIcon.LOCK_ICON_MIXED;
+ mCurrentState.mSecurityState = SecurityState.SECURITY_STATE_MIXED;
}
}
}
@@ -755,7 +764,7 @@ class Tab implements PictureListener {
final SslErrorHandler handler, final SslError error) {
if (!mInForeground) {
handler.cancel();
- setLockIconType(LockIcon.LOCK_ICON_UNSECURE);
+ setSecurityState(SecurityState.SECURITY_STATE_NOT_SECURE);
return;
}
if (mSettings.showSecurityWarnings()) {
@@ -793,7 +802,7 @@ class Tab implements PictureListener {
@Override
public void onCancel(DialogInterface dialog) {
handler.cancel();
- setLockIconType(LockIcon.LOCK_ICON_UNSECURE);
+ setSecurityState(SecurityState.SECURITY_STATE_NOT_SECURE);
mWebViewController.onUserCanceledSsl(Tab.this);
}
})
@@ -900,7 +909,7 @@ class Tab implements PictureListener {
if (!URLUtil.isHttpsUrl(mCurrentState.mUrl)) {
// In case we stop when loading an HTTPS page from an HTTP page
// but before a provisional load occurred
- mCurrentState.mLockIcon = LockIcon.LOCK_ICON_UNSECURE;
+ mCurrentState.mSecurityState = SecurityState.SECURITY_STATE_NOT_SECURE;
}
mCurrentState.mIncognito = view.isPrivateBrowsingEnabled();
}
@@ -1881,16 +1890,16 @@ class Tab implements PictureListener {
return mErrorConsole;
}
- private void setLockIconType(LockIcon icon) {
- mCurrentState.mLockIcon = icon;
- mWebViewController.onUpdatedLockIcon(this);
+ private void setSecurityState(SecurityState securityState) {
+ mCurrentState.mSecurityState = securityState;
+ mWebViewController.onUpdatedSecurityState(this);
}
/**
- * @return The tab's lock icon type.
+ * @return The tab's security state.
*/
- LockIcon getLockIconType() {
- return mCurrentState.mLockIcon;
+ SecurityState getSecurityState() {
+ return mCurrentState.mSecurityState;
}
int getLoadProgress() {
@@ -2008,7 +2017,7 @@ class Tab implements PictureListener {
public ContentValues createSnapshotValues() {
if (mMainView == null) return null;
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ SnapshotByteArrayOutputStream bos = new SnapshotByteArrayOutputStream();
try {
GZIPOutputStream stream = new GZIPOutputStream(bos);
if (!mMainView.saveViewState(stream)) {
@@ -2046,6 +2055,8 @@ class Tab implements PictureListener {
public void loadUrl(String url, Map<String, String> headers) {
if (mMainView != null) {
+ mPageLoadProgress = INITIAL_PROGRESS;
+ mInPageLoad = true;
mCurrentState = new PageState(mContext, false, url, null);
mWebViewController.onPageStarted(this, mMainView, null);
mMainView.loadUrl(url, headers);
diff --git a/src/com/android/browser/WebViewController.java b/src/com/android/browser/WebViewController.java
index f4ff764c2..20027e004 100644
--- a/src/com/android/browser/WebViewController.java
+++ b/src/com/android/browser/WebViewController.java
@@ -95,7 +95,7 @@ public interface WebViewController {
boolean shouldShowErrorConsole();
- void onUpdatedLockIcon(Tab tab);
+ void onUpdatedSecurityState(Tab tab);
void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType);
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index ea6fdddf2..b4afb6f22 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -300,19 +300,10 @@ public class XLargeUi extends BaseUi {
}
@Override
- public void showCustomView(View view, int requestedOrientation,
- CustomViewCallback callback) {
- super.showCustomView(view, requestedOrientation, callback);
- mActivity.getActionBar().hide();
- }
-
- @Override
public void onHideCustomView() {
super.onHideCustomView();
if (mUseQuickControls) {
checkTabCount();
- } else {
- mActivity.getActionBar().show();
}
}
diff --git a/src/com/android/browser/preferences/GeneralPreferencesFragment.java b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
index 05aa1a71f..c01847411 100644
--- a/src/com/android/browser/preferences/GeneralPreferencesFragment.java
+++ b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
@@ -29,6 +29,7 @@ import android.text.InputType;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
+import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
@@ -152,6 +153,8 @@ public class GeneralPreferencesFragment extends PreferenceFragment
return false;
}
});
+ dialog.getWindow().setSoftInputMode(
+ WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
dialog.show();
}
diff --git a/src/com/android/browser/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java
index 7e4ac0d7b..8181efbd2 100644
--- a/src/com/android/browser/provider/BrowserProvider2.java
+++ b/src/com/android/browser/provider/BrowserProvider2.java
@@ -122,12 +122,25 @@ public class BrowserProvider2 extends SQLiteContentProvider {
private static final String[] SUGGEST_PROJECTION = new String[] {
Bookmarks._ID,
Bookmarks.URL,
- Bookmarks.TITLE};
+ Bookmarks.TITLE,
+ "0"};
private static final String SUGGEST_SELECTION =
"url LIKE ? OR url LIKE ? OR url LIKE ? OR url LIKE ?"
+ " OR title LIKE ?";
+ private static final String[] HISTORY_SUGGEST_PROJECTION = new String[] {
+ History._ID,
+ History.URL,
+ History.TITLE,
+ History.DATE_LAST_VISITED};
+
+ private static final String HISTORY_SUGGEST_SELECTION =
+ History.DATE_LAST_VISITED + " != 0";
+
+ private static final String HISTORY_SUGGEST_ORDER_BY =
+ History.DATE_LAST_VISITED + " DESC";
+
private static final String IMAGE_PRUNE =
"url_key NOT IN (SELECT url FROM bookmarks " +
"WHERE url IS NOT NULL AND deleted == 0) AND url_key NOT IN " +
@@ -1093,8 +1106,13 @@ public class BrowserProvider2 extends SQLiteContentProvider {
}
private Cursor doSuggestQuery(String selection, String[] selectionArgs, String limit) {
- if (selectionArgs[0] == null) {
- return null;
+ Cursor c;
+ int iconId;
+ if (TextUtils.isEmpty(selectionArgs[0])) {
+ c = mOpenHelper.getReadableDatabase().query(TABLE_HISTORY,
+ HISTORY_SUGGEST_PROJECTION, HISTORY_SUGGEST_SELECTION, null, null, null,
+ HISTORY_SUGGEST_ORDER_BY, null);
+ iconId = R.drawable.ic_history_holo_dark;
} else {
String like = selectionArgs[0] + "%";
if (selectionArgs[0].startsWith("http")
@@ -1110,15 +1128,16 @@ public class BrowserProvider2 extends SQLiteContentProvider {
selectionArgs[4] = like;
selection = SUGGEST_SELECTION;
}
- }
- selection = DatabaseUtils.concatenateWhere(selection,
- Bookmarks.IS_DELETED + "=0 AND " + Bookmarks.IS_FOLDER + "=0");
+ selection = DatabaseUtils.concatenateWhere(selection,
+ Bookmarks.IS_DELETED + "=0 AND " + Bookmarks.IS_FOLDER + "=0");
- Cursor c = mOpenHelper.getReadableDatabase().query(TABLE_BOOKMARKS,
- SUGGEST_PROJECTION, selection, selectionArgs, null, null,
- DEFAULT_BOOKMARKS_SORT_ORDER, null);
+ c = mOpenHelper.getReadableDatabase().query(TABLE_BOOKMARKS,
+ SUGGEST_PROJECTION, selection, selectionArgs, null, null,
+ DEFAULT_BOOKMARKS_SORT_ORDER, null);
+ iconId = R.drawable.ic_bookmark_off_holo_dark;
+ }
- return new SuggestionsCursor(c);
+ return new SuggestionsCursor(c, iconId);
}
private String[] createCombinedQuery(
@@ -2016,6 +2035,7 @@ public class BrowserProvider2 extends SQLiteContentProvider {
private static final int ID_INDEX = 0;
private static final int URL_INDEX = 1;
private static final int TITLE_INDEX = 2;
+ private static final int LAST_ACCESS_TIME_INDEX = 3;
// shared suggestion array index, make sure to match COLUMNS
private static final int SUGGEST_COLUMN_INTENT_ACTION_ID = 1;
private static final int SUGGEST_COLUMN_INTENT_DATA_ID = 2;
@@ -2023,6 +2043,7 @@ public class BrowserProvider2 extends SQLiteContentProvider {
private static final int SUGGEST_COLUMN_TEXT_2_TEXT_ID = 4;
private static final int SUGGEST_COLUMN_TEXT_2_URL_ID = 5;
private static final int SUGGEST_COLUMN_ICON_1_ID = 6;
+ private static final int SUGGEST_COLUMN_LAST_ACCESS_HINT_ID = 7;
// shared suggestion columns
private static final String[] COLUMNS = new String[] {
@@ -2032,12 +2053,15 @@ public class BrowserProvider2 extends SQLiteContentProvider {
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_TEXT_2,
SearchManager.SUGGEST_COLUMN_TEXT_2_URL,
- SearchManager.SUGGEST_COLUMN_ICON_1};
+ SearchManager.SUGGEST_COLUMN_ICON_1,
+ SearchManager.SUGGEST_COLUMN_LAST_ACCESS_HINT};
- private Cursor mSource;
+ private final Cursor mSource;
+ private final String mIconId;
- public SuggestionsCursor(Cursor cursor) {
+ public SuggestionsCursor(Cursor cursor, int iconId) {
mSource = cursor;
+ mIconId = Integer.toString(iconId);
}
@Override
@@ -2060,7 +2084,9 @@ public class BrowserProvider2 extends SQLiteContentProvider {
case SUGGEST_COLUMN_TEXT_1_ID:
return mSource.getString(TITLE_INDEX);
case SUGGEST_COLUMN_ICON_1_ID:
- return Integer.toString(R.drawable.ic_bookmark_off_holo_dark);
+ return mIconId;
+ case SUGGEST_COLUMN_LAST_ACCESS_HINT_ID:
+ return mSource.getString(LAST_ACCESS_TIME_INDEX);
}
return null;
}
@@ -2090,6 +2116,8 @@ public class BrowserProvider2 extends SQLiteContentProvider {
switch (column) {
case ID_INDEX:
return mSource.getLong(ID_INDEX);
+ case SUGGEST_COLUMN_LAST_ACCESS_HINT_ID:
+ return mSource.getLong(LAST_ACCESS_TIME_INDEX);
}
throw new UnsupportedOperationException();
}
diff --git a/src/com/android/browser/view/PieMenu.java b/src/com/android/browser/view/PieMenu.java
index 99750f9c0..536ac92fd 100644
--- a/src/com/android/browser/view/PieMenu.java
+++ b/src/com/android/browser/view/PieMenu.java
@@ -89,6 +89,8 @@ public class PieMenu extends FrameLayout {
// touch handling
PieItem mCurrentItem;
+ private boolean mUseBackground;
+
/**
* @param context
* @param attrs
@@ -142,6 +144,10 @@ public class PieMenu extends FrameLayout {
mController = ctl;
}
+ public void setUseBackground(boolean useBackground) {
+ mUseBackground = useBackground;
+ }
+
public void addItem(PieItem item) {
// add the item to the pie itself
mItems.add(item);
@@ -245,18 +251,20 @@ public class PieMenu extends FrameLayout {
@Override
protected void onDraw(Canvas canvas) {
if (mOpen) {
- int w = mBackground.getIntrinsicWidth();
- int h = mBackground.getIntrinsicHeight();
- int left = mCenter.x - w;
- int top = mCenter.y - h / 2;
- mBackground.setBounds(left, top, left + w, top + h);
int state;
- state = canvas.save();
- if (onTheLeft()) {
- canvas.scale(-1, 1);
+ if (mUseBackground) {
+ int w = mBackground.getIntrinsicWidth();
+ int h = mBackground.getIntrinsicHeight();
+ int left = mCenter.x - w;
+ int top = mCenter.y - h / 2;
+ mBackground.setBounds(left, top, left + w, top + h);
+ state = canvas.save();
+ if (onTheLeft()) {
+ canvas.scale(-1, 1);
+ }
+ mBackground.draw(canvas);
+ canvas.restoreToCount(state);
}
- mBackground.draw(canvas);
- canvas.restoreToCount(state);
for (PieItem item : mItems) {
Paint p = item.isSelected() ? mSelectedPaint : mNormalPaint;
state = canvas.save();