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