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