ModePicker.java revision bed7386688cd7810cba23732ab71f370fe3222ff
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.camera; 18 19import com.android.camera.ui.RotateImageView; 20 21import android.content.Context; 22import android.graphics.PorterDuff; 23import android.graphics.drawable.Drawable; 24import android.util.AttributeSet; 25import android.view.MotionEvent; 26import android.view.View; 27import android.widget.ImageView; 28import android.widget.RelativeLayout; 29 30/** 31 * A widget that includes three mode selections {@code RotateImageView}'s and 32 * a current mode indicator. 33 */ 34public class ModePicker extends RelativeLayout implements View.OnClickListener { 35 public static final int MODE_PANORAMA = 0; 36 public static final int MODE_VIDEO = 1; 37 public static final int MODE_CAMERA = 2; 38 39 /** A callback to be called when the user wants to switch activity. */ 40 public interface OnModeChangeListener { 41 // Returns true if the listener agrees that the mode can be changed. 42 public boolean onModeChanged(int newMode); 43 } 44 45 private final int DISABLED_COLOR; 46 47 private OnModeChangeListener mListener; 48 private View mModeIcons[] = new View[3]; 49 private View mCurrentModeIcon; 50 private View mModeSelection; 51 private int mCurrentMode = MODE_CAMERA; 52 private Context mContext; 53 54 public ModePicker(Context context, AttributeSet attrs) { 55 super(context, attrs); 56 mContext = context; 57 DISABLED_COLOR = context.getResources().getColor(R.color.icon_disabled_color); 58 } 59 60 protected void onFinishInflate() { 61 super.onFinishInflate(); 62 63 mModeSelection = findViewById(R.id.mode_selection); 64 65 mCurrentModeIcon = findViewById(R.id.current_mode); 66 mCurrentModeIcon.setOnClickListener(this); 67 68 mModeIcons[MODE_PANORAMA] = findViewById(R.id.mode_panorama); 69 mModeIcons[MODE_VIDEO] = findViewById(R.id.mode_video); 70 mModeIcons[MODE_CAMERA] = findViewById(R.id.mode_camera); 71 } 72 73 private void enableModeSelection(boolean enabled) { 74 mCurrentModeIcon.setVisibility(enabled ? View.INVISIBLE : View.VISIBLE); 75 mCurrentModeIcon.setOnClickListener(enabled ? null : this); 76 mModeSelection.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE); 77 for (int i = 0; i < 3; ++i) { 78 mModeIcons[i].setOnClickListener(enabled ? this : null); 79 highlightCurrentMode(mModeIcons[i], (i == mCurrentMode)); 80 } 81 } 82 83 public void onClick(View view) { 84 for (int i = 0; i < 3; ++i) { 85 if (view == mModeIcons[i]) { 86 setCurrentMode(i); 87 enableModeSelection(false); 88 return; 89 } 90 } 91 if (view == mCurrentModeIcon) enableModeSelection(true); 92 } 93 94 private void setMode(int mode) { 95 for (int i = 0; i < 3; ++i) mModeIcons[i].setSelected(mode == i); 96 } 97 98 public void setOnModeChangeListener(OnModeChangeListener listener) { 99 mListener = listener; 100 } 101 102 public void setCurrentMode(int mode) { 103 setMode(mode); 104 tryToSetMode(mode); 105 } 106 107 private void tryToSetMode(int mode) { 108 if (mListener != null) { 109 if (!mListener.onModeChanged(mode)) { 110 setMode(mCurrentMode); 111 return; 112 } 113 } 114 ((RotateImageView) mCurrentModeIcon).setImageDrawable( 115 ((RotateImageView) mModeIcons[mode]).getDrawable()); 116 mCurrentMode = mode; 117 } 118 119 public boolean onModeChanged(int mode) { 120 setCurrentMode(mode); 121 return true; 122 } 123 124 public void setDegree(int degree) { 125 for (int i = 0 ; i < 3 ; ++i) { 126 ((RotateImageView) mModeIcons[i]).setDegree(degree); 127 } 128 ((RotateImageView) mCurrentModeIcon).setDegree(degree); 129 } 130 131 @Override 132 public void setEnabled(boolean enabled) { 133 super.setEnabled(enabled); 134 } 135 136 private void highlightCurrentMode(View view, boolean enabled) { 137 Drawable drawable = ((ImageView) view).getDrawable(); 138 if (enabled) { 139 drawable.clearColorFilter(); 140 } else { 141 drawable.setColorFilter(DISABLED_COLOR, PorterDuff.Mode.SRC_ATOP); 142 } 143 } 144 145 public void setEnabled(View view, boolean enabled) { 146 view.setEnabled(enabled); 147 148 // render disabled effect for tablet only. 149 if (!Util.isTabletUI()) return; 150 151 Drawable drawable = ((ImageView) view).getDrawable(); 152 if (enabled) { 153 drawable.clearColorFilter(); 154 } else { 155 drawable.setColorFilter(DISABLED_COLOR, PorterDuff.Mode.SRC_ATOP); 156 } 157 } 158} 159