ModePicker.java revision 0e7b1301af5775c41827b9de0822566a91ea0c4f
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.View; 26import android.widget.ImageView; 27import android.widget.RelativeLayout; 28 29/** 30 * A widget that includes three mode selections {@code RotateImageView}'s and 31 * a current mode indicator. 32 */ 33public class ModePicker extends RelativeLayout implements View.OnClickListener { 34 public static final int MODE_PANORAMA = 0; 35 public static final int MODE_VIDEO = 1; 36 public static final int MODE_CAMERA = 2; 37 38 /** A callback to be called when the user wants to switch activity. */ 39 public interface OnModeChangeListener { 40 // Returns true if the listener agrees that the mode can be changed. 41 public boolean onModeChanged(int newMode); 42 } 43 44 private final int DISABLED_COLOR; 45 46 private OnModeChangeListener mListener; 47 private View mModeIcons[] = new View[3]; 48 private View mCurrentModeIcon; 49 private View mModeSelection; 50 private int mCurrentMode = MODE_CAMERA; 51 private Context mContext; 52 53 public ModePicker(Context context, AttributeSet attrs) { 54 super(context, attrs); 55 mContext = context; 56 DISABLED_COLOR = context.getResources().getColor(R.color.icon_disabled_color); 57 } 58 59 protected void onFinishInflate() { 60 super.onFinishInflate(); 61 62 mModeSelection = findViewById(R.id.mode_selection); 63 64 mCurrentModeIcon = findViewById(R.id.current_mode); 65 mCurrentModeIcon.setOnClickListener(this); 66 67 mModeIcons[MODE_PANORAMA] = findViewById(R.id.mode_panorama); 68 mModeIcons[MODE_VIDEO] = findViewById(R.id.mode_video); 69 mModeIcons[MODE_CAMERA] = findViewById(R.id.mode_camera); 70 } 71 72 private void enableModeSelection(boolean enabled) { 73 mCurrentModeIcon.setVisibility(enabled ? View.GONE : View.VISIBLE); 74 mCurrentModeIcon.setOnClickListener(enabled ? null : this); 75 mModeSelection.setVisibility(enabled ? View.VISIBLE : View.GONE); 76 for (int i = 0; i < 3; ++i) { 77 mModeIcons[i].setOnClickListener(enabled ? this : null); 78 highlightCurrentMode(mModeIcons[i], (i == mCurrentMode)); 79 } 80 } 81 82 public void onClick(View view) { 83 for (int i = 0; i < 3; ++i) { 84 if (view == mModeIcons[i]) { 85 setCurrentMode(i); 86 enableModeSelection(false); 87 return; 88 } 89 } 90 if (view == mCurrentModeIcon) enableModeSelection(true); 91 } 92 93 private void setMode(int mode) { 94 for (int i = 0; i < 3; ++i) mModeIcons[i].setSelected(mode == i); 95 } 96 97 public void setOnModeChangeListener(OnModeChangeListener listener) { 98 mListener = listener; 99 } 100 101 public void setCurrentMode(int mode) { 102 setMode(mode); 103 tryToSetMode(mode); 104 } 105 106 private void tryToSetMode(int mode) { 107 if (mListener != null) { 108 if (!mListener.onModeChanged(mode)) { 109 setMode(mCurrentMode); 110 return; 111 } 112 } 113 ((RotateImageView) mCurrentModeIcon).setImageDrawable( 114 ((RotateImageView) mModeIcons[mode]).getDrawable()); 115 mCurrentMode = mode; 116 } 117 118 public boolean onModeChanged(int mode) { 119 setCurrentMode(mode); 120 return true; 121 } 122 123 public void setDegree(int degree) { 124 for (int i = 0 ; i < 3 ; ++i) { 125 ((RotateImageView) mModeIcons[i]).setDegree(degree); 126 } 127 ((RotateImageView) mCurrentModeIcon).setDegree(degree); 128 } 129 130 @Override 131 public void setEnabled(boolean enabled) { 132 super.setEnabled(enabled); 133 } 134 135 private void highlightCurrentMode(View view, boolean enabled) { 136 Drawable drawable = ((ImageView) view).getDrawable(); 137 if (enabled) { 138 drawable.clearColorFilter(); 139 } else { 140 drawable.setColorFilter(DISABLED_COLOR, PorterDuff.Mode.SRC_ATOP); 141 } 142 } 143 144 public void setEnabled(View view, boolean enabled) { 145 view.setEnabled(enabled); 146 147 // render disabled effect for tablet only. 148 if (!Util.isTabletUI()) return; 149 150 Drawable drawable = ((ImageView) view).getDrawable(); 151 if (enabled) { 152 drawable.clearColorFilter(); 153 } else { 154 drawable.setColorFilter(DISABLED_COLOR, PorterDuff.Mode.SRC_ATOP); 155 } 156 } 157} 158