diff options
7 files changed, 174 insertions, 45 deletions
diff --git a/chrome/android/java_staging/res/layout/hosted_toolbar.xml b/chrome/android/java_staging/res/layout/hosted_toolbar.xml index eb7f908..6c2bd7e 100644 --- a/chrome/android/java_staging/res/layout/hosted_toolbar.xml +++ b/chrome/android/java_staging/res/layout/hosted_toolbar.xml @@ -19,18 +19,43 @@ android:alpha="0" android:visibility="gone" android:contentDescription="@string/accessibility_toolbar_btn_security_lock" /> - <include - android:id="@+id/url_container" + <FrameLayout + android:id="@+id/url_info_container" + android:background="@null" android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_marginTop="3dp" - android:layout_marginBottom="3dp" - android:layout_gravity="center_vertical" - layout="@layout/url_container" - /> + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" > + <TextView + android:id="@+id/title_bar" + android:background="@null" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="16dp" + android:layout_gravity="top" + android:maxLines="1" + android:paddingEnd="@dimen/toolbar_edge_padding" + android:textSize="@dimen/hosted_title_text_size" + android:inputType="none" /> + <org.chromium.chrome.browser.omnibox.UrlBar + android:id="@+id/url_bar" + android:background="@null" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity ="bottom" + android:maxLines="1" + android:paddingEnd="@dimen/toolbar_edge_padding" + android:textSize="@dimen/hosted_url_text_size" + android:inputType="none" /> + </FrameLayout> <ImageButton android:id="@+id/action_button" style="@style/ToolbarButton" + android:layout_width="wrap_content" + android:maxWidth="@dimen/hosted_toolbar_maxWidth" + android:paddingTop="@dimen/hosted_toolbar_vertical_padding" + android:paddingBottom="@dimen/hosted_toolbar_vertical_padding" + android:adjustViewBounds="true" + android:scaleType="centerInside" android:layout_marginEnd="42dp" android:layout_gravity="center_vertical|end" android:visibility="gone" diff --git a/chrome/android/java_staging/res/values/dimens_staging.xml b/chrome/android/java_staging/res/values/dimens_staging.xml index beb720c..63817e2 100644 --- a/chrome/android/java_staging/res/values/dimens_staging.xml +++ b/chrome/android/java_staging/res/values/dimens_staging.xml @@ -145,4 +145,12 @@ <dimen name="enhanced_bookmark_list_mode_background_margin">10dp</dimen> <dimen name="enhanced_bookmark_drawer_drawable_padding">18dp</dimen> + <!-- Hosted Mode dimensions --> + <dimen name="hosted_toolbar_maxWidth">60dp</dimen> + <dimen name="hosted_toolbar_vertical_padding">16dp</dimen> + <dimen name="toolbar_icon_height">24dp</dimen> + <dimen name="min_toolbar_icon_side_padding">6dp</dimen> + <dimen name="hosted_url_text_size">12sp</dimen> + <dimen name="hosted_title_text_size">16sp</dimen> + </resources> diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/hosted/HostedIntentDataProvider.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/hosted/HostedIntentDataProvider.java index d062186..927b2ad 100644 --- a/chrome/android/java_staging/src/org/chromium/chrome/browser/hosted/HostedIntentDataProvider.java +++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/hosted/HostedIntentDataProvider.java @@ -123,8 +123,13 @@ public class HostedIntentDataProvider { intent, EXTRA_HOSTED_ACTION_BUTTON_BUNDLE); if (actionButtonBundle != null) { mIcon = IntentUtils.safeGetParcelable(actionButtonBundle, KEY_HOSTED_ICON); - mActionButtonPendingIntent = IntentUtils.safeGetParcelable( - actionButtonBundle, KEY_HOSTED_PENDING_INTENT); + if (!checkBitmapSizeWithinBounds(context, mIcon)) { + mIcon.recycle(); + mIcon = null; + } else { + mActionButtonPendingIntent = IntentUtils.safeGetParcelable( + actionButtonBundle, KEY_HOSTED_PENDING_INTENT); + } } List<Bundle> menuItems = IntentUtils.getParcelableArrayListExtra( @@ -274,4 +279,12 @@ public class HostedIntentDataProvider { Log.e(TAG, "CanceledException while sending pending intent in hosted mode"); } } + + private boolean checkBitmapSizeWithinBounds(Context context, Bitmap bitmap) { + int height = context.getResources().getDimensionPixelSize(R.dimen.toolbar_icon_height); + if (bitmap.getHeight() < height) return false; + int scaledWidth = bitmap.getWidth() / bitmap.getHeight() * height; + if (scaledWidth > 2 * height) return false; + return true; + } } diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBar.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBar.java index 1280c6c..90bf1c8 100644 --- a/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBar.java +++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBar.java @@ -58,6 +58,11 @@ public interface LocationBar extends UrlBarDelegate { void setUrlToPageUrl(); /** + * Sets the displayed title to the page title. + */ + void setTitleToPageTitle(); + + /** * Update the visuals based on a loading state change. * @param updateUrl Whether to update the URL as a result of the this call. */ diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index 0ba64c3..3219045 100644 --- a/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java @@ -2391,4 +2391,7 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener, public View getContainerView() { return this; } + + @Override + public void setTitleToPageTitle() { } } diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/HostedToolbar.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/HostedToolbar.java index 7677010..c6001f4 100644 --- a/chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/HostedToolbar.java +++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/HostedToolbar.java @@ -9,10 +9,13 @@ import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; +import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.text.TextUtils; +import android.text.TextUtils.TruncateAt; import android.util.AttributeSet; import android.util.Pair; import android.view.KeyEvent; @@ -20,12 +23,15 @@ import android.view.MotionEvent; import android.view.View; import android.widget.ImageButton; import android.widget.ImageView; +import android.widget.TextView; import com.google.android.apps.chrome.R; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.browser.ContextualMenuBar.ActionBarDelegate; import org.chromium.chrome.browser.CustomSelectionActionModeCallback; +import org.chromium.chrome.browser.Tab; +import org.chromium.chrome.browser.WebsiteSettingsPopup; import org.chromium.chrome.browser.WindowDelegate; import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper; import org.chromium.chrome.browser.document.BrandColorUtils; @@ -36,7 +42,6 @@ import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.omnibox.LocationBar; import org.chromium.chrome.browser.omnibox.LocationBarLayout; import org.chromium.chrome.browser.omnibox.UrlBar; -import org.chromium.chrome.browser.omnibox.UrlContainer; import org.chromium.chrome.browser.omnibox.UrlFocusChangeListener; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.ssl.ConnectionSecurityHelperSecurityLevel; @@ -50,12 +55,13 @@ import org.chromium.ui.base.WindowAndroid; * The Toolbar layout to be used for hosted mode. This is used for both phone and tablet UIs. */ public class HostedToolbar extends ToolbarLayout implements LocationBar { + private View mUrlInfoContainer; private UrlBar mUrlBar; + private TextView mTitleBar; private ImageView mSecurityButton; private ImageButton mCustomActionButton; private int mSecurityIconType; private boolean mUseDarkColors; - private UrlContainer mUrlContainer; private TintedImageButton mBackButton; private Animator mSecurityButtonShowAnimator; private boolean mBackgroundColorSet; @@ -75,7 +81,8 @@ public class HostedToolbar extends ToolbarLayout implements LocationBar { mUrlBar.setHint(""); mUrlBar.setDelegate(this); mUrlBar.setEnabled(false); - mUrlContainer = (UrlContainer) findViewById(R.id.url_container); + mTitleBar = (TextView) findViewById(R.id.title_bar); + mUrlInfoContainer = findViewById(R.id.url_info_container); mSecurityButton = (ImageButton) findViewById(R.id.security_button); mSecurityIconType = ConnectionSecurityHelperSecurityLevel.NONE; mCustomActionButton = (ImageButton) findViewById(R.id.action_button); @@ -93,12 +100,42 @@ public class HostedToolbar extends ToolbarLayout implements LocationBar { } @Override + public void onNativeLibraryReady() { + super.onNativeLibraryReady(); + mSecurityButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + Tab currentTab = getToolbarDataProvider().getTab(); + if (currentTab == null || currentTab.getWebContents() == null) return; + + WebsiteSettingsPopup.show(getContext(), currentTab.getProfile(), + currentTab.getWebContents()); + } + }); + } + + @Override public void setHostedBackClickHandler(OnClickListener listener) { mBackButton.setOnClickListener(listener); } @Override public void addCustomActionButton(Bitmap buttonSource, OnClickListener listener) { + Resources resources = getResources(); + + // The height will be scaled to match spec while keeping the aspect ratio, so get the scaled + // width through that. + int sourceHeight = buttonSource.getHeight(); + int sourceScaledHeight = resources.getDimensionPixelSize(R.dimen.toolbar_icon_height); + int sourceWidth = buttonSource.getWidth(); + int sourceScaledWidth = sourceWidth * sourceScaledHeight / sourceHeight; + int minPadding = resources.getDimensionPixelSize(R.dimen.min_toolbar_icon_side_padding); + + int sidePadding = Math.max((2 * sourceScaledHeight - sourceScaledWidth) / 2, minPadding); + int topPadding = mCustomActionButton.getPaddingTop(); + int bottomPadding = mCustomActionButton.getPaddingBottom(); + mCustomActionButton.setPadding(sidePadding, topPadding, sidePadding, bottomPadding); + mCustomActionButton.setImageDrawable(new BitmapDrawable(getResources(), buttonSource)); mCustomActionButton.setOnClickListener(listener); mCustomActionButton.setVisibility(VISIBLE); @@ -126,9 +163,25 @@ public class HostedToolbar extends ToolbarLayout implements LocationBar { } @Override + public void setTitleToPageTitle() { + Tab currentTab = getToolbarDataProvider().getTab(); + if (currentTab == null || TextUtils.isEmpty(currentTab.getTitle())) { + mTitleBar.setText(""); + return; + } + mTitleBar.setText(currentTab.getTitle()); + } + + @Override + protected void onNavigatedToDifferentPage() { + super.onNavigatedToDifferentPage(); + mTitleBar.setText(""); + } + + @Override public void setUrlToPageUrl() { if (getCurrentTab() == null) { - mUrlContainer.setUrlText(null, null, ""); + mUrlBar.setUrl("", null); return; } @@ -136,13 +189,12 @@ public class HostedToolbar extends ToolbarLayout implements LocationBar { if (NativePageFactory.isNativePageUrl(url, getCurrentTab().isIncognito())) { // Don't show anything for Chrome URLs. - mUrlContainer.setUrlText(null, null, ""); + mUrlBar.setUrl("", null); return; } String displayText = getToolbarDataProvider().getText(); Pair<String, String> urlText = LocationBarLayout.splitPathFromUrlDisplayText(displayText); displayText = urlText.first; - String path = urlText.second; if (DomDistillerUrlUtils.isDistilledPage(url)) { if (isStoredArticle(url)) { @@ -160,7 +212,7 @@ public class HostedToolbar extends ToolbarLayout implements LocationBar { } } - if (mUrlContainer.setUrlText(displayText, path, url)) { + if (mUrlBar.setUrl(url, displayText)) { mUrlBar.deEmphasizeUrl(); mUrlBar.emphasizeUrl(); } @@ -182,12 +234,17 @@ public class HostedToolbar extends ToolbarLayout implements LocationBar { @Override public void updateVisualsForState() { + Resources resources = getResources(); updateSecurityIcon(getSecurityLevel()); - ColorStateList colorStateList = getResources().getColorStateList(mUseDarkColors + ColorStateList colorStateList = resources.getColorStateList(mUseDarkColors ? R.color.dark_mode_tint : R.color.light_mode_tint); mMenuButton.setTint(colorStateList); mBackButton.setTint(colorStateList); - mUrlContainer.setUseDarkTextColors(mUseDarkColors); + mUrlBar.setUseDarkTextColors(mUseDarkColors); + + int titleTextColor = mUseDarkColors ? resources.getColor(R.color.url_emphasis_default_text) + : resources.getColor(R.color.url_emphasis_light_default_text); + mTitleBar.setTextColor(titleTextColor); if (getProgressBar() != null) { int progressBarResource = !mUseDarkColors @@ -223,6 +280,13 @@ public class HostedToolbar extends ToolbarLayout implements LocationBar { } @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + setTitleToPageTitle(); + setUrlToPageUrl(); + } + + @Override public ColorDrawable getBackground() { return (ColorDrawable) super.getBackground(); } @@ -274,18 +338,6 @@ public class HostedToolbar extends ToolbarLayout implements LocationBar { } @Override - protected void onNavigatedToDifferentPage() { - super.onNavigatedToDifferentPage(); - mUrlContainer.setTrailingTextVisible(true); - } - - @Override - public void setLoadProgress(int progress) { - super.setLoadProgress(progress); - if (progress == 100) mUrlContainer.setTrailingTextVisible(false); - } - - @Override public View getContainerView() { return this; } @@ -297,7 +349,7 @@ public class HostedToolbar extends ToolbarLayout implements LocationBar { private void updateLayoutParams() { int startMargin = 0; - int urlContainerChildIndex = -1; + int urlInfoContainerChildIndex = -1; for (int i = 0; i < getChildCount(); i++) { View childView = getChildAt(i); if (childView.getVisibility() != GONE) { @@ -306,8 +358,8 @@ public class HostedToolbar extends ToolbarLayout implements LocationBar { ApiCompatibilityUtils.setMarginStart(childLayoutParams, startMargin); childView.setLayoutParams(childLayoutParams); } - if (childView == mUrlContainer) { - urlContainerChildIndex = i; + if (childView == mUrlInfoContainer) { + urlInfoContainerChildIndex = i; break; } int widthMeasureSpec; @@ -337,19 +389,19 @@ public class HostedToolbar extends ToolbarLayout implements LocationBar { } } - assert urlContainerChildIndex != -1; - int urlContainerMarginEnd = 0; - for (int i = urlContainerChildIndex + 1; i < getChildCount(); i++) { + assert urlInfoContainerChildIndex != -1; + int urlInfoContainerMarginEnd = 0; + for (int i = urlInfoContainerChildIndex + 1; i < getChildCount(); i++) { View childView = getChildAt(i); if (childView.getVisibility() != GONE) { - urlContainerMarginEnd += childView.getMeasuredWidth(); + urlInfoContainerMarginEnd += childView.getMeasuredWidth(); } } - LayoutParams urlLayoutParams = (LayoutParams) mUrlContainer.getLayoutParams(); + LayoutParams urlLayoutParams = (LayoutParams) mUrlInfoContainer.getLayoutParams(); - if (ApiCompatibilityUtils.getMarginEnd(urlLayoutParams) != urlContainerMarginEnd) { - ApiCompatibilityUtils.setMarginEnd(urlLayoutParams, urlContainerMarginEnd); - mUrlContainer.setLayoutParams(urlLayoutParams); + if (ApiCompatibilityUtils.getMarginEnd(urlLayoutParams) != urlInfoContainerMarginEnd) { + ApiCompatibilityUtils.setMarginEnd(urlLayoutParams, urlInfoContainerMarginEnd); + mUrlInfoContainer.setLayoutParams(urlLayoutParams); } } @@ -364,12 +416,30 @@ public class HostedToolbar extends ToolbarLayout implements LocationBar { return this; } + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + if (changed) { + final int availWidth = mUrlInfoContainer.getMeasuredWidth() + - mTitleBar.getPaddingEnd() - mTitleBar.getPaddingStart(); + String currentText = mTitleBar.getText().toString(); + String currentTitle; + Tab currentTab = getToolbarDataProvider().getTab(); + if (currentTab == null || TextUtils.isEmpty(currentTab.getTitle())) { + currentTitle = ""; + } else { + currentTitle = currentTab.getTitle(); + } + String ellipsizedText = TextUtils.ellipsize(currentTitle, + mTitleBar.getPaint(), availWidth, TruncateAt.END).toString(); + if (!ellipsizedText.equals(currentText)) mTitleBar.setText(ellipsizedText); + } + super.onLayout(changed, left, top, right, bottom); + } + // Toolbar and LocationBar calls that are not relevant here. @Override - public void setToolbarDataProvider(ToolbarDataProvider model) { - assert model.equals(getToolbarDataProvider()); - } + public void setToolbarDataProvider(ToolbarDataProvider model) { } @Override public void onUrlPreFocusChanged(boolean gainFocus) { diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index 28f9b9f..6df7ded 100644 --- a/chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java @@ -241,6 +241,11 @@ class ToolbarManager implements ToolbarTabController, UrlFocusChangeListener { } @Override + public void onTitleUpdated(Tab tab) { + mLocationBar.setTitleToPageTitle(); + } + + @Override public void onUrlUpdated(Tab tab) { // Update the SSL security state as a result of this notification as it will // sometimes be the only update we receive. |