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