diff options
-rw-r--r-- | res/layout/custom_screen.xml | 1 | ||||
-rw-r--r-- | res/layout/nav_tab_view.xml | 2 | ||||
-rw-r--r-- | res/values/dimensions.xml | 1 | ||||
-rw-r--r-- | src/com/android/browser/BrowserWebView.java | 18 | ||||
-rw-r--r-- | src/com/android/browser/Controller.java | 18 | ||||
-rw-r--r-- | src/com/android/browser/NavScreen.java | 102 | ||||
-rw-r--r-- | src/com/android/browser/PhoneUi.java | 18 | ||||
-rw-r--r-- | src/com/android/browser/UiController.java | 2 |
8 files changed, 130 insertions, 32 deletions
diff --git a/res/layout/custom_screen.xml b/res/layout/custom_screen.xml index 525f30c..2105501 100644 --- a/res/layout/custom_screen.xml +++ b/res/layout/custom_screen.xml @@ -37,3 +37,4 @@ /> </LinearLayout> </FrameLayout> + diff --git a/res/layout/nav_tab_view.xml b/res/layout/nav_tab_view.xml index 439eb89..f657f4f 100644 --- a/res/layout/nav_tab_view.xml +++ b/res/layout/nav_tab_view.xml @@ -18,7 +18,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tab_view" android:layout_width="wrap_content" - android:layout_height="wrap_content" + android:layout_height="match_parent" android:orientation="vertical" android:padding="4dip" android:focusable="false" diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml index 5b962d8..28b9e8b 100644 --- a/res/values/dimensions.xml +++ b/res/values/dimensions.xml @@ -67,4 +67,5 @@ <dimen name="nav_tab_spacing">8dp</dimen> <dimen name="menu_width">240dip</dimen> <dimen name="toolbar_height">52dip</dimen> + <dimen name="tab_capture_size">480dp</dimen> </resources> diff --git a/src/com/android/browser/BrowserWebView.java b/src/com/android/browser/BrowserWebView.java index 9be9ad9..a1d8c2d 100644 --- a/src/com/android/browser/BrowserWebView.java +++ b/src/com/android/browser/BrowserWebView.java @@ -36,6 +36,7 @@ public class BrowserWebView extends WebView implements Runnable { private boolean mBackgroundRemoved = false; private boolean mUserInitiated = false; private TitleBarBase mTitleBar; + private int mCaptureSize; private Bitmap mCapture; /** @@ -57,6 +58,7 @@ public class BrowserWebView extends WebView implements Runnable { public BrowserWebView( Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) { super(context, attrs, defStyle, privateBrowsing); + init(); } /** @@ -65,6 +67,7 @@ public class BrowserWebView extends WebView implements Runnable { */ public BrowserWebView(Context context, AttributeSet attrs) { super(context, attrs); + init(); } /** @@ -72,12 +75,13 @@ public class BrowserWebView extends WebView implements Runnable { */ public BrowserWebView(Context context) { super(context); + init(); } - @Override - protected void onSizeChanged(int w, int h, int ow, int oh) { - super.onSizeChanged(w, h, ow, oh); - mCapture = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + private void init() { + mCaptureSize = mContext.getResources().getDimensionPixelSize(R.dimen.tab_capture_size); + mCapture = Bitmap.createBitmap(mCaptureSize, mCaptureSize, + Bitmap.Config.RGB_565); } @Override @@ -150,7 +154,11 @@ public class BrowserWebView extends WebView implements Runnable { protected Bitmap capture() { if (mCapture == null) return null; Canvas c = new Canvas(mCapture); - c.translate(-getScrollX(), -(getScrollY() + getVisibleTitleHeight())); + final int left = getScrollX(); + final int top = getScrollY() + getVisibleTitleHeight(); + c.translate(-left, -top); + float scale = mCaptureSize / (float) Math.max(getWidth(), getHeight()); + c.scale(scale, scale, left, top); onDraw(c); return mCapture; } diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java index 5498d6d..d1e1b0a 100644 --- a/src/com/android/browser/Controller.java +++ b/src/com/android/browser/Controller.java @@ -97,6 +97,7 @@ public class Controller private static final String LOGTAG = "Controller"; private static final String SEND_APP_ID_EXTRA = "android.speech.extras.SEND_APPLICATION_ID_EXTRA"; + private static final String INCOGNITO_URI = "browser:incognito"; // public message ids @@ -2222,7 +2223,6 @@ public class Controller } } - // This method does a ton of stuff. It will attempt to create a new tab // if we haven't reached MAX_TABS. Otherwise it uses the current tab. If // url isn't null, it will load the given url. @@ -2261,7 +2261,21 @@ public class Controller null, true); addTab(tab); setActiveTab(tab); - loadUrlDataIn(tab, new UrlData("browser:incognito")); + loadUrlDataIn(tab, new UrlData(INCOGNITO_URI)); + return tab; + } else { + mUi.showMaxTabsWarning(); + return null; + } + } + + @Override + public Tab createNewTab(String url, boolean incognito) { + if (mTabControl.canCreateNewTab()) { + Tab tab = mTabControl.createNewTab(false, null, null, incognito); + WebView w = tab.getWebView(); + addTab(tab); + loadUrl(w, (incognito ? INCOGNITO_URI : url)); return tab; } else { mUi.showMaxTabsWarning(); diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java index 1a25671..848b7b1 100644 --- a/src/com/android/browser/NavScreen.java +++ b/src/com/android/browser/NavScreen.java @@ -18,7 +18,9 @@ package com.android.browser; import android.app.Activity; import android.content.Context; +import android.content.res.Configuration; import android.graphics.Bitmap; +import android.graphics.Matrix; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -31,9 +33,11 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.BaseAdapter; import android.widget.FrameLayout; +import android.widget.FrameLayout.LayoutParams; import android.widget.Gallery; import android.widget.ImageButton; import android.widget.ImageView; +import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; import android.widget.ListPopupWindow; import android.widget.TextView; @@ -60,27 +64,34 @@ public class NavScreen extends LinearLayout implements OnClickListener { FrameLayout mHolder; Gallery mFlipper; + float mTabAspect = 0.66f; int mTabWidth; int mTabHeight; TabAdapter mAdapter; ListPopupWindow mPopup; + int mOrientation; public NavScreen(Activity activity, UiController ctl, PhoneUi ui) { super(activity); mActivity = activity; mUiController = ctl; mUi = ui; + mOrientation = activity.getResources().getConfiguration().orientation; init(); } - protected Tab getSelectedTab() { - return (Tab) mFlipper.getSelectedItem(); + @Override + public void onMeasure(int wspec, int hspec) { + super.onMeasure(wspec, hspec); + mTabHeight = mFlipper.getMeasuredHeight(); + mTabWidth = (int) (mTabHeight * mTabAspect); + if (mAdapter != null) { + mAdapter.notifyDataSetChanged(); + } } - protected void setTabDimensions(int w, int h) { - mTabWidth = w; - mTabHeight = h; - requestLayout(); + protected Tab getSelectedTab() { + return (Tab) mFlipper.getSelectedItem(); } protected void showMenu() { @@ -110,6 +121,18 @@ public class NavScreen extends LinearLayout implements OnClickListener { } } + // for configuration changes + @Override + protected void onConfigurationChanged(Configuration newconfig) { + if (newconfig.orientation != mOrientation) { + int selIx = mFlipper.getSelectedItemPosition(); + removeAllViews(); + init(); + mFlipper.setSelection(selIx); + mOrientation = newconfig.orientation; + } + } + private void init() { LayoutInflater.from(mContext).inflate(R.layout.nav_screen, this); LinearLayout content = (LinearLayout) findViewById(R.id.nav_screen); @@ -136,6 +159,7 @@ public class NavScreen extends LinearLayout implements OnClickListener { mFlipper = new TabGallery(mContext); mFlipper.setSpacing((int)(mContext.getResources() .getDimension(R.dimen.nav_tab_spacing))); + mFlipper.setUnselectedAlpha(0.8f); mFlipper.setLayoutParams(lp); mHolder.addView(mFlipper, 0); mAdapter = new TabAdapter(mContext, mUiController.getTabControl()); @@ -192,24 +216,25 @@ public class NavScreen extends LinearLayout implements OnClickListener { if (web != null) { if (mBack == v) { mUi.hideNavScreen(true); + switchToSelected(); web.goBack(); } else if (mForward == v) { mUi.hideNavScreen(true); + switchToSelected(); web.goForward(); } else if (mRefresh == v) { mUi.hideNavScreen(true); + switchToSelected(); web.reload(); } } if (mBookmarks == v) { mUi.hideNavScreen(false); + switchToSelected(); mUiController.bookmarksOrHistoryPicker(false); } else if (mTabs == v) { - mUi.hideNavScreen(false); - mUi.showActiveTabsPage(); } else if (mNewTab == v) { - mUi.hideNavScreen(true); - mUiController.openTabToHomePage(); + openNewTab(); } else if (mMore == v) { showMenu(); } else if (mNewIncognito == v) { @@ -218,18 +243,52 @@ public class NavScreen extends LinearLayout implements OnClickListener { } } - protected void close() { - close(true); + private void openNewTab() { + Tab tab = mUiController.createNewTab( + BrowserSettings.getInstance().getHomePage(), + false); + mAdapter.notifyDataSetChanged(); + + if (tab != null) { + // set tab as the selected in flipper, then hide + final int tix = mUi.mTabControl.getTabIndex(tab); + post(new Runnable() { + public void run() { + if (tix != -1) { + for (int i = mFlipper.getSelectedItemPosition(); + i <= tix; i++) { + mFlipper.setSelection(i, true); + mFlipper.invalidate(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + mUi.hideNavScreen(true); + switchToSelected(); + } + }); + } } - protected void close(boolean animate) { - mUi.hideNavScreen(animate); + private void switchToSelected() { Tab tab = (Tab) mFlipper.getSelectedItem(); if (tab != mUi.getActiveTab()) { mUiController.setActiveTab(tab); } } + protected void close() { + close(true); + } + + protected void close(boolean animate) { + mUi.hideNavScreen(animate); + switchToSelected(); + } + class TabGallery extends Gallery { public TabGallery(Context ctx) { @@ -296,6 +355,7 @@ public class NavScreen extends LinearLayout implements OnClickListener { content.setLayoutParams(new LayoutParams(mTabWidth, mTabHeight)); } else { content = (ImageView) convertView.findViewById(R.id.content); + content.setLayoutParams(new LayoutParams(mTabWidth, mTabHeight)); } View tbar = convertView.findViewById(R.id.titlebar); TextView title = (TextView) convertView.findViewById(R.id.title); @@ -304,8 +364,20 @@ public class NavScreen extends LinearLayout implements OnClickListener { final Tab tab = getItem(position); icon.setImageDrawable(mUi.getFaviconDrawable(tab.getFavicon())); title.setText(tab.getUrl()); + content.setScaleType(ScaleType.MATRIX); + Matrix matrix = new Matrix(); Bitmap screen = tab.getScreenshot(); - content.setImageBitmap(screen); + if (screen != null) { + float scale = 1.0f; + if (mTabWidth > mTabHeight) { + scale = mTabWidth / (float) screen.getWidth(); + } else { + scale = mTabHeight / (float) screen.getHeight(); + } + matrix.setScale(scale, scale); + content.setImageMatrix(matrix); + content.setImageBitmap(screen); + } close.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java index 13a5257..e838cd4 100644 --- a/src/com/android/browser/PhoneUi.java +++ b/src/com/android/browser/PhoneUi.java @@ -285,12 +285,14 @@ public class PhoneUi extends BaseUi { @Override protected void captureTab(final Tab tab) { + if (tab == null) return; if (mUseQuickControls) { super.captureTab(tab); } else { - captureTab(tab, - mActivity.getWindowManager().getDefaultDisplay().getWidth(), - mActivity.getWindowManager().getDefaultDisplay().getHeight()); + BrowserWebView web = (BrowserWebView) tab.getWebView(); + if (web != null) { + tab.setScreenshot(web.capture()); + } } } @@ -301,11 +303,8 @@ public class PhoneUi extends BaseUi { float yoffset = 0; WebView web = getWebView(); if (web != null) { - int w = web.getWidth(); - int h = web.getHeight(); - yoffset = mNavScreen.getToolbarHeight() - web.getVisibleTitleHeight(); - mNavScreen.setTabDimensions((int) (w * NAV_TAB_SCALE), - (int) (h * NAV_TAB_SCALE)); + yoffset = mNavScreen.getToolbarHeight() - + web.getVisibleTitleHeight(); } // Add the custom view to its container. mCustomViewContainer.addView(mNavScreen, COVER_SCREEN_GRAVITY_CENTER); @@ -366,7 +365,8 @@ public class PhoneUi extends BaseUi { float yoffset = 0; WebView web = mNavScreen.getSelectedTab().getWebView(); if (web != null) { - yoffset = mNavScreen.getToolbarHeight() - web.getVisibleTitleHeight(); + yoffset = mNavScreen.getToolbarHeight() - + web.getVisibleTitleHeight(); } ObjectAnimator animx = ObjectAnimator.ofFloat(mNavScreen, "scaleX", 1.0f, 1 / NAV_TAB_SCALE); diff --git a/src/com/android/browser/UiController.java b/src/com/android/browser/UiController.java index 2b3ee69..9b75aca 100644 --- a/src/com/android/browser/UiController.java +++ b/src/com/android/browser/UiController.java @@ -44,6 +44,8 @@ public interface UiController extends BookmarksHistoryCallbacks { Tab openIncognitoTab(); + Tab createNewTab(String url, boolean incognito); + void setActiveTab(Tab tab); boolean switchToTab(int tabIndex); |