diff options
Diffstat (limited to 'src/com/android')
| -rw-r--r-- | src/com/android/browser/BaseUi.java | 84 | ||||
| -rw-r--r-- | src/com/android/browser/BrowserSettings.java | 9 | ||||
| -rw-r--r-- | src/com/android/browser/Controller.java | 10 | ||||
| -rw-r--r-- | src/com/android/browser/IntentHandler.java | 1 | ||||
| -rw-r--r-- | src/com/android/browser/PageDialogsHandler.java | 2 | ||||
| -rw-r--r-- | src/com/android/browser/PieControlPhone.java | 48 | ||||
| -rw-r--r-- | src/com/android/browser/PieControlXLarge.java | 7 | ||||
| -rw-r--r-- | src/com/android/browser/PreloadController.java | 4 | ||||
| -rw-r--r-- | src/com/android/browser/SnapshotByteArrayOutputStream.java | 58 | ||||
| -rw-r--r-- | src/com/android/browser/Tab.java | 65 | ||||
| -rw-r--r-- | src/com/android/browser/WebViewController.java | 2 | ||||
| -rw-r--r-- | src/com/android/browser/XLargeUi.java | 9 | ||||
| -rw-r--r-- | src/com/android/browser/preferences/GeneralPreferencesFragment.java | 3 | ||||
| -rw-r--r-- | src/com/android/browser/provider/BrowserProvider2.java | 56 | ||||
| -rw-r--r-- | src/com/android/browser/view/PieMenu.java | 28 |
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(); |
