CameraSwitcher.java revision da04f24a205d92c72c32d7768f0d3b4b1f93512d
1d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb/*
2d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb * Copyright (C) 2012 The Android Open Source Project
3d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb *
4d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License");
5d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb * you may not use this file except in compliance with the License.
6d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb * You may obtain a copy of the License at
7d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb *
8d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb *      http://www.apache.org/licenses/LICENSE-2.0
9d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb *
10d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb * Unless required by applicable law or agreed to in writing, software
11d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS,
12d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb * See the License for the specific language governing permissions and
14d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb * limitations under the License.
15d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb */
16d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
17d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolbpackage com.android.camera.ui;
18d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
19d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolbimport android.content.Context;
20d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolbimport android.util.AttributeSet;
21a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolbimport android.view.LayoutInflater;
225da800f7a1427066a310a41964d780924c1f1a10Michael Kolbimport android.view.MotionEvent;
23d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolbimport android.view.View;
24a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolbimport android.view.View.OnClickListener;
25a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolbimport android.view.View.OnTouchListener;
26d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolbimport android.view.ViewGroup;
27d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolbimport android.widget.LinearLayout;
28d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
29a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolbimport com.android.camera.R;
30d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
31a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolbpublic class CameraSwitcher extends RotateImageView
32a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        implements OnClickListener, OnTouchListener {
33d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
34a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    private static final String TAG = "CAM_Switcher";
35d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
36d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    public interface CameraSwitchListener {
37d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
38d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb        public void onCameraSelected(int i);
39d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    }
40d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
41d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    private CameraSwitchListener mListener;
42a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    private int mCurrentIndex;
43a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    private int[] mDrawIds;
44a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    private int mItemSize;
45a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    private View mPopup;
46a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    private View mParent;
47d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
48d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    public CameraSwitcher(Context context) {
49d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb        super(context);
50d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb        init(context);
51d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    }
52d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
53d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    public CameraSwitcher(Context context, AttributeSet attrs) {
54d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb        super(context, attrs);
55d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb        init(context);
56d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    }
57d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
58d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    private void init(Context context) {
59a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        mItemSize = context.getResources().getDimensionPixelSize(R.dimen.switcher_size);
60a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        setOnClickListener(this);
61d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    }
62d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
63a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    public void setDrawIds(int[] drawids) {
64a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        mDrawIds = drawids;
65df0dca9dd26b95a424a5712f16a43413a3e8ebe1Michael Kolb    }
66df0dca9dd26b95a424a5712f16a43413a3e8ebe1Michael Kolb
67a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    public void setCurrentIndex(int i) {
68a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        mCurrentIndex = i;
69a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        setImageResource(mDrawIds[i]);
70d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    }
71d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
72d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    public void setSwitchListener(CameraSwitchListener l) {
73d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb        mListener = l;
74d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    }
75d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
76a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    @Override
77a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    public void onClick(View v) {
78a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        showSwitcher();
791da18852b3cddf3e2f288636a9ef9d8d002f496bJohn Reck    }
801da18852b3cddf3e2f288636a9ef9d8d002f496bJohn Reck
81a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    private void onCameraSelected(int ix) {
82a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        hidePopup();
83a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        if ((ix != mCurrentIndex) && (mListener != null)) {
84a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            setCurrentIndex(ix);
85a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            mListener.onCameraSelected(ix);
861da18852b3cddf3e2f288636a9ef9d8d002f496bJohn Reck        }
87d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    }
88d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
89a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    private void initPopup() {
90a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        mParent = LayoutInflater.from(getContext()).inflate(R.layout.switcher_popup,
91a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb                (ViewGroup) getParent());
92a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        LinearLayout content = (LinearLayout) mParent.findViewById(R.id.content);
93a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        mPopup = content;
94a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        mPopup.setVisibility(View.GONE);
95b1be74d6833cd55429cc5c34885eddf613d08302Doris Liu        for (int i = mDrawIds.length - 1; i >= 0; i--) {
96a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            RotateImageView item = new RotateImageView(getContext());
97a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            item.setImageResource(mDrawIds[i]);
98da04f24a205d92c72c32d7768f0d3b4b1f93512dMichael Kolb            item.setBackgroundResource(R.drawable.bg_pressed);
99a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            final int index = i;
100a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            item.setOnClickListener(new OnClickListener() {
101a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb                @Override
102a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb                public void onClick(View v) {
103a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb                    onCameraSelected(index);
104a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb                }
105a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            });
106a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            content.addView(item, new LinearLayout.LayoutParams(mItemSize, mItemSize));
107d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb        }
108d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    }
109d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
110a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    public boolean showsPopup() {
111a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        return (mPopup != null) && (mPopup.getVisibility() == View.VISIBLE);
112d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    }
113d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
114a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    public boolean isInsidePopup(MotionEvent evt) {
115a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        if (mPopup == null) return false;
116a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        return (mPopup.getVisibility() == View.VISIBLE && evt.getX() >= mPopup.getLeft()
117a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb                && evt.getX() < mPopup.getRight() && evt.getY() >= mPopup.getTop()
118a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb                && evt.getY() < mPopup.getBottom());
11978711c990e57ce7c6228c5446cfb6902f2a47cb6Doris Liu    }
12078711c990e57ce7c6228c5446cfb6902f2a47cb6Doris Liu
121a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    private void hidePopup() {
122a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        if (mPopup != null) {
123a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            mPopup.setVisibility(View.GONE);
124a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            setVisibility(View.VISIBLE);
125d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb        }
126a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        mParent.setOnTouchListener(null);
127d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    }
128d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
129a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    private void showSwitcher() {
130a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        if (mPopup == null) {
131a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            initPopup();
132a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        }
133a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        setVisibility(View.GONE);
134a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        mPopup.setVisibility(View.VISIBLE);
135a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        mParent.setOnTouchListener(this);
1368566e6d534634965a53b536571008bad882b969dMichael Kolb    }
1378566e6d534634965a53b536571008bad882b969dMichael Kolb
1388566e6d534634965a53b536571008bad882b969dMichael Kolb    @Override
139a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    public boolean onTouch(View v, MotionEvent event) {
140a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        if (showsPopup()) {
141a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            hidePopup();
142d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb        }
143a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        return true;
144d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    }
145d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb
146a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    @Override
147a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb    public void setOrientation(int degree, boolean animate) {
148a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        super.setOrientation(degree, animate);
149a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        ViewGroup content = (ViewGroup) mPopup;
150a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        if (content == null) return;
151a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb        for (int i = 0; i < content.getChildCount(); i++) {
152a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            RotateImageView iv = (RotateImageView) content.getChildAt(i);
153a5e23d9eb2bc96e7da4c021df2e11c1c43d379cdMichael Kolb            iv.setOrientation(degree, animate);
154d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb        }
155d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb    }
156d3a252bb71d119cbaeff55aeaa27dd1f8adadba2Michael Kolb}
157