190b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger/* 290b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * Copyright (C) 2010 The Android Open Source Project 390b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * 490b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * Licensed under the Apache License, Version 2.0 (the "License"); 590b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * you may not use this file except in compliance with the License. 690b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * You may obtain a copy of the License at 790b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * 890b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * http://www.apache.org/licenses/LICENSE-2.0 990b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * 1090b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * Unless required by applicable law or agreed to in writing, software 1190b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * distributed under the License is distributed on an "AS IS" BASIS, 1290b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1390b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * See the License for the specific language governing permissions and 1490b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger * limitations under the License. 1590b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger */ 1690b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenbergerpackage android.webkit; 1790b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 1890b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenbergerimport android.view.Gravity; 1990b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenbergerimport android.view.View; 2090b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenbergerimport android.view.ViewGroup; 2190b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenbergerimport android.widget.FrameLayout; 2290b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenbergerimport android.widget.Toast; 2390b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenbergerimport android.widget.ZoomButtonsController; 2490b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 2590b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenbergerclass ZoomControlEmbedded implements ZoomControlBase { 2690b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 2790b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger private final ZoomManager mZoomManager; 283c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon private final WebViewClassic mWebView; 2990b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 3090b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger // The controller is lazily initialized in getControls() for performance. 3190b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger private ZoomButtonsController mZoomButtonsController; 3290b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 333c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon public ZoomControlEmbedded(ZoomManager zoomManager, WebViewClassic webView) { 3490b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger mZoomManager = zoomManager; 3590b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger mWebView = webView; 3690b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 3790b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 3890b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger public void show() { 39369aca27ec44274d9e70e91513914fa2564c6aefDerek Sollenberger if (!getControls().isVisible() && !mZoomManager.isZoomScaleFixed()) { 4090b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 4190b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger mZoomButtonsController.setVisible(true); 4290b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 43515f6d8db3f02eaa010eee78c504c71d1a2d6a7aDerek Sollenberger if (mZoomManager.isDoubleTapEnabled()) { 443c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon WebSettingsClassic settings = mWebView.getSettings(); 45515f6d8db3f02eaa010eee78c504c71d1a2d6a7aDerek Sollenberger int count = settings.getDoubleTapToastCount(); 46515f6d8db3f02eaa010eee78c504c71d1a2d6a7aDerek Sollenberger if (mZoomManager.isInZoomOverview() && count > 0) { 47515f6d8db3f02eaa010eee78c504c71d1a2d6a7aDerek Sollenberger settings.setDoubleTapToastCount(--count); 48515f6d8db3f02eaa010eee78c504c71d1a2d6a7aDerek Sollenberger Toast.makeText(mWebView.getContext(), 49515f6d8db3f02eaa010eee78c504c71d1a2d6a7aDerek Sollenberger com.android.internal.R.string.double_tap_toast, 50515f6d8db3f02eaa010eee78c504c71d1a2d6a7aDerek Sollenberger Toast.LENGTH_LONG).show(); 51515f6d8db3f02eaa010eee78c504c71d1a2d6a7aDerek Sollenberger } 5290b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 5390b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 5490b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 5590b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 5690b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger public void hide() { 5790b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger if (mZoomButtonsController != null) { 5890b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger mZoomButtonsController.setVisible(false); 5990b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 6090b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 6190b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 6290b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger public boolean isVisible() { 6390b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger return mZoomButtonsController != null && mZoomButtonsController.isVisible(); 6490b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 6590b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 6690b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger public void update() { 6790b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger if (mZoomButtonsController == null) { 6890b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger return; 6990b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 7090b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 71af39e4b8022c5ac66faf441c38a71387ca20b300Derek Sollenberger boolean canZoomIn = mZoomManager.canZoomIn(); 7215c5ddb7fd6357ea8ba2cccb18284137b8113401Derek Sollenberger boolean canZoomOut = mZoomManager.canZoomOut() && !mZoomManager.isInZoomOverview(); 7390b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger if (!canZoomIn && !canZoomOut) { 7490b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger // Hide the zoom in and out buttons if the page cannot zoom 7590b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger mZoomButtonsController.getZoomControls().setVisibility(View.GONE); 7690b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } else { 7790b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger // Set each one individually, as a page may be able to zoom in or out 7890b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger mZoomButtonsController.setZoomInEnabled(canZoomIn); 7990b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger mZoomButtonsController.setZoomOutEnabled(canZoomOut); 8090b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 8190b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 8290b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 8390b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger private ZoomButtonsController getControls() { 8490b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger if (mZoomButtonsController == null) { 853c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon mZoomButtonsController = new ZoomButtonsController(mWebView.getWebView()); 8690b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger mZoomButtonsController.setOnZoomListener(new ZoomListener()); 8790b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger // ZoomButtonsController positions the buttons at the bottom, but in 8890b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger // the middle. Change their layout parameters so they appear on the 8990b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger // right. 9090b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger View controls = mZoomButtonsController.getZoomControls(); 9190b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger ViewGroup.LayoutParams params = controls.getLayoutParams(); 9290b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger if (params instanceof FrameLayout.LayoutParams) { 93aac0d4ed026d1cfbcf3fa81c6e4eb96f4347ca17Fabrice Di Meglio ((FrameLayout.LayoutParams) params).gravity = Gravity.END; 9490b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 9590b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 9690b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger return mZoomButtonsController; 9790b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 9890b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 9990b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger private class ZoomListener implements ZoomButtonsController.OnZoomListener { 10090b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 10190b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger public void onVisibilityChanged(boolean visible) { 10290b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger if (visible) { 10390b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger mWebView.switchOutDrawHistory(); 10490b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger // Bring back the hidden zoom controls. 10590b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger mZoomButtonsController.getZoomControls().setVisibility(View.VISIBLE); 10690b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger update(); 10790b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 10890b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 10990b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger 11090b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger public void onZoom(boolean zoomIn) { 11190b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger if (zoomIn) { 11290b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger mWebView.zoomIn(); 11390b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } else { 11490b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger mWebView.zoomOut(); 11590b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 11690b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger update(); 11790b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 11890b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger } 11990b6e4879304c6ac8240cdeb9a4aea94a27cda58Derek Sollenberger} 120