1adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang/*
2adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * Copyright (C) 2011 The Android Open Source Project
3adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang *
4adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * Licensed under the Apache License, Version 2.0 (the "License");
5adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * you may not use this file except in compliance with the License.
6adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * You may obtain a copy of the License at
7adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang *
8adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang *      http://www.apache.org/licenses/LICENSE-2.0
9adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang *
10adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * Unless required by applicable law or agreed to in writing, software
11adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * distributed under the License is distributed on an "AS IS" BASIS,
12adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * See the License for the specific language governing permissions and
14adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * limitations under the License.
15adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang */
16adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
17adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangpackage com.android.camera.ui;
18adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
19adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport com.android.camera.R;
20adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
21adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport android.content.Context;
22ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wangimport android.os.Handler;
23adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport android.util.AttributeSet;
24adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport android.view.View;
25ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wangimport android.widget.ImageView;
26adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport android.widget.RelativeLayout;
27adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
28adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang/**
29adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * A view that contains camera zoom control which could adjust the zoom in/out
30adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * if the camera supports zooming.
31adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang */
323ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huangpublic abstract class ZoomControl extends RelativeLayout implements Rotatable {
33b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    // The states of zoom button.
34b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    public static final int ZOOM_IN = 0;
35b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    public static final int ZOOM_OUT = 1;
36b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    public static final int ZOOM_STOP = 2;
37adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
38b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    private static final String TAG = "ZoomControl";
39b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    private static final int ZOOMING_INTERVAL = 1000; // milliseconds
40ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang
41ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang    protected ImageView mZoomIn;
42ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang    protected ImageView mZoomOut;
43ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang    protected ImageView mZoomSlider;
443ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang    protected int mOrientation;
45b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    private Handler mHandler;
46ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang
47adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    public interface OnZoomChangedListener {
48adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        void onZoomValueChanged(int index);  // only for immediate zoom
49adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        void onZoomStateChanged(int state);  // only for smooth zoom
50adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
51adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
52d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang    // The interface OnZoomIndexChangedListener is used to inform the
53d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang    // ZoomIndexBar about the zoom index change. The index position is between
54d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang    // 0 (the index is zero) and 1.0 (the index is mZoomMax).
55d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang    public interface OnZoomIndexChangedListener {
56d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang        void onZoomIndexChanged(double indexPosition);
57d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang    }
58d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang
59ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang    protected int mZoomMax, mZoomIndex;
60adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    private boolean mSmoothZoomSupported;
61adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    private OnZoomChangedListener mListener;
62d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang    private OnZoomIndexChangedListener mIndexListener;
63adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
64adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    protected OnIndicatorEventListener mOnIndicatorEventListener;
65b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    private int mState;
66b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    private int mStep;
67adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
68ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang    protected final Runnable mRunnable = new Runnable() {
69ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang        public void run() {
70b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang            performZoom(mState, false);
71ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang        }
72ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang    };
73ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang
74adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    public ZoomControl(Context context, AttributeSet attrs) {
75adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        super(context, attrs);
76606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang        mZoomIn = addImageView(context, R.drawable.ic_zoom_in);
77606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang        mZoomSlider = addImageView(context, R.drawable.ic_zoom_slider);
78606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang        mZoomOut = addImageView(context, R.drawable.ic_zoom_out);
79ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang        mHandler = new Handler();
80ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang    }
81adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
82ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang    public void startZoomControl() {
83ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang        mZoomSlider.setPressed(true);
84d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang        setZoomIndex(mZoomIndex); // Update the zoom index bar.
85adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
86adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
87ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang    protected ImageView addImageView(Context context, int iconResourceId) {
88ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang        ImageView image = new RotateImageView(context);
89ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang        image.setImageResource(iconResourceId);
9026d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang        if (iconResourceId == R.drawable.ic_zoom_slider) {
9126d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang            image.setContentDescription(getResources().getString(
9226d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang                    R.string.accessibility_zoom_control));
9326d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang        } else {
9426d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang            image.setContentDescription(getResources().getString(
9526d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang                    R.string.empty));
9626d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang        }
97ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang        addView(image);
98ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang        return image;
99adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
100adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
101ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang    public void closeZoomControl() {
102ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang        mZoomSlider.setPressed(false);
103ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang        stopZooming();
104b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        if (!mSmoothZoomSupported) mHandler.removeCallbacks(mRunnable);
105b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        if (mOnIndicatorEventListener != null) {
106b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang            mOnIndicatorEventListener.onIndicatorEvent(
107b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang                    OnIndicatorEventListener.EVENT_LEAVE_ZOOM_CONTROL);
108b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        }
109ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang    }
110ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang
111ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang    public void setZoomMax(int zoomMax) {
112ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang        mZoomMax = zoomMax;
113606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang
114606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang        // Layout should be requested as the maximum zoom level is the key to
115606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang        // show the correct zoom slider position.
116606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang        requestLayout();
117adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
118adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
119adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    public void setOnZoomChangeListener(OnZoomChangedListener listener) {
120adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        mListener = listener;
121adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
122adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
123adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    public void setOnIndicatorEventListener(OnIndicatorEventListener listener) {
124adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        mOnIndicatorEventListener = listener;
125adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
126adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
127adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    public void setZoomIndex(int index) {
128adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        if (index < 0 || index > mZoomMax) {
129adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang            throw new IllegalArgumentException("Invalid zoom value:" + index);
130adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        }
131adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        mZoomIndex = index;
132ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang        invalidate();
133adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
134adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
135adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    public void setSmoothZoomSupported(boolean smoothZoomSupported) {
136adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        mSmoothZoomSupported = smoothZoomSupported;
137adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
138adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
139b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    private boolean zoomIn() {
140b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        return (mZoomIndex == mZoomMax) ? false : changeZoomIndex(mZoomIndex + mStep);
141b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    }
142b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang
143b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    private boolean zoomOut() {
144b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        return (mZoomIndex == 0) ? false : changeZoomIndex(mZoomIndex - mStep);
145adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
146adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
147b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    protected void setZoomStep(int step) {
148b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        mStep = step;
149adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
150adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
151b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    private void stopZooming() {
152adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        if (mSmoothZoomSupported) {
153adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang            if (mListener != null) mListener.onZoomStateChanged(ZOOM_STOP);
154adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        }
155adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
156adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
157b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    // Called from ZoomControlWheel to change the zoom level.
158b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    // TODO: merge the zoom control for both platforms.
159b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    protected void performZoom(int state) {
160b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        performZoom(state, true);
161b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    }
162b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang
163b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    private void performZoom(int state, boolean fromUser) {
164b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        if ((mState == state) && fromUser) return;
165b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        if (fromUser) mHandler.removeCallbacks(mRunnable);
166b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        mState = state;
167b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        switch (state) {
168b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang            case ZOOM_IN:
169b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang                zoomIn();
170b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang                break;
171b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang            case ZOOM_OUT:
172b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang                zoomOut();
173b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang                break;
174b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang            case ZOOM_STOP:
175b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang                stopZooming();
176b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang                break;
177b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        }
178b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        if (!mSmoothZoomSupported) {
179b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang            // Repeat the zoom action on tablet as the user is still holding
180b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang            // the zoom slider.
181b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang            mHandler.postDelayed(mRunnable, ZOOMING_INTERVAL / mZoomMax);
182b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        }
183b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    }
184b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang
185b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    // Called from ZoomControlBar to change the zoom level.
186b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang    protected void performZoom(double zoomPercentage) {
187b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        int index = (int) (mZoomMax * zoomPercentage);
188b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        if (mZoomIndex == index) return;
189b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang        changeZoomIndex(index);
190b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang   }
191b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang
192adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    private boolean changeZoomIndex(int index) {
193adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        if (mListener != null) {
194adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang            if (mSmoothZoomSupported) {
195b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang                int zoomType = (index < mZoomIndex) ? ZOOM_OUT : ZOOM_IN;
196adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang                if (((zoomType == ZOOM_IN) && (mZoomIndex != mZoomMax)) ||
197adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang                        ((zoomType == ZOOM_OUT) && (mZoomIndex != 0))) {
198adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang                    mListener.onZoomStateChanged(zoomType);
199adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang                }
200adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang            } else {
201b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang                if (index > mZoomMax) index = mZoomMax;
202b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang                if (index < 0) index = 0;
203b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang                mListener.onZoomValueChanged(index);
204175d7d64e2990e92eb1609f8f706b6f568b22800Wu-cheng Li                mZoomIndex = index;
205adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang            }
206adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        }
207adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        return true;
208adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
209adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang
2103ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang    public void setOrientation(int orientation) {
2113ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang        mOrientation = orientation;
212adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        int count = getChildCount();
213adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        for (int i = 0 ; i < count ; ++i) {
214adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang            View view = getChildAt(i);
215adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang            if (view instanceof RotateImageView) {
2163ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang                ((RotateImageView) view).setOrientation(orientation);
217adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang            }
218adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang        }
219adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang    }
220606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang
221606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang    @Override
222606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang    public void setActivated(boolean activated) {
223606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang        super.setActivated(activated);
224606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang        mZoomIn.setActivated(activated);
225606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang        mZoomOut.setActivated(activated);
226606093cd434a89f5ca941d3a6d6e8470eb768c67Chung-yih Wang    }
227adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang}
228