NavigationBar code cleanup
- Unified code for phone and tablet UI
- Chagned Favicon to use Tiles
- Updates to Tile class
Change-Id: Iecb699a3e5eb848db149705a9142f8f199f02c04
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index cd1388f..3682d69 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -49,8 +49,6 @@
import android.widget.Toast;
import android.content.res.TypedArray;
-import com.android.browser.Tab.SecurityState;
-
import org.codeaurora.swe.BrowserCommandLine;
import org.codeaurora.swe.WebView;
@@ -83,8 +81,6 @@
protected Tab mActiveTab;
private InputMethodManager mInputManager;
- private Drawable mLockIconSecure;
- private Drawable mLockIconMixed;
private Drawable mGenericFavicon;
protected FrameLayout mContentView;
@@ -160,20 +156,6 @@
}
}
- private Drawable getLockIconSecure() {
- if (mLockIconSecure == null) {
- mLockIconSecure = mActivity.getResources().getDrawable(R.drawable.ic_deco_secure);
- }
- return mLockIconSecure;
- }
-
- private Drawable getLockIconMixed() {
- if (mLockIconMixed == null) {
- mLockIconMixed = mActivity.getResources().getDrawable(R.drawable.ic_deco_secure_partial);
- }
- return mLockIconMixed;
- }
-
protected Drawable getGenericFavicon() {
if (mGenericFavicon == null) {
mGenericFavicon = mActivity.getResources().getDrawable(R.drawable.ic_deco_favicon_normal);
@@ -247,7 +229,7 @@
public void onTabDataChanged(Tab tab) {
setUrlTitle(tab);
setFavicon(tab);
- updateLockIconToLatest(tab);
+ updateTabSecurityState(tab);
updateNavigationState(tab);
mTitleBar.onTabDataChanged(tab);
mNavigationBar.onTabDataChanged(tab);
@@ -326,6 +308,9 @@
mBlockFocusAnimations = false;
scheduleRemoveTab(tabToRemove, tabToWaitFor);
+
+ updateTabSecurityState(tab);
+ mTitleBar.setSkipTitleBarAnimations(false);
}
Tab mTabToRemove = null;
@@ -719,28 +704,12 @@
/**
* Update the lock icon to correspond to our latest state.
*/
- protected void updateLockIconToLatest(Tab t) {
+ private void updateTabSecurityState(Tab t) {
if (t != null && t.inForeground()) {
- updateLockIconImage(t.getSecurityState());
+ mNavigationBar.setSecurityState(t.getSecurityState());
}
}
- /**
- * Updates the lock-icon image in the title-bar.
- */
- private void updateLockIconImage(SecurityState securityState) {
- Drawable d = null;
- if (securityState == SecurityState.SECURITY_STATE_SECURE) {
- d = getLockIconSecure();
- } else if (securityState == SecurityState.SECURITY_STATE_MIXED
- || securityState == SecurityState.SECURITY_STATE_BAD_CERTIFICATE) {
- // TODO: It would be good to have different icons for insecure vs mixed content.
- // See http://b/5403800
- d = getLockIconMixed();
- }
- mNavigationBar.setLock(d, securityState);
- }
-
protected void setUrlTitle(Tab tab) {
String url = tab.getUrl();
String title = tab.getTitle();
@@ -755,8 +724,7 @@
// Set the favicon in the title bar.
protected void setFavicon(Tab tab) {
if (tab.inForeground()) {
- Bitmap icon = tab.getFavicon();
- mNavigationBar.setFavicon(icon);
+ mNavigationBar.setFavicon(tab.getWebView().getFavicon());
}
}
@@ -1060,4 +1028,9 @@
mTitleBar.setTranslationY(0);
}
}
+
+ @Override
+ public boolean shouldCaptureThumbnails() {
+ return true;
+ }
}
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index 344e7d9..0d98021 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -24,14 +24,17 @@
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.Color;
-import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.net.http.SslCertificate;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
import android.text.Editable;
+import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
@@ -73,22 +76,34 @@
protected TitleBar mTitleBar;
protected UiController mUiController;
protected UrlInputView mUrlInput;
+ protected ImageView mStopButton;
- protected ImageView mFaviconBadge;
-
- private ImageView mFavicon;
- private ImageView mLockIcon;
-
+ private SiteTileView mFaviconTile;
+ private ImageView mMagnify;
+ private View mVoiceButton;
+ private ImageView mClearButton;
private View mMore;
private PopupMenu mPopupMenu;
private boolean mOverflowMenuShowing;
private boolean mNeedsMenu;
+ private static Bitmap mDefaultFavicon;
+
private int mStatusBarColor;
private static int mDefaultStatusBarColor = -1;
+ private static final int WEBREFINER_COUNTER_MSG = 4242;
+ private static final int WEBREFINER_COUNTER_MSG_DELAY = 3000;
+ private Handler mHandler;
+
private Tab.SecurityState mSecurityState = Tab.SecurityState.SECURITY_STATE_NOT_SECURE;
+ private static final String noSitePrefs[] = {
+ "chrome://",
+ "about:",
+ "content:",
+ };
+
public NavigationBarBase(Context context) {
super(context);
}
@@ -104,8 +119,6 @@
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mLockIcon = (ImageView) findViewById(R.id.lock);
- mFavicon = (ImageView) findViewById(R.id.favicon);
mUrlInput = (UrlInputView) findViewById(R.id.url);
mUrlInput.setUrlInputListener(this);
mUrlInput.setOnFocusChangeListener(this);
@@ -114,7 +127,38 @@
mMore = findViewById(R.id.more_browser_settings);
mMore.setOnClickListener(this);
mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
- mFaviconBadge = (ImageView) findViewById(R.id.favicon_badge);
+ mMagnify = (ImageView) findViewById(R.id.magnify);
+ mMagnify.setOnClickListener(this);
+ mFaviconTile = (SiteTileView) findViewById(R.id.favicon_view);
+ mFaviconTile.setOnClickListener(this);
+ mVoiceButton = findViewById(R.id.voice);
+ mVoiceButton.setOnClickListener(this);
+ mClearButton = (ImageView) findViewById(R.id.clear);
+ mClearButton.setOnClickListener(this);
+ mStopButton = (ImageView) findViewById(R.id.stop);
+ mStopButton.setOnClickListener(this);
+
+ mDefaultFavicon = BitmapFactory.decodeResource(getResources(),
+ R.drawable.ic_deco_favicon_normal);
+
+ mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message m) {
+ switch (m.what) {
+ case WEBREFINER_COUNTER_MSG:
+ WebView wv = mUiController.getCurrentTopWebView();
+ if (wv != null && WebRefiner.isInitialized()) {
+ int count = WebRefiner.getInstance().getBlockedURLCount(wv);
+ if (count > 0) {
+ mFaviconTile.setExtraBlockedObjectsCount(count);
+ }
+ }
+ mHandler.sendEmptyMessageDelayed(WEBREFINER_COUNTER_MSG,
+ WEBREFINER_COUNTER_MSG_DELAY);
+ break;
+ }
+ }
+ };
}
public void setTitleBar(TitleBar titleBar) {
@@ -124,30 +168,21 @@
mUrlInput.setController(mUiController);
}
- public void setLock(Drawable d, Tab.SecurityState securityState) {
+ public void setSecurityState(Tab.SecurityState securityState) {
mSecurityState = securityState;
- if (mFaviconBadge != null) {
- switch (mSecurityState) {
- case SECURITY_STATE_SECURE:
- mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_good);
- break;
- case SECURITY_STATE_MIXED:
- mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_warning);
- break;
- case SECURITY_STATE_BAD_CERTIFICATE:
- mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_severe);
- break;
- case SECURITY_STATE_NOT_SECURE:
- default:
- mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_normal);
- }
- }
- if (mLockIcon == null) return;
- if (d == null) {
- mLockIcon.setVisibility(View.GONE);
- } else {
- mLockIcon.setImageDrawable(d);
- mLockIcon.setVisibility(View.VISIBLE);
+ switch (mSecurityState) {
+ case SECURITY_STATE_SECURE:
+ mFaviconTile.setTrustLevel(SiteTileView.TRUST_TRUSTED);
+ break;
+ case SECURITY_STATE_MIXED:
+ mFaviconTile.setTrustLevel(SiteTileView.TRUST_UNTRUSTED);
+ break;
+ case SECURITY_STATE_BAD_CERTIFICATE:
+ mFaviconTile.setTrustLevel(SiteTileView.TRUST_AVOID);
+ break;
+ case SECURITY_STATE_NOT_SECURE:
+ default:
+ mFaviconTile.setTrustLevel(SiteTileView.TRUST_UNKNOWN);
}
}
@@ -240,8 +275,11 @@
setStatusAndNavigationBarColor(mUiController.getActivity(), mDefaultStatusBarColor);
}
- if (mFavicon == null) return;
- mFavicon.setImageDrawable(mBaseUi.getFaviconDrawable(icon));
+ //Bitmap favicon = mUiController.getCurrentTopWebView().getFavicon();
+
+ if (mFaviconTile != null) {
+ mFaviconTile.replaceFavicon(mUiController.getCurrentTopWebView().getFavicon());
+ }
}
protected void showSiteSpecificSettings() {
@@ -304,8 +342,61 @@
@Override
public void onClick(View v) {
+ Tab currentTab = mUiController.getCurrentTab();
+ String url = null;
+ if (currentTab != null){
+ url = currentTab.getUrl();
+ }
if (mMore == v) {
showMenu(mMore);
+ } else if (mFaviconTile == v) {
+ if (urlHasSitePrefs(url)){
+ showSiteSpecificSettings();
+ }
+ } else if (mMagnify == v) {
+ startEditingUrl(true, true);
+ } else if (mVoiceButton == v) {
+ mUiController.startVoiceRecognizer();
+ } else if (mStopButton == v) {
+ stopOrRefresh();
+ } else if (mClearButton == v) {
+ clearOrClose();
+ mUrlInput.setText("");
+ }
+ }
+
+ private static boolean urlHasSitePrefs(String url) {
+ if (TextUtils.isEmpty(url)) {
+ return false;
+ }
+
+ for (int i = 0; i < noSitePrefs.length; i++) {
+ if (url.startsWith(noSitePrefs[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void stopOrRefresh() {
+ if (mUiController == null) return;
+ if (mTitleBar.isInLoad()) {
+ mUiController.stopLoading();
+ } else {
+ if (mUiController.getCurrentTopWebView() != null) {
+ stopEditingUrl();
+ mUiController.getCurrentTopWebView().reload();
+ }
+ }
+ }
+
+ private void clearOrClose() {
+ if (TextUtils.isEmpty(mUrlInput.getText())) {
+ // close
+ mUrlInput.clearFocus();
+ } else {
+ // clear
+ mUrlInput.setText("");
}
}
@@ -610,11 +701,25 @@
}
public void onProgressStarted() {
- mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_normal);
+ mFaviconTile.setExtraBlockedObjectsCount(0);
+ mFaviconTile.setTrustLevel(SiteTileView.TRUST_UNKNOWN);
+ mFaviconTile.replaceFavicon(mDefaultFavicon);
mSecurityState = Tab.SecurityState.SECURITY_STATE_NOT_SECURE;
+ mHandler.removeMessages(WEBREFINER_COUNTER_MSG);
+ mHandler.sendEmptyMessageDelayed(WEBREFINER_COUNTER_MSG,
+ WEBREFINER_COUNTER_MSG_DELAY);
+ mStopButton.setImageResource(R.drawable.ic_action_stop);
+ mStopButton.setContentDescription(getResources().
+ getString(R.string.accessibility_button_stop));
}
public void onProgressStopped() {
+ if (!isEditingUrl()) {
+ mFaviconTile.setVisibility(View.VISIBLE);
+ }
+ mStopButton.setImageResource(R.drawable.ic_action_reload);
+ mStopButton.setContentDescription(getResources().
+ getString(R.string.accessibility_button_refresh));
}
public void onTabDataChanged(Tab tab) {
@@ -636,14 +741,41 @@
@Override
public void onStateChanged(int state) {
+ mVoiceButton.setVisibility(View.GONE);
switch(state) {
case STATE_NORMAL:
+ mFaviconTile.setVisibility(View.VISIBLE);
+ mMagnify.setVisibility(View.GONE);
+ mClearButton.setVisibility(View.GONE);
mMore.setVisibility(mNeedsMenu ? View.VISIBLE : View.GONE);
+ if (mUiController != null) {
+ Tab currentTab = mUiController.getCurrentTab();
+ if (currentTab != null){
+ if (TextUtils.isEmpty(currentTab.getUrl())) {
+ mFaviconTile.setVisibility(View.GONE);
+ mMagnify.setVisibility(View.VISIBLE);
+ }
+ }
+ mUiController.setWindowDimming(0.0f);
+ }
+
break;
case STATE_HIGHLIGHTED:
+ mFaviconTile.setVisibility(View.GONE);
+ mMagnify.setVisibility(View.GONE);
+ mClearButton.setVisibility(View.GONE);
mMore.setVisibility(View.GONE);
+ if (mUiController != null) {
+ mUiController.setWindowDimming(0.75f);
+ if (mUiController.supportsVoice()) {
+ mVoiceButton.setVisibility(View.VISIBLE);
+ }
+ }
break;
case STATE_EDITED:
+ mFaviconTile.setVisibility(View.GONE);
+ mMagnify.setVisibility(View.VISIBLE);
+ mClearButton.setVisibility(View.VISIBLE);
mMore.setVisibility(View.GONE);
break;
}
diff --git a/src/com/android/browser/NavigationBarPhone.java b/src/com/android/browser/NavigationBarPhone.java
index e5f76ff..5b2bb75 100644
--- a/src/com/android/browser/NavigationBarPhone.java
+++ b/src/com/android/browser/NavigationBarPhone.java
@@ -16,53 +16,24 @@
package com.android.browser;
import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
-import org.codeaurora.swe.Engine;
-import org.codeaurora.swe.WebRefiner;
-import org.codeaurora.swe.WebView;
import org.codeaurora.swe.util.Activator;
import org.codeaurora.swe.util.Observable;
-import android.widget.ImageView;
import android.widget.TextView;
import com.android.browser.UrlInputView.StateListener;
-import com.android.browser.preferences.AboutPreferencesFragment;
-import com.android.browser.preferences.SiteSpecificPreferencesFragment;
-import java.io.ByteArrayOutputStream;
+public class NavigationBarPhone extends NavigationBarBase implements StateListener {
-public class NavigationBarPhone extends NavigationBarBase implements
- StateListener {
-
- private ImageView mStopButton;
- private ImageView mMagnify;
- private ImageView mClearButton;
- private ImageView mVoiceButton;
- private Drawable mStopDrawable;
- private Drawable mRefreshDrawable;
- private String mStopDescription;
- private String mRefreshDescription;
private View mTabSwitcher;
private TextView mTabText;
- private View mComboIcon;
private View mIncognitoIcon;
private float mTabSwitcherInitialTextSize = 0;
private float mTabSwitcherCompressedTextSize = 0;
- private static final int MSG_UPDATE_NOTIFICATION_COUNTER = 4242;
- private static final int NOTIFICATION_COUNTER_UPDATE_DELAY = 3000;
- private TextView mNotificationCounter;
- private Handler mHandler;
-
public NavigationBarPhone(Context context) {
super(context);
}
@@ -78,24 +49,10 @@
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mStopButton = (ImageView) findViewById(R.id.stop);
- mStopButton.setOnClickListener(this);
- mClearButton = (ImageView) findViewById(R.id.clear);
- mClearButton.setOnClickListener(this);
- mVoiceButton = (ImageView) findViewById(R.id.voice);
- mVoiceButton.setOnClickListener(this);
- mMagnify = (ImageView) findViewById(R.id.magnify);
mTabSwitcher = findViewById(R.id.tab_switcher);
mTabSwitcher.setOnClickListener(this);
mTabText = (TextView) findViewById(R.id.tab_switcher_text);
- mComboIcon = findViewById(R.id.iconcombo);
- mComboIcon.setOnClickListener(this);
setFocusState(false);
- Resources res = getContext().getResources();
- mStopDrawable = res.getDrawable(R.drawable.ic_action_stop);
- mRefreshDrawable = res.getDrawable(R.drawable.ic_action_reload);
- mStopDescription = res.getString(R.string.accessibility_button_stop);
- mRefreshDescription = res.getString(R.string.accessibility_button_refresh);
mUrlInput.setContainer(this);
mUrlInput.setStateListener(this);
mIncognitoIcon = findViewById(R.id.incognito_icon);
@@ -104,26 +61,6 @@
mTabSwitcherInitialTextSize = mTabText.getTextSize();
mTabSwitcherCompressedTextSize = (float) (mTabSwitcherInitialTextSize / 1.2);
}
-
- mNotificationCounter = (TextView) findViewById(R.id.notification_counter);
- mHandler = new Handler() {
- @Override
- public void handleMessage(Message m) {
- switch (m.what) {
- case MSG_UPDATE_NOTIFICATION_COUNTER:
- WebView wv = mUiController.getCurrentTopWebView();
- if (wv != null && WebRefiner.isInitialized()) {
- int count = WebRefiner.getInstance().getBlockedURLCount(wv);
- if (count > 0) {
- mNotificationCounter.setText(String.valueOf(count));
- mNotificationCounter.setVisibility(View.VISIBLE);
- }
- }
- mHandler.sendEmptyMessageDelayed(MSG_UPDATE_NOTIFICATION_COUNTER, NOTIFICATION_COUNTER_UPDATE_DELAY);
- break;
- }
- }
- };
}
@Override
@@ -134,9 +71,11 @@
@Override
public void onChange(Object... params) {
if ((Integer)params[0] > 9) {
- mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTabSwitcherCompressedTextSize);
+ mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+ mTabSwitcherCompressedTextSize);
} else {
- mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTabSwitcherInitialTextSize);
+ mTabText.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+ mTabSwitcherInitialTextSize);
}
mTabText.setText(Integer.toString((Integer) params[0]));
@@ -146,30 +85,8 @@
}
@Override
- public void onProgressStarted() {
- super.onProgressStarted();
- /*if (mStopButton.getDrawable() != mStopDrawable) {
- mStopButton.setImageDrawable(mStopDrawable);
- mStopButton.setContentDescription(mStopDescription);
- if (mStopButton.getVisibility() != View.VISIBLE) {
- mComboIcon.setVisibility(View.GONE);
- mStopButton.setVisibility(View.VISIBLE);
- }
- }*/
- mFaviconBadge.setImageResource(R.drawable.ic_fav_overlay_normal);
- mNotificationCounter.setVisibility(View.INVISIBLE);
- mHandler.removeMessages(MSG_UPDATE_NOTIFICATION_COUNTER);
- mHandler.sendEmptyMessageDelayed(MSG_UPDATE_NOTIFICATION_COUNTER, NOTIFICATION_COUNTER_UPDATE_DELAY);
- }
-
- @Override
public void onProgressStopped() {
super.onProgressStopped();
- //mStopButton.setImageDrawable(mRefreshDrawable);
- //mStopButton.setContentDescription(mRefreshDescription);
- if (!isEditingUrl()) {
- mComboIcon.setVisibility(View.VISIBLE);
- }
onStateChanged(mUrlInput.getState());
}
@@ -199,25 +116,8 @@
@Override
public void onClick(View v) {
- if (v == mStopButton) {
- if (mTitleBar.isInLoad()) {
- mUiController.stopLoading();
- } else {
- WebView web = mBaseUi.getWebView();
- if (web != null) {
- stopEditingUrl();
- Tab currentTab = mUiController.getTabControl().getCurrentTab();
- web.reload();
- }
- }
- } else if (v == mTabSwitcher) {
+ if (v == mTabSwitcher) {
((PhoneUi) mBaseUi).toggleNavScreen();
- } else if (mClearButton == v) {
- mUrlInput.setText("");
- } else if (mComboIcon == v) {
- showSiteSpecificSettings();
- } else if (mVoiceButton == v) {
- mUiController.startVoiceRecognizer();
} else {
super.onClick(v);
}
@@ -226,57 +126,39 @@
@Override
public void onFocusChange(View view, boolean hasFocus) {
if (view == mUrlInput && !hasFocus) {
- setDisplayTitle(mUrlInput.getText().toString());
+ Tab currentTab = mUiController.getTabControl().getCurrentTab();
+ setDisplayTitle(currentTab.getUrl());
}
super.onFocusChange(view, hasFocus);
}
@Override
public void onStateChanged(int state) {
- super.onStateChanged(state);
- mVoiceButton.setVisibility(View.GONE);
switch(state) {
case StateListener.STATE_NORMAL:
- mComboIcon.setVisibility(View.VISIBLE);
mStopButton.setVisibility(View.GONE);
- mClearButton.setVisibility(View.GONE);
- mMagnify.setVisibility(View.GONE);
mTabSwitcher.setVisibility(View.VISIBLE);
mTabText.setVisibility(View.VISIBLE);
- if (mUiController != null) {
- mUiController.setWindowDimming(0.0f);
- }
break;
case StateListener.STATE_HIGHLIGHTED:
- mComboIcon.setVisibility(View.GONE);
- mStopButton.setVisibility(View.VISIBLE);
- mClearButton.setVisibility(View.GONE);
- if ((mUiController != null) && mUiController.supportsVoice()) {
- mVoiceButton.setVisibility(View.VISIBLE);
- }
- mMagnify.setVisibility(View.GONE);
- mTabSwitcher.setVisibility(View.GONE);
- mTabText.setVisibility(View.GONE);
-
if (!mUrlInput.getText().toString().equals(mUrlInput.getTag())) {
// only change text if different
mUrlInput.setText((String) mUrlInput.getTag(), false);
mUrlInput.selectAll();
}
- if (mUiController != null) {
- mUiController.setWindowDimming(0.75f);
- }
+ mStopButton.setVisibility(View.VISIBLE);
+ mTabSwitcher.setVisibility(View.GONE);
+ mTabText.setVisibility(View.GONE);
+
break;
case StateListener.STATE_EDITED:
- mComboIcon.setVisibility(View.GONE);
mStopButton.setVisibility(View.GONE);
- mClearButton.setVisibility(View.VISIBLE);
- mMagnify.setVisibility(View.VISIBLE);
mTabSwitcher.setVisibility(View.GONE);
mTabText.setVisibility(View.GONE);
break;
}
+ super.onStateChanged(state);
}
@Override
diff --git a/src/com/android/browser/NavigationBarTablet.java b/src/com/android/browser/NavigationBarTablet.java
index c6c88cd..ce482d9 100644
--- a/src/com/android/browser/NavigationBarTablet.java
+++ b/src/com/android/browser/NavigationBarTablet.java
@@ -15,18 +15,10 @@
*/
package com.android.browser;
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageButton;
@@ -34,33 +26,17 @@
import com.android.browser.UI.ComboViews;
import com.android.browser.UrlInputView.StateListener;
-import com.android.browser.preferences.SiteSpecificPreferencesFragment;
-
-import org.codeaurora.swe.WebRefiner;
-import org.codeaurora.swe.WebView;
-
-import java.io.ByteArrayOutputStream;
public class NavigationBarTablet extends NavigationBarBase implements StateListener {
- private Drawable mStopDrawable;
- private Drawable mReloadDrawable;
- private String mStopDescription;
- private String mRefreshDescription;
-
private View mUrlContainer;
private ImageButton mBackButton;
private ImageButton mForwardButton;
private ImageView mStar;
- private ImageView mUrlIcon;
private ImageView mSearchButton;
- private ImageView mStopButton;
private View mAllButton;
- private View mClearButton;
- private View mVoiceButton;
private View mNavButtons;
private boolean mHideNavButtons;
- private Drawable mFaviconDrawable;
public NavigationBarTablet(Context context) {
super(context);
@@ -78,41 +54,26 @@
}
private void init(Context context) {
- Resources resources = context.getResources();
- mStopDrawable = resources.getDrawable(R.drawable.ic_action_stop);
- mReloadDrawable = resources.getDrawable(R.drawable.ic_action_reload);
- mStopDescription = resources.getString(R.string.accessibility_button_stop);
- mRefreshDescription = resources.getString(R.string.accessibility_button_refresh);
- mHideNavButtons = resources.getBoolean(R.bool.hide_nav_buttons);
+ mHideNavButtons = getResources().getBoolean(R.bool.hide_nav_buttons);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mAllButton = findViewById(R.id.all_btn);
- // TODO: Change enabled states based on whether you can go
- // back/forward. Probably should be done inside onPageStarted.
mNavButtons = findViewById(R.id.navbuttons);
mBackButton = (ImageButton) findViewById(R.id.back);
mForwardButton = (ImageButton) findViewById(R.id.forward);
- mUrlIcon = (ImageView) findViewById(R.id.url_icon);
mStar = (ImageView) findViewById(R.id.star);
- mStopButton = (ImageView) findViewById(R.id.stop);
mSearchButton = (ImageView) findViewById(R.id.search);
- mClearButton = findViewById(R.id.clear);
- mVoiceButton = findViewById(R.id.voice);
mUrlContainer = findViewById(R.id.urlbar_focused);
mBackButton.setOnClickListener(this);
mForwardButton.setOnClickListener(this);
mStar.setOnClickListener(this);
mAllButton.setOnClickListener(this);
- mStopButton.setOnClickListener(this);
mSearchButton.setOnClickListener(this);
- mClearButton.setOnClickListener(this);
- mVoiceButton.setOnClickListener(this);
mUrlInput.setContainer(mUrlContainer);
mUrlInput.setStateListener(this);
- mUrlIcon.setOnClickListener(this);
}
public void onConfigurationChanged(Configuration config) {
@@ -121,14 +82,9 @@
mHideNavButtons = res.getBoolean(R.bool.hide_nav_buttons);
if (mUrlInput.hasFocus()) {
if (mHideNavButtons && (mNavButtons.getVisibility() == View.VISIBLE)) {
- int aw = mNavButtons.getMeasuredWidth();
- mNavButtons.setVisibility(View.GONE);
- mNavButtons.setAlpha(0f);
- mNavButtons.setTranslationX(-aw);
+ hideNavButtons();
} else if (!mHideNavButtons && (mNavButtons.getVisibility() == View.GONE)) {
- mNavButtons.setVisibility(View.VISIBLE);
- mNavButtons.setAlpha(1f);
- mNavButtons.setTranslationX(0);
+ showNavButtons();
}
}
}
@@ -144,7 +100,6 @@
mBackButton.setEnabled(tab.canGoBack());
mForwardButton.setEnabled(tab.canGoForward());
}
- updateUrlIcon();
}
@Override
@@ -173,47 +128,11 @@
mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
} else if (mSearchButton == v) {
mBaseUi.editUrl(true, true);
- } else if (mStopButton == v) {
- stopOrRefresh();
- } else if (mClearButton == v) {
- clearOrClose();
- } else if (mVoiceButton == v) {
- mUiController.startVoiceRecognizer();
- } else if (mUrlIcon == v) {
- showSiteSpecificSettings();
} else {
super.onClick(v);
}
}
- private void clearOrClose() {
- if (TextUtils.isEmpty(mUrlInput.getText())) {
- // close
- mUrlInput.clearFocus();
- } else {
- // clear
- mUrlInput.setText("");
- }
- }
-
- @Override
- public void setFavicon(Bitmap icon) {
- super.setFavicon(icon);
- mFaviconDrawable = mBaseUi.getFaviconDrawable(icon);
- updateUrlIcon();
- }
-
- void updateUrlIcon() {
- if (mUrlInput.hasFocus()) {
- mUrlIcon.setImageResource(R.drawable.ic_action_search_normal);
- } else {
- if (mFaviconDrawable == null) {
- mFaviconDrawable = mBaseUi.getFaviconDrawable(null);
- }
- mUrlIcon.setImageDrawable(mFaviconDrawable);
- }
- }
-
@Override
protected void setFocusState(boolean focus) {
super.setFocusState(focus);
@@ -223,85 +142,26 @@
}
mSearchButton.setVisibility(View.GONE);
mStar.setVisibility(View.GONE);
- mUrlIcon.setImageResource(R.drawable.ic_action_search_normal);
} else {
if (mHideNavButtons) {
showNavButtons();
}
showHideStar(mUiController.getCurrentTab());
mSearchButton.setVisibility(View.VISIBLE);
- updateUrlIcon();
}
}
- private void stopOrRefresh() {
- if (mUiController == null) return;
- if (mTitleBar.isInLoad()) {
- mUiController.stopLoading();
- } else {
- if (mUiController.getCurrentTopWebView() != null) {
- Tab currTab = mUiController.getTabControl().getCurrentTab();
- mUiController.getCurrentTopWebView().reload();
- }
- }
- }
-
- @Override
- public void onProgressStarted() {
- mStopButton.setImageDrawable(mStopDrawable);
- mStopButton.setContentDescription(mStopDescription);
- }
-
- @Override
- public void onProgressStopped() {
- mStopButton.setImageDrawable(mReloadDrawable);
- mStopButton.setContentDescription(mRefreshDescription);
- }
-
- private AnimatorSet mAnimation;
-
private void hideNavButtons() {
- if (mBaseUi.blockFocusAnimations()) {
- mNavButtons.setVisibility(View.GONE);
- return;
- }
- int awidth = mNavButtons.getMeasuredWidth();
- Animator anim1 = ObjectAnimator.ofFloat(mNavButtons, View.TRANSLATION_X, 0, - awidth);
- Animator anim2 = ObjectAnimator.ofInt(mUrlContainer, "left", mUrlContainer.getLeft(),
- mUrlContainer.getPaddingLeft());
- Animator anim3 = ObjectAnimator.ofFloat(mNavButtons, View.ALPHA, 1f, 0f);
- mAnimation = new AnimatorSet();
- mAnimation.playTogether(anim1, anim2, anim3);
- mAnimation.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mNavButtons.setVisibility(View.GONE);
- mAnimation = null;
- }
- });
- mAnimation.setDuration(150);
- mAnimation.start();
+ int aw = mNavButtons.getMeasuredWidth();
+ mNavButtons.setVisibility(View.GONE);
+ mNavButtons.setAlpha(0f);
+ mNavButtons.setTranslationX(-aw);
}
private void showNavButtons() {
- if (mAnimation != null) {
- mAnimation.cancel();
- }
mNavButtons.setVisibility(View.VISIBLE);
+ mNavButtons.setAlpha(1f);
mNavButtons.setTranslationX(0);
- if (!mBaseUi.blockFocusAnimations()) {
- int awidth = mNavButtons.getMeasuredWidth();
- Animator anim1 = ObjectAnimator.ofFloat(mNavButtons,
- View.TRANSLATION_X, -awidth, 0);
- Animator anim2 = ObjectAnimator.ofInt(mUrlContainer, "left", 0,
- awidth);
- Animator anim3 = ObjectAnimator.ofFloat(mNavButtons, View.ALPHA,
- 0f, 1f);
- AnimatorSet combo = new AnimatorSet();
- combo.playTogether(anim1, anim2, anim3);
- combo.setDuration(150);
- combo.start();
- }
}
private void showHideStar(Tab tab) {
@@ -315,25 +175,4 @@
mStar.setVisibility(starVisibility);
}
}
-
- @Override
- public void onStateChanged(int state) {
- super.onStateChanged(state);
- mVoiceButton.setVisibility(View.GONE);
- switch(state) {
- case STATE_NORMAL:
- mClearButton.setVisibility(View.GONE);
- break;
- case STATE_HIGHLIGHTED:
- mClearButton.setVisibility(View.GONE);
- if ((mUiController != null) && mUiController.supportsVoice()) {
- mVoiceButton.setVisibility(View.VISIBLE);
- }
- break;
- case STATE_EDITED:
- mClearButton.setVisibility(View.VISIBLE);
- break;
- }
- }
-
}
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index f3a08f7..774d2ba 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -24,10 +24,7 @@
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Rect;
import android.os.Bundle;
-import android.os.Message;
import android.util.Log;
import android.view.ActionMode;
import android.view.KeyEvent;
@@ -38,16 +35,14 @@
import android.view.ViewStub;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.DecelerateInterpolator;
-import android.webkit.ValueCallback;
+
import org.codeaurora.swe.WebView;
-import android.widget.FrameLayout;
import android.widget.ImageView;
import com.android.browser.UrlInputView.StateListener;
import org.codeaurora.net.NetworkServices;
-import org.codeaurora.swe.WebView;
/**
* Ui for regular phone screen sizes
@@ -55,15 +50,12 @@
public class PhoneUi extends BaseUi {
private static final String LOGTAG = "PhoneUi";
- private static final int MSG_INIT_NAVSCREEN = 100;
private NavScreen mNavScreen;
private AnimScreen mAnimScreen;
private final NavigationBarPhone mNavigationBar;
- private final Activity mBrowser;
private boolean mNavScreenRequested = false;
- boolean mAnimating;
boolean mShowNav = false;
private ComboView mComboView;
@@ -75,7 +67,6 @@
public PhoneUi(Activity browser, UiController controller) {
super(browser, controller);
mNavigationBar = (NavigationBarPhone) mTitleBar.getNavigationBar();
- mBrowser = browser;
}
@Override
@@ -96,8 +87,11 @@
public void showComboView(ComboViews startingView, Bundle extras) {
if (mComboView == null) {
- mNavScreen.setVisibility(View.GONE);
- ViewStub stub = (ViewStub) mActivity.getWindow().getDecorView().findViewById(R.id.combo_view_stub);
+ if (mNavScreen != null) {
+ mNavScreen.setVisibility(View.GONE);
+ }
+ ViewStub stub = (ViewStub) mActivity.getWindow().
+ getDecorView().findViewById(R.id.combo_view_stub);
mComboView = (ComboView) stub.inflate();
mComboView.setVisibility(View.GONE);
mComboView.setupViews(mActivity);
@@ -125,7 +119,7 @@
mNavScreen.close(mUiController.getTabControl().getCurrentPosition());
return true;
}
- if (showingComboView()) {
+ if (isComboViewShowing()) {
hideComboView();
return true;
}
@@ -136,39 +130,12 @@
return mNavScreen != null && mNavScreen.getVisibility() == View.VISIBLE;
}
- private boolean showingComboView() {
- return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
- }
-
@Override
public boolean dispatchKey(int code, KeyEvent event) {
return false;
}
@Override
- public void onProgressChanged(Tab tab) {
- super.onProgressChanged(tab);
- if (mNavScreen == null && getTitleBar().getHeight() > 0) {
- mHandler.sendEmptyMessage(MSG_INIT_NAVSCREEN);
- }
- }
-
- @Override
- protected void handleMessage(Message msg) {
- super.handleMessage(msg);
- if (msg.what == MSG_INIT_NAVSCREEN) {
- if (mNavScreen == null) {
- mNavScreen = new NavScreen(mActivity, mUiController, this);
- mCustomViewContainer.addView(mNavScreen, COVER_SCREEN_PARAMS);
- mNavScreen.setVisibility(View.GONE);
- }
- if (mAnimScreen == null) {
- mAnimScreen = new AnimScreen(mActivity);
- }
- }
- }
-
- @Override
public void setActiveTab(final Tab tab) {
mTitleBar.cancelTitleBarAnimation(true);
mTitleBar.setSkipTitleBarAnimations(true);
@@ -191,8 +158,6 @@
// update nav bar state
mNavigationBar.onStateChanged(StateListener.STATE_NORMAL);
- updateLockIconToLatest(tab);
- mTitleBar.setSkipTitleBarAnimations(false);
}
// menu handling callbacks
@@ -223,7 +188,7 @@
menu.setGroupVisible(R.id.NAV_MENU, false);
}
- if (showingComboView()) {
+ if (isComboViewShowing()) {
menu.setGroupVisible(R.id.MAIN_MENU, false);
menu.setGroupEnabled(R.id.MAIN_MENU, false);
menu.setGroupEnabled(R.id.MAIN_SHORTCUT_MENU, false);
@@ -273,12 +238,12 @@
@Override
public boolean isWebShowing() {
- return super.isWebShowing() && !showingNavScreen() && !showingComboView();
+ return super.isWebShowing() && !showingNavScreen() && !isComboViewShowing();
}
@Override
public boolean isComboViewShowing() {
- return showingComboView();
+ return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
}
@Override
@@ -386,7 +351,8 @@
ObjectAnimator tx = ObjectAnimator.ofInt(mAnimScreen.mContent, "left", fromLeft, toLeft);
ObjectAnimator ty = ObjectAnimator.ofInt(mAnimScreen.mContent, "top", fromTop, toTop);
ObjectAnimator tr = ObjectAnimator.ofInt(mAnimScreen.mContent, "right", fromRight, toRight);
- ObjectAnimator tb = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom", fromBottom, toBottom);
+ ObjectAnimator tb = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom",
+ fromBottom, toBottom);
ObjectAnimator sx = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor", 1f, toScaleFactor);
ObjectAnimator navTabsIn = mNavScreen.createToolbarInAnimator();
mAnimScreen.mContent.layout(fromLeft, fromTop, fromRight, fromBottom);
@@ -493,7 +459,8 @@
ObjectAnimator l = ObjectAnimator.ofInt(mAnimScreen.mContent, "left", fromLeft, toLeft);
ObjectAnimator t = ObjectAnimator.ofInt(mAnimScreen.mContent, "top", fromTop, toTop);
ObjectAnimator r = ObjectAnimator.ofInt(mAnimScreen.mContent, "right", fromRight, toRight);
- ObjectAnimator b = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom", fromBottom, toBottom);
+ ObjectAnimator b = ObjectAnimator.ofInt(mAnimScreen.mContent, "bottom",
+ fromBottom, toBottom);
ObjectAnimator scale = ObjectAnimator.ofFloat(mAnimScreen, "scaleFactor", 1f, scaleFactor);
set.playTogether(animAppear, l, t, r, b, scale);
set.setInterpolator(new DecelerateInterpolator());
@@ -563,7 +530,9 @@
}
private void finishAnimateOut() {
- mNavScreen.setVisibility(View.GONE);
+ if (mNavScreen != null) {
+ mNavScreen.setVisibility(View.GONE);
+ }
mCustomViewContainer.setAlpha(1f);
mCustomViewContainer.setVisibility(View.GONE);
mAnimScreen.set(null);
@@ -582,11 +551,6 @@
}
}
- @Override
- public boolean shouldCaptureThumbnails() {
- return true;
- }
-
static class AnimScreen {
private View mMain;
@@ -615,15 +579,6 @@
mContent.setImageBitmap(viewportBitmap);
}
- /*private Bitmap safeCreateBitmap(int width, int height) {
- if (width <= 0 || height <= 0) {
- Log.w(LOGTAG, "safeCreateBitmap failed! width: " + width
- + ", height: " + height);
- return null;
- }
- return Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
- }*/
-
public void set(Bitmap image) {
mContent.setImageBitmap(image);
}
diff --git a/src/com/android/browser/SiteTileView.java b/src/com/android/browser/SiteTileView.java
index 36f21c9..e22404f 100644
--- a/src/com/android/browser/SiteTileView.java
+++ b/src/com/android/browser/SiteTileView.java
@@ -57,12 +57,12 @@
*/
public class SiteTileView extends View {
- // external configuration constants
- public static final int TYPE_SMALL = 1;
- public static final int TYPE_MEDIUM = 2;
- public static final int TYPE_LARGE = 3;
- private static final int TYPE_AUTO = 0;
- private static final int COLOR_AUTO = 0;
+ // public trust level constants
+ public static final int TRUST_UNKNOWN = 0; // default
+ public static final int TRUST_AVOID = 0x01;
+ public static final int TRUST_UNTRUSTED = 0x02;
+ public static final int TRUST_TRUSTED = 0x04;
+ private static final int TRUST_MASK = 0x07;
// static configuration
@@ -72,8 +72,19 @@
private static final int BACKGROUND_DRAWABLE_RES = R.drawable.img_tile_background;
private static final float FILLER_RADIUS_DP = 2f; // sync with the bg image radius
private static final int FILLER_FALLBACK_COLOR = Color.WHITE; // in case there is no favicon
- private static final int OVERLINE_WIDTH_RES = R.dimen.SiteTileOverline;
- private static final int OVERLINE_COLOR_RES = R.color.SiteTileOverline;
+ private static final int OVERLINE_WIDTH_RES = R.dimen.SiteTileOverlineWidth;
+ private static final int OVERLINE_COLOR_DEFAULT_RES = R.color.SiteTileOverlineUnknown;
+ private static final int OVERLINE_COLOR_TRUSTED_RES = R.color.SiteTileOverlineTrusted;
+ private static final int OVERLINE_COLOR_UNTRUSTED_RES = R.color.SiteTileOverlineUntrusted;
+ private static final int OVERLINE_COLOR_AVOID_RES = R.color.SiteTileOverlineAvoid;
+ private static final boolean SHOW_EXTRAS_BLOCKED_COUNT = true;
+
+ // internal enums
+ private static final int TYPE_SMALL = 1;
+ private static final int TYPE_MEDIUM = 2;
+ private static final int TYPE_LARGE = 3;
+ private static final int TYPE_AUTO = 0;
+ private static final int COLOR_AUTO = 0;
// configuration
@@ -83,6 +94,20 @@
private int mFaviconHeight = 0;
private int mForcedType = TYPE_AUTO;
private int mForcedFundamentalColor = COLOR_AUTO;
+ private boolean mFloating = false;
+ private int mTrustLevel = TRUST_UNKNOWN;
+ private int mExtraBlockedObjectsCount = 0;
+ private boolean mExtrasShown = false;
+
+ // runtime params set on Layout
+ private int mCurrentWidth = 0;
+ private int mCurrentHeight = 0;
+ private int mCurrentType = TYPE_MEDIUM;
+ private int mPaddingLeft = 0;
+ private int mPaddingTop = 0;
+ private int mPaddingRight = 0;
+ private int mPaddingBottom = 0;
+ private boolean mCurrentBackgroundDrawn = false;
// static objects, to be recycled amongst instances (this is an optimization)
private static int sMediumPxThreshold = -1;
@@ -90,6 +115,7 @@
private static int sLargeFaviconPx = -1;
private static float sRoundedRadius = -1;
private static Paint sBitmapPaint = null;
+ private static Paint sExtrasPaint = null;
private static Rect sSrcRect = new Rect();
private static Rect sDstRect = new Rect();
private static RectF sRectF = new RectF();
@@ -97,18 +123,6 @@
private static Drawable sBackgroundDrawable = null;
private static Rect sBackgroundDrawablePadding = new Rect();
- // runtime params set on Layout
- private int mCurrentWidth = 0;
- private int mCurrentHeight = 0;
- private int mCurrentType = TYPE_MEDIUM;
- private boolean mCurrentBackgroundDrawn = false;
- private boolean mFloating = false;
- private int mPaddingLeft = 0;
- private int mPaddingTop = 0;
- private int mPaddingRight = 0;
- private int mPaddingBottom = 0;
-
-
/* XML constructors */
@@ -164,10 +178,47 @@
* @param floating true to disable the background (defaults to false)
*/
public void setFloating(boolean floating) {
- mFloating = floating;
- invalidate();
+ if (mFloating != floating) {
+ mFloating = floating;
+ invalidate();
+ }
}
+ /**
+ * For 'Medium' tiles updates the border and corner badges
+ * @param trustLevel one of the TRUST_ constants
+ */
+ public void setTrustLevel(int trustLevel) {
+ if (mTrustLevel != trustLevel) {
+ mTrustLevel = trustLevel;
+ if (requiresOverline())
+ invalidate();
+ }
+ }
+
+ /**
+ * Sets the number of objects blocked (a positive contribution to the page). Presentation
+ * may or may not have the number indication.
+ * @param sessionCounter Counter of blocked objects. Use 0 to not display anything.
+ */
+ public void setExtraBlockedObjectsCount(int sessionCounter) {
+ if (sessionCounter != mExtraBlockedObjectsCount) {
+ mExtraBlockedObjectsCount = sessionCounter;
+ updateExtrasShown();
+ if (SHOW_EXTRAS_BLOCKED_COUNT)
+ invalidate();
+ }
+ }
+
+ private void updateExtrasShown() {
+ boolean shouldBeShown = mExtraBlockedObjectsCount > 0;
+ if (shouldBeShown != mExtrasShown) {
+ mExtrasShown = shouldBeShown;
+ invalidate();
+ }
+ }
+
+
/**
* @return The fundamental color representing the site.
@@ -198,8 +249,14 @@
mForcedType = TYPE_SMALL;
// check if we want it floating (disable shadow and filler)
- if (a.getBoolean(R.styleable.SiteTileView_floating, false))
- mFloating = true;
+ setFloating(a.getBoolean(R.styleable.SiteTileView_floating, false));
+
+ // read the trust level (unknown, aka 'default', if not present)
+ setTrustLevel(a.getInteger(R.styleable.SiteTileView_trustLevel, TRUST_UNKNOWN)
+ & TRUST_MASK);
+
+ // read the amount of blocked objects (or 0 if not present)
+ setExtraBlockedObjectsCount(a.getInteger(R.styleable.SiteTileView_blockedObjects, 0));
// delete attribute resolution
a.recycle();
@@ -241,14 +298,18 @@
sBitmapPaint.setFilterBitmap(true);
// overline configuration (null if we don't need it)
- int ovlColor = getResources().getColor(OVERLINE_COLOR_RES);
float ovlWidthPx = getResources().getDimension(OVERLINE_WIDTH_RES);
- if (ovlWidthPx > 0.5 && ovlColor != Color.TRANSPARENT) {
+ if (ovlWidthPx > 0.5) {
sOverlineOutlinePaint = new Paint();
- sOverlineOutlinePaint.setColor(ovlColor);
sOverlineOutlinePaint.setStrokeWidth(ovlWidthPx);
sOverlineOutlinePaint.setStyle(Paint.Style.STROKE);
}
+
+ // extras paint (anti-aliased)
+ sExtrasPaint = new Paint();
+ sExtrasPaint.setAntiAlias(true);
+ sExtrasPaint.setColor(getResources().getColor(OVERLINE_COLOR_TRUSTED_RES));
+ sExtrasPaint.setStrokeWidth(Math.max(ovlWidthPx, 1));
}
// change when clicked
@@ -421,10 +482,70 @@
}
// D. (when needed) draw the thin over-line
- boolean requiresOverline = mCurrentType == TYPE_MEDIUM
- && sOverlineOutlinePaint != null;
- if (requiresOverline) {
- canvas.drawRect(left, top, right, bottom, sOverlineOutlinePaint);
+ if (requiresOverline()) {
+ int colorRes;
+ switch (mTrustLevel) {
+ case TRUST_TRUSTED:
+ colorRes = OVERLINE_COLOR_TRUSTED_RES;
+ break;
+ case TRUST_UNTRUSTED:
+ colorRes = OVERLINE_COLOR_UNTRUSTED_RES;
+ break;
+ case TRUST_AVOID:
+ colorRes = OVERLINE_COLOR_AVOID_RES;
+ break;
+ default:
+ colorRes = OVERLINE_COLOR_DEFAULT_RES;
+ break;
+ }
+ int lineColor = getResources().getColor(colorRes);
+ if (lineColor != Color.TRANSPARENT) {
+ // draw the white inline first
+ boolean needSeparation = mTrustLevel != TRUST_UNKNOWN;
+ if (needSeparation) {
+ sOverlineOutlinePaint.setColor(Color.WHITE);
+ float d = sOverlineOutlinePaint.getStrokeWidth();
+ canvas.drawRect(left + d, top + d, right - d, bottom - d, sOverlineOutlinePaint);
+ }
+
+ // then draw the outline
+ sOverlineOutlinePaint.setColor(lineColor);
+ canvas.drawRect(left, top, right, bottom, sOverlineOutlinePaint);
+ }
+ }
+
+ // E. show extra, if requested
+ if (mExtrasShown) {
+ // as default, we show a bubble
+ int eRad = Math.min(2 * contentWidth / 5, sMediumPxThreshold / 4);
+ int eCX = Math.min(right - eRad / 2, mCurrentWidth - eRad); //left + (4 * contentWidth / 5) - eRad;
+ int eCY = Math.min(bottom - eRad / 4, mCurrentHeight - eRad);
+
+ // circle back
+ //canvas.drawCircle(eCX, eCY, eRad, sExtrasPaint);
+
+ // round rect back
+ sRectF.set(eCX - eRad, eCY - eRad, eCX + eRad, eCY + eRad);
+ sExtrasPaint.setStyle(Paint.Style.FILL);
+ sExtrasPaint.setColor(0xff666666);
+ canvas.drawRoundRect(sRectF, eRad / 2, eRad / 2, sExtrasPaint);
+
+ // DEBUG! -- draw blocked count
+ if (SHOW_EXTRAS_BLOCKED_COUNT && mExtraBlockedObjectsCount > 0) {
+ final Paint paint = new Paint();
+ float textSize = eRad * 1.2f;
+ paint.setColor(Color.WHITE);
+ paint.setAntiAlias(true);
+ paint.setTextSize(textSize);
+ String text = String.valueOf(mExtraBlockedObjectsCount);
+ int textWidth = Math.round(paint.measureText(text) / 2);
+ canvas.drawText(text, eCX - textWidth - 1, eCY + textSize / 3 + 1, paint);
+ }
+
+ // round rect stroke
+ sExtrasPaint.setStyle(Paint.Style.STROKE);
+ sExtrasPaint.setColor(0xFFeeeeee);
+ canvas.drawRoundRect(sRectF, eRad / 2, eRad / 2, sExtrasPaint);
}
/*if (true) { // DEBUG TYPE
@@ -435,6 +556,10 @@
}*/
}
+ private boolean requiresOverline() {
+ return mCurrentType == TYPE_MEDIUM && sOverlineOutlinePaint != null && !mFloating;
+ }
+
/**
* Creates a fill Paint from the favicon, or using the forced color (if not COLOR_AUTO)
@@ -499,11 +624,30 @@
* @return Color, but if it's 0, you should discard it (not representative)
*/
private static int sampleColor(Bitmap bitmap, int x, int y) {
- int color = bitmap.getPixel(x, y);
+ final int color = bitmap.getPixel(x, y);
+
// discard semi-transparent pixels, because they're probably from a spurious border
+ //if ((color >>> 24) <= 128)
+ // return 0;
+
+ // compose transparent pixels with white, since the BG will be white anyway
+ final int alpha = Color.alpha(color);
+ if (alpha == 0)
+ return Color.WHITE;
+ if (alpha < 255) {
+ // perform simplified Porter-Duff source-over
+ int dstContribution = 255 - alpha;
+ return Color.argb(255,
+ ((alpha * Color.red(color)) >> 8) + dstContribution,
+ ((alpha * Color.green(color)) >> 8) + dstContribution,
+ ((alpha * Color.blue(color)) >> 8) + dstContribution
+ );
+ }
+
// discard black pixels, because black is not a color (well, not a good looking one)
- if ((color >>> 24) <= 128 || (color & 0xFFFFFF) == 0)
+ if ((color & 0xFFFFFF) == 0)
return 0;
+
return color;
}
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 8aa6995..e446145 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -423,7 +423,6 @@
public void onAnimationEnd(Animator animation) {
mTabs.removeTab(tv);
mTabMap.remove(tab);
- mUi.onRemoveTabCompleted(tab);
}
@Override
@@ -449,7 +448,6 @@
@Override
public void onAnimationEnd(Animator animation) {
- mUi.onAddTabCompleted(tab);
}
@Override
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 254e73d..f4a3f5b 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -21,7 +21,6 @@
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.graphics.drawable.PaintDrawable;
@@ -37,9 +36,6 @@
import android.webkit.WebChromeClient;
import org.codeaurora.swe.WebView;
-import org.codeaurora.swe.util.ColorUtils;
-
-import com.android.browser.R;
import java.util.List;
@@ -82,7 +78,8 @@
public void showComboView(ComboViews startWith, Bundle extras) {
if (mComboView == null) {
- ViewStub stub = (ViewStub) mActivity.getWindow().getDecorView().findViewById(R.id.combo_view_stub);
+ ViewStub stub = (ViewStub) mActivity.getWindow().getDecorView().
+ findViewById(R.id.combo_view_stub);
mComboView = (ComboView) stub.inflate();
mComboView.setVisibility(View.GONE);
mComboView.setupViews(mActivity);
@@ -102,7 +99,7 @@
@Override
public void hideComboView() {
- if (showingComboView()) {
+ if (isComboViewShowing()) {
mComboView.hideViews();
mActionBar = mActivity.getActionBar();
setupActionBar();
@@ -114,30 +111,22 @@
@Override
public boolean onBackKey() {
- if (showingComboView()) {
+ if (isComboViewShowing()) {
hideComboView();
return true;
}
return super.onBackKey();
}
- private boolean showingComboView() {
- return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
- }
-
@Override
public boolean isComboViewShowing() {
- return showingComboView();
- }
-
- private void checkHideActionBar() {
+ return mComboView != null && mComboView.getVisibility() == View.VISIBLE;
}
@Override
public void onResume() {
super.onResume();
mNavBar.clearCompletions();
- checkHideActionBar();
}
@Override
@@ -185,10 +174,6 @@
mTabBar.onNewTab(tab);
}
- protected void onAddTabCompleted(Tab tab) {
- checkHideActionBar();
- }
-
@Override
public void setActiveTab(final Tab tab) {
mTitleBar.cancelTitleBarAnimation(true);
@@ -202,14 +187,11 @@
return;
}
mTabBar.onSetActiveTab(tab);
- updateLockIconToLatest(tab);
- mTitleBar.setSkipTitleBarAnimations(false);
}
@Override
public void updateTabs(List<Tab> tabs) {
mTabBar.updateTabs(tabs);
- checkHideActionBar();
}
@Override
@@ -229,10 +211,6 @@
mActionBar.hide();
}
- protected void onRemoveTabCompleted(Tab tab) {
- checkHideActionBar();
- }
-
int getContentWidth() {
if (mContentView != null) {
return mContentView.getWidth();
@@ -257,7 +235,6 @@
@Override
public void onActionModeFinished(boolean inLoad) {
- checkHideActionBar();
if (inLoad) {
// the titlebar was removed when the CAB was shown
// if the page is loading, show it again
@@ -295,7 +272,6 @@
@Override
public void onHideCustomView() {
super.onHideCustomView();
- checkHideActionBar();
if (mActionBar != null)
mActionBar.show();
}
@@ -328,10 +304,6 @@
return evt.getUnicodeChar() > 0;
}
- TabBar getTabBar() {
- return mTabBar;
- }
-
@Override
public boolean shouldCaptureThumbnails() {
return false;
@@ -363,7 +335,8 @@
d.setLayerInset(1, 2, 2, 2, 2);
return d;
}
- return icon == null ? getGenericFavicon() : new BitmapDrawable(mActivity.getResources(), icon);
+ return icon == null ? getGenericFavicon() :
+ new BitmapDrawable(mActivity.getResources(), icon);
}
}