1a72d73cbac59db43d413291e4db66763be08143arepo sync/* 2a72d73cbac59db43d413291e4db66763be08143arepo sync * Copyright (C) 2011 The Android Open Source Project 3a72d73cbac59db43d413291e4db66763be08143arepo sync * 4a72d73cbac59db43d413291e4db66763be08143arepo sync * Licensed under the Apache License, Version 2.0 (the "License"); 5a72d73cbac59db43d413291e4db66763be08143arepo sync * you may not use this file except in compliance with the License. 6a72d73cbac59db43d413291e4db66763be08143arepo sync * You may obtain a copy of the License at 7a72d73cbac59db43d413291e4db66763be08143arepo sync * 8a72d73cbac59db43d413291e4db66763be08143arepo sync * http://www.apache.org/licenses/LICENSE-2.0 9a72d73cbac59db43d413291e4db66763be08143arepo sync * 10a72d73cbac59db43d413291e4db66763be08143arepo sync * Unless required by applicable law or agreed to in writing, software 11a72d73cbac59db43d413291e4db66763be08143arepo sync * distributed under the License is distributed on an "AS IS" BASIS, 12a72d73cbac59db43d413291e4db66763be08143arepo sync * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a72d73cbac59db43d413291e4db66763be08143arepo sync * See the License for the specific language governing permissions and 14a72d73cbac59db43d413291e4db66763be08143arepo sync * limitations under the License. 15a72d73cbac59db43d413291e4db66763be08143arepo sync */ 16a72d73cbac59db43d413291e4db66763be08143arepo sync 17a72d73cbac59db43d413291e4db66763be08143arepo syncpackage com.android.camera; 18a72d73cbac59db43d413291e4db66763be08143arepo sync 195f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wangimport com.android.camera.ui.PopupManager; 203ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huangimport com.android.camera.ui.Rotatable; 21a72d73cbac59db43d413291e4db66763be08143arepo syncimport com.android.camera.ui.RotateImageView; 22a72d73cbac59db43d413291e4db66763be08143arepo sync 23a72d73cbac59db43d413291e4db66763be08143arepo syncimport android.content.Context; 24a72d73cbac59db43d413291e4db66763be08143arepo syncimport android.graphics.PorterDuff; 25a72d73cbac59db43d413291e4db66763be08143arepo syncimport android.graphics.drawable.Drawable; 26a72d73cbac59db43d413291e4db66763be08143arepo syncimport android.util.AttributeSet; 2746f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wangimport android.util.Log; 28a72d73cbac59db43d413291e4db66763be08143arepo syncimport android.view.View; 2920ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wangimport android.view.animation.Animation; 3020ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wangimport android.view.animation.Animation.AnimationListener; 3120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wangimport android.view.animation.AnimationUtils; 32a72d73cbac59db43d413291e4db66763be08143arepo syncimport android.widget.ImageView; 33a72d73cbac59db43d413291e4db66763be08143arepo syncimport android.widget.RelativeLayout; 34a72d73cbac59db43d413291e4db66763be08143arepo sync 35a72d73cbac59db43d413291e4db66763be08143arepo sync/** 36a72d73cbac59db43d413291e4db66763be08143arepo sync * A widget that includes three mode selections {@code RotateImageView}'s and 37a72d73cbac59db43d413291e4db66763be08143arepo sync * a current mode indicator. 38a72d73cbac59db43d413291e4db66763be08143arepo sync */ 395f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wangpublic class ModePicker extends RelativeLayout implements View.OnClickListener, 403ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang PopupManager.OnOtherPopupShowedListener, Rotatable { 4120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang public static final int MODE_CAMERA = 0; 42a72d73cbac59db43d413291e4db66763be08143arepo sync public static final int MODE_VIDEO = 1; 4320ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang public static final int MODE_PANORAMA = 2; 44a72d73cbac59db43d413291e4db66763be08143arepo sync 4546f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang private static final String TAG = "ModePicker"; 463ea573b7823efd6b8a19f4d6535ae61af0ae0b3cChih-yu Huang // Total mode number 473ea573b7823efd6b8a19f4d6535ae61af0ae0b3cChih-yu Huang private static final int MODE_NUM = 3; 483ea573b7823efd6b8a19f4d6535ae61af0ae0b3cChih-yu Huang 49a72d73cbac59db43d413291e4db66763be08143arepo sync /** A callback to be called when the user wants to switch activity. */ 50a72d73cbac59db43d413291e4db66763be08143arepo sync public interface OnModeChangeListener { 51a72d73cbac59db43d413291e4db66763be08143arepo sync // Returns true if the listener agrees that the mode can be changed. 52a72d73cbac59db43d413291e4db66763be08143arepo sync public boolean onModeChanged(int newMode); 53a72d73cbac59db43d413291e4db66763be08143arepo sync } 54a72d73cbac59db43d413291e4db66763be08143arepo sync 55a72d73cbac59db43d413291e4db66763be08143arepo sync private final int DISABLED_COLOR; 563ea573b7823efd6b8a19f4d6535ae61af0ae0b3cChih-yu Huang private final int CURRENT_MODE_BACKGROUND; 57a72d73cbac59db43d413291e4db66763be08143arepo sync 58a72d73cbac59db43d413291e4db66763be08143arepo sync private OnModeChangeListener mListener; 5920ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang private View mModeSelectionFrame; 6020ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang private RotateImageView mModeSelectionIcon[]; 6120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang private View mCurrentModeFrame; 6220ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang private RotateImageView mCurrentModeIcon[]; 6320ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang private View mCurrentModeBar; 645f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang private boolean mSelectionEnabled; 655f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang 6620ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang 673cd761b5888b54683e63db051ca9f38606dc1eccWu-cheng Li private int mCurrentMode = 0; 6820ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang private Animation mFadeIn, mFadeOut; 69a72d73cbac59db43d413291e4db66763be08143arepo sync 70a72d73cbac59db43d413291e4db66763be08143arepo sync public ModePicker(Context context, AttributeSet attrs) { 71a72d73cbac59db43d413291e4db66763be08143arepo sync super(context, attrs); 72a72d73cbac59db43d413291e4db66763be08143arepo sync DISABLED_COLOR = context.getResources().getColor(R.color.icon_disabled_color); 733ea573b7823efd6b8a19f4d6535ae61af0ae0b3cChih-yu Huang CURRENT_MODE_BACKGROUND = R.drawable.btn_mode_background; 7420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mFadeIn = AnimationUtils.loadAnimation( 7520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang context, R.anim.mode_selection_fade_in); 7620ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mFadeOut = AnimationUtils.loadAnimation( 7720ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang context, R.anim.mode_selection_fade_out); 7820ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mFadeOut.setAnimationListener(mAnimationListener); 795f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang PopupManager.getInstance(context).setOnOtherPopupShowedListener(this); 80a72d73cbac59db43d413291e4db66763be08143arepo sync } 81a72d73cbac59db43d413291e4db66763be08143arepo sync 82a72d73cbac59db43d413291e4db66763be08143arepo sync protected void onFinishInflate() { 83a72d73cbac59db43d413291e4db66763be08143arepo sync super.onFinishInflate(); 84a72d73cbac59db43d413291e4db66763be08143arepo sync 8520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mModeSelectionFrame = findViewById(R.id.mode_selection); 8620ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mModeSelectionIcon = new RotateImageView[MODE_NUM]; 8720ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mModeSelectionIcon[MODE_PANORAMA] = 8820ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang (RotateImageView) findViewById(R.id.mode_panorama); 8920ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mModeSelectionIcon[MODE_VIDEO] = 9020ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang (RotateImageView) findViewById(R.id.mode_video); 9120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mModeSelectionIcon[MODE_CAMERA] = 9220ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang (RotateImageView) findViewById(R.id.mode_camera); 93a72d73cbac59db43d413291e4db66763be08143arepo sync 9420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang // The current mode frame is for Phone UI only. 9520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mCurrentModeFrame = findViewById(R.id.current_mode); 9620ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (mCurrentModeFrame != null) { 9720ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mCurrentModeIcon = new RotateImageView[MODE_NUM]; 9820ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mCurrentModeIcon[0] = (RotateImageView) findViewById(R.id.mode_0); 9920ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mCurrentModeIcon[1] = (RotateImageView) findViewById(R.id.mode_1); 10020ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mCurrentModeIcon[2] = (RotateImageView) findViewById(R.id.mode_2); 10120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } else { 10220ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang // current_mode_bar is only for tablet. 10320ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mCurrentModeBar = findViewById(R.id.current_mode_bar); 10420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang enableModeSelection(true); 10520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 10646f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang registerOnClickListener(); 10746f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang } 10846f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang 10946f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang private void registerOnClickListener() { 11046f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang if (mCurrentModeFrame != null) { 11146f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang mCurrentModeFrame.setOnClickListener(this); 11246f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang } 11346f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang for (int i = 0; i < MODE_NUM; ++i) { 11446f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang mModeSelectionIcon[i].setOnClickListener(this); 11546f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang } 116a72d73cbac59db43d413291e4db66763be08143arepo sync } 117a72d73cbac59db43d413291e4db66763be08143arepo sync 1185f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang @Override 1195f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang public void onOtherPopupShowed() { 1205f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang if (mSelectionEnabled) enableModeSelection(false); 1215f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang } 1225f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang 12320ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang private AnimationListener mAnimationListener = new AnimationListener() { 12420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang public void onAnimationEnd(Animation animation) { 12520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang changeToSelectedMode(); 12620ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mCurrentModeFrame.setVisibility(View.VISIBLE); 12720ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mModeSelectionFrame.setVisibility(View.GONE); 12820ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 12920ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang 13020ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang public void onAnimationRepeat(Animation animation) { 13120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 13220ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang 13320ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang public void onAnimationStart(Animation animation) { 13420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 13520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang }; 13620ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang 137a72d73cbac59db43d413291e4db66763be08143arepo sync private void enableModeSelection(boolean enabled) { 13820ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (mCurrentModeFrame != null) { 1395f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang mSelectionEnabled = enabled; 14020ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang // Animation Effect is applied on Phone UI only. 14120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mModeSelectionFrame.startAnimation(enabled ? mFadeIn : mFadeOut); 14220ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (enabled) { 14320ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mModeSelectionFrame.setVisibility(View.VISIBLE); 14420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mCurrentModeFrame.setVisibility(View.GONE); 14520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 146a72d73cbac59db43d413291e4db66763be08143arepo sync } 14720ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang updateModeState(); 148a72d73cbac59db43d413291e4db66763be08143arepo sync } 149a72d73cbac59db43d413291e4db66763be08143arepo sync 15020ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang private void changeToSelectedMode() { 15146f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang if (mListener != null) { 15246f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang if (mListener.onModeChanged(mCurrentMode)) { 15346f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang Log.e(TAG, "failed:onModeChanged:" + mCurrentMode); 154a72d73cbac59db43d413291e4db66763be08143arepo sync } 155a72d73cbac59db43d413291e4db66763be08143arepo sync } 15620ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 15720ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang 15820ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang public void onClick(View view) { 15920ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (view == mCurrentModeFrame) { 1605f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang PopupManager.getInstance(getContext()).notifyShowPopup(this); 16120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang enableModeSelection(true); 16220ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } else { 16346f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang // Set the selected mode as the current one and switch to it. 16446f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang for (int i = 0; i < MODE_NUM; ++i) { 16546f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang if (view == mModeSelectionIcon[i] && (mCurrentMode != i)) { 16646f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang setCurrentMode(i); 16746f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang break; 16846f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang } 16946f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang } 17020ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (mCurrentModeBar == null) { 17120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang enableModeSelection(false); 17220ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } else { 17320ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang changeToSelectedMode(); 17420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 17520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 176a72d73cbac59db43d413291e4db66763be08143arepo sync } 177a72d73cbac59db43d413291e4db66763be08143arepo sync 178a72d73cbac59db43d413291e4db66763be08143arepo sync public void setOnModeChangeListener(OnModeChangeListener listener) { 179a72d73cbac59db43d413291e4db66763be08143arepo sync mListener = listener; 180a72d73cbac59db43d413291e4db66763be08143arepo sync } 181a72d73cbac59db43d413291e4db66763be08143arepo sync 182a72d73cbac59db43d413291e4db66763be08143arepo sync public void setCurrentMode(int mode) { 183a72d73cbac59db43d413291e4db66763be08143arepo sync mCurrentMode = mode; 18446f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang updateModeState(); 185a72d73cbac59db43d413291e4db66763be08143arepo sync } 186a72d73cbac59db43d413291e4db66763be08143arepo sync 187a72d73cbac59db43d413291e4db66763be08143arepo sync public boolean onModeChanged(int mode) { 188a72d73cbac59db43d413291e4db66763be08143arepo sync setCurrentMode(mode); 189a72d73cbac59db43d413291e4db66763be08143arepo sync return true; 190a72d73cbac59db43d413291e4db66763be08143arepo sync } 191a72d73cbac59db43d413291e4db66763be08143arepo sync 1923ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang public void setOrientation(int orientation) { 1933ea573b7823efd6b8a19f4d6535ae61af0ae0b3cChih-yu Huang for (int i = 0; i < MODE_NUM; ++i) { 1943ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang mModeSelectionIcon[i].setOrientation(orientation); 19520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (mCurrentModeFrame != null) { 1963ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang mCurrentModeIcon[i].setOrientation(orientation); 19720ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 198a72d73cbac59db43d413291e4db66763be08143arepo sync } 199a72d73cbac59db43d413291e4db66763be08143arepo sync } 200a72d73cbac59db43d413291e4db66763be08143arepo sync 201a72d73cbac59db43d413291e4db66763be08143arepo sync @Override 202a72d73cbac59db43d413291e4db66763be08143arepo sync public void setEnabled(boolean enabled) { 203a72d73cbac59db43d413291e4db66763be08143arepo sync super.setEnabled(enabled); 204a72d73cbac59db43d413291e4db66763be08143arepo sync 20520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang // Enable or disable the frames. 20620ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (mCurrentModeFrame != null) mCurrentModeFrame.setEnabled(enabled); 20720ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mModeSelectionFrame.setEnabled(enabled); 208a72d73cbac59db43d413291e4db66763be08143arepo sync 20920ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang // Enable or disable the icons. 2103ea573b7823efd6b8a19f4d6535ae61af0ae0b3cChih-yu Huang for (int i = 0; i < MODE_NUM; ++i) { 21120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mModeSelectionIcon[i].setEnabled(enabled); 21220ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (mCurrentModeFrame != null) mCurrentModeIcon[i].setEnabled(enabled); 2133ea573b7823efd6b8a19f4d6535ae61af0ae0b3cChih-yu Huang } 21420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (enabled) updateModeState(); 2153ea573b7823efd6b8a19f4d6535ae61af0ae0b3cChih-yu Huang } 216a72d73cbac59db43d413291e4db66763be08143arepo sync 21746f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang private void highlightView(ImageView view, boolean enabled) { 218a72d73cbac59db43d413291e4db66763be08143arepo sync if (enabled) { 21946f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang view.clearColorFilter(); 220a72d73cbac59db43d413291e4db66763be08143arepo sync } else { 22146f4430b50ba8ca8b04b698d45d9ca2d4513121dChung-yih Wang view.setColorFilter(DISABLED_COLOR, PorterDuff.Mode.SRC_ATOP); 222a72d73cbac59db43d413291e4db66763be08143arepo sync } 22320ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 22420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang 22520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang private void updateModeState() { 226da705aa1c8cbaaba105d9bc7799aef95c416a459Chih-Chung Chang // Grey-out the unselected icons for Phone UI. 227da705aa1c8cbaaba105d9bc7799aef95c416a459Chih-Chung Chang if (mCurrentModeFrame != null) { 228da705aa1c8cbaaba105d9bc7799aef95c416a459Chih-Chung Chang for (int i = 0; i < MODE_NUM; ++i) { 229da705aa1c8cbaaba105d9bc7799aef95c416a459Chih-Chung Chang highlightView(mModeSelectionIcon[i], (i == mCurrentMode)); 230da705aa1c8cbaaba105d9bc7799aef95c416a459Chih-Chung Chang } 23120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 232da705aa1c8cbaaba105d9bc7799aef95c416a459Chih-Chung Chang 23320ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang // Update the current mode icons on the Phone UI. The selected mode 23420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang // should be in the center of the current mode icon bar. 23520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (mCurrentModeFrame != null) { 23620ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang for (int i = 0, j = 0; i < MODE_NUM; ++i) { 23720ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang int target; 23820ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (i == 1) { 23920ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang // The second icon is always the selected mode. 24020ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang target = mCurrentMode; 24120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } else { 24220ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang // Set the icons in order of camera, video and panorama. 24320ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (j == mCurrentMode) j++; 24420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang target = j++; 24520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 24620ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mCurrentModeIcon[i].setImageDrawable( 24720ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mModeSelectionIcon[target].getDrawable()); 24820ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 24920ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 25020ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 25120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang 25220ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang @Override 25320ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang protected void onLayout( 25420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang boolean changed, int left, int top, int right, int bottom) { 25520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang super.onLayout(changed, left, top, right, bottom); 25620ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang // Layout the current mode indicator bar. 25720ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang if (mCurrentModeBar != null) { 25820ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang int viewWidth = mModeSelectionIcon[MODE_CAMERA].getWidth(); 25920ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang int iconWidth = ((ImageView) mModeSelectionIcon[MODE_CAMERA]) 26020ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang .getDrawable().getIntrinsicWidth(); 26120ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang int padding = (viewWidth - iconWidth) / 2; 26220ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang int l = mModeSelectionFrame.getLeft() + mCurrentMode * viewWidth; 26320ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang mCurrentModeBar.layout((l + padding), 26420ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang (bottom - top - mCurrentModeBar.getHeight()), 26520ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang (l + padding + iconWidth), 26620ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang (bottom - top)); 26720ff6a12d36dd928e6ccfb96aebf9f6481d15697Chung-yih Wang } 268a72d73cbac59db43d413291e4db66763be08143arepo sync } 269a72d73cbac59db43d413291e4db66763be08143arepo sync} 270